GitLab CI にプッシュしたものを GitHubに出力する | from: Leow Kah Man - Tech Blog

法律: IT メディア 解説記事 GitLab CI フノス(訳者)

  今僕は、GitLabでウェブサイトを公開するためにGitLab CIランナーを使っています。でも、今度はそれをGitHub pagesでも公開できるようにしてみたい。
 もしも、ネットのコンテンツを、場面に応じて別のDNSを使い分けて公開できたら、便利そうだと考えました。
 CIにミラーしたコンテンツを貼り付ける設定を加えてみたら、実現可能な気がしたのです。

 

  動機について

  SLAのほかに、無料で使えるサービスプロバイダといえば、 GitLab PagesとGitHub Pagesの2つが考え付きます。どちらのプロバイダも、これまでの経歴を見る限りでは、比較的サービスが安定しており、信用においては文句なしです。どうしてあまり目覚ましい評判が聞こえてこないのが、不思議なくらいですね。
 この2つを連携させることで、さらなる業務効率化と高いパフォーマンスが獲得できるのでは、というのが今回の動機です。

  手っ取り早い方法が、コンテンツのミラーを張り付ける方法で、これがDNSを使い分けるのに効果的なようです。
 DNSについては、CloudFlareのorange cloudを使って、トラフィックを別のDNSに転送する動作の高速化と、管理の利便性を図りました。

  これから皆さんに、GitLab CIで「GitLabでコンテンツのビルドをしてからGitHubで公開する」設定をお教えします。サードパーティーのDNSトラフィックを設定したり、いざという時のフェイルオーバーなどの手段に応用が利きそうですので、ぜひお役立てください。
 

  前提条件

  まず、Gitに関する基本的な知識があること。GitLab と GitHub の両方にレポジトリを持っていること。この場合、レポジトリはからの状態から開始しても構わない。

 以下の設定は、僕が以前に執筆した記事『僕がHugo静的サイト・ジェネレータをGitLabで使うときにしたCI設定
の、.ymlファイルのすぐ下に追加したものです。前の記事もよろしくなのです。
 

 GitLab CI YAMLの設定

 

===============================
image: node:6.11.2-alpine
before_script:
- apk update && apk add openssl ca-certificates git
- npm install
- PATH=$(npm bin):$PATH
- hugo version
pages:
script:
- npm run build
- git clone --depth 1 https://<username>:$GITHUB_ACCESS_TOKEN@github.com/<username>/<username>.github.io.git
- mkdir <username>.github.io.new
- cp -a <username>.github.io/.git <username>.github.io.new/.git
- cp -a public/* <username>.github.io.new
- cd <username>.github.io.new
- git config user.email "<GitHub email address>"
- git config --global user.name "<Your name>"
- git add -A
- git diff-index --quiet HEAD || git commit -m "$CI_SERVER_NAME $CI_PIPELINE_ID"
- git push
artifacts:
paths:
- public
only:
- master
===============================

 設定の意味:

 

  1. apk add git - 今回採用したDockerイメージには、まだGitがインストールされていないため、Gitを導入するコマンドが必要。
  2. git clone --depth 1 - GitHubレポジトリの最新バージョンをクローンしてくる。
  3. このレポジトリは、<username>.github.ioにダウンロードされる。
    $GITHUB_ACCESS_TOKEN は、GitLabの秘密変数で、GitHubアカウントにアクセスする際にトークンの役割を担う。GitHub用トークンを作成すると(トークン名は任意でつけられる)、「public_repo」へのアクセスが可能になる。
    GitLab Settings > Pipelines」にて、「GITHUB_ACCESS_TOKEN」という名前の秘密変数を作成し、それに対応するものとしてアクセストークンをコピペすると確実である。
  4. mkdir <username>.github.io.new - 発表する前段階に使われる一時フォルダ
  5. cp -a <username>.github.io/.git <username>.github.io.new/.git - 「.git」フォルダの内容を一時フォルダにコピーする内容。
    ディレクトリをクローンする操作とはまた違うことに注意。
  6. cp -a public/* <username>.github.io.new - Hugo静的サイトジェネレータは、本来「public」ディレクトリに出力するように設定されているが、これは出力ディレクトリの内容を一時ディレクトリにコピーする内容。
  7. cd <username>.github.io.new - カレントディレクトリを、最新のコンテンツが封入された一時ディレクトリに差し替えるコマンド。
  8. git config user.email "<GitHub email address>" - GitHub登録しているメルアドを入れる。
  9. git config --global user.name "<Your name>" - GitHubのユーザー名を入れる。
  10. git add -A - (新規作成したファイル、新たな変更、削除した部分等)全ての変更をレポジトリに反映させる
  11. git diff-index --quiet HEAD || git commit -m "$CI_SERVER_NAME $CI_PIPELINE_ID" - 変更をコミットする。
    ここでpublicディレクトリに変更があったかどうかが判別される。なので「.gitlab-ci.yml」は、「public」ディレクトリに置かないように注意。
    コミットがあったときには、GitLabサーバー側に、プロジェクト名とパイプラインIDが明記されたコミットメッセージが送付される。
  12. git push - コミットされた変更を、GitHubにプッシュする。

  この設定を追加したら、早速GitLabにプッシュしてみて、きちんとGitHubにプッシュがされるかどうかを確認することをお勧めします。

 

  トラブル・シューティング

  GitHub CNAME file

  独自ドメインを使ってGitHubにコンテンツを公開する時には、GitHub用のCNAMEファイルを作成しておかなくてはなりません。
 

  CloudFlare SSLがエラーを起こす

  DNSレコードをに切り替える(<username>.github.ioが登場したあたり)際に、CloudFlareのSSLレベルを「Full (strict)」を「Full」に引き下げておくと、うまくいく場合があります。

 

  チップをください。

  この記事はお役に立ちましたか?もしよければ、僕にお茶代を渡していただけると嬉しいです。励みになります。(原文ページからをおすすめします。)
www.paypal.me/leowkahman/12
bitcoin:14vH7vDj7eyvvc7mxCkrgTx2HUntpeKhAn
www.leowkahman.com/images/bitcoin.png
 

 

2017-12-11 23:59:39 / Hnoss
原文サイトを表示
公開ノート

※CIのコードはMIT Licenseだそうです。

[ 原文 ] https://www.leowkahman.com/2017/09/09/gitlab-ci-push-output-to-github/
Creative Commons License この作品は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。
クリエイティブ・コモンズ・ライセンス