GitHub で CI/CD !
皆さん、CI/CD 回してますか?
テストやらデプロイやらは自動で回すような風潮ができてから早数年。
これまで様々な CI/CD サービスが生まれてきました。
一方、世界で最も大きな開発のプラットフォームである GitHub は、
これまでリポジトリ管理以外の仕組みについては、インテグレ-ションで対応するという姿勢をとっていました。
が、その GitHub がある時期(買収の頃?)を境に、プロジェクト管理(board 機能)等色々な機能を
標準で提供するようになりつつあります。
そんな流れで CI/CD 機能が提供されることになったのが 2018 年の末。
現在はパブリックベータとなって、皆さん使えるようになりました。
ということで、今回はこの GitHub の CI/CD 機能、GitHub Actions を使って
簡単にデプロイ作業をする方法を見ていきましょう!
※ちなみに、 2019/8 頃に、GitHub Actions は大幅な改変が加えられました。
この内容は 2019/9 時点で動作する内容で書いています。
設定してみよう!
GitHub Actions を有効にするにはとても簡単で、
ルートに置いた .github/workflows
ディレクトリの中に yaml ファイルを配置するだけです。
このとき、ファイル名は拡張子が .yml
(または .yaml
) であれば何でも OK。
今回は、laravel (PHP) のアプリケーションをデプロイする想定で実施してみましょう。
前提条件としては、
- 配置先のインスタンスのドメイン: example.com
- 配置先のインスタンスでの、配置に使うユーザー名: john
- 配置先のインスタンス内のディレクトリ: /var/www/app
- 配置先のインスタンスへのログイン方法: SSH 公開鍵認証
鍵の登録
まずは、GitHub から SSH でログインができるように、
SSH の鍵を GitHub 側に登録する必要があります。
とは言ってもとても簡単で、
リポジトリのセッティング画面から設定するだけです。
普通に Settings を開いて、左のリストから Secrets を選べばこのページが開きます。
https://github.com/(ユーザー・グループ名)/(リポジトリ名)/settings/secrets
にアクセスすることでも、このページは開けます。
上の Name の所に適当な名前(今回は SSH_PRIVATE_KEY
)を、
下の Value に鍵の内容をそのまま貼り付けて Add secret ボタンを押すだけで
CI からこの値を使えるようになります。
GitHub Actions 設定ファイル
では引き続き、設定ファイルを書きましょう。
最初に、完成形はこちら。
name: only master branch on: push: branches: - master jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: composer install run: cd api && composer install - name: add permission run: chmod -R g+w api && sudo groupadd -f apache && sudo chown -R :apache api - name: ssh key generate run: echo ”$SSH_PRIVATE_KEY” > key && chmod 600 key env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - name: rsync deploy run: rsync -rptgDvz --delete --exclude-from=api/.rsyncignore -e ”ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no” api/ john@example.com:/var/www/app - name: migrate database run: ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no john@example.com ’cd /var/www/app && php artisan migrate’
上から見ていきましょう。
name: only master branch
ここはそのまま、後からわかりやすいように名前をつけているだけですね。
on: push: branches: - master
ここは、CI を起動するタイミングの条件です。
今回は、push されたとき、すなわちコミットが動いたときに実施するようにしました。
ただし、
on: push:
これだけでは全てのブランチがプッシュされたときにデプロイが走ってしまいますので、
master ブランチが動いたときだけに絞っています。
jobs: deploy: runs-on: ubuntu-latest
ここからが実際の動作について記述するところですね。
実際の動作は jobs:
の後ろに書いていきます。
deploy:
は、これも識別名ですね。自分が分かればどんな名前でも OK。
runs-on: ubuntu-latest
ここの部分は、 CI をどんな環境で実施するかを指定しています。
ubuntu だけでなく、windows や mac も使えるようです。
クロスプラットフォームでテストしたいときには便利ですね。
次の steps:
から、コマンドを書いていきます。
- uses: actions/checkout@v1
これは、自分のリポジトリをチェックアウトするためのものですね。
uses
となっているものは、他の人が予め作ってくれている GitHub Actions の設定を使うためのものです。
基本的にチェックアウトはみんな使うので、このような形で公開されているのですね。
他にも色々公開されているので、興味のある人は是非。
https://github.com/actions
- name: composer install run: cd api && composer install
次は composer を使って、依存関係をインストールしています。
インスタンスに配置してから実施してもいいのですが、
今回は全部ファイル群を用意してから、依存も含めて全てインスタンスと同期させるようにしています。
こうすることで、インスタンスが複数ある場合の差異も出にくくなるということもありますからね。
- name: add permission run: chmod -R g+w api && sudo groupadd -f apache && sudo chown -R :apache api
次に、今回は apache グループで管理がしたかったので、
グループに書き込み権限を付与、apache グループを作成し、全ファイルを apache グループの配下としました。
rsync では同期元と同期先でユーザー名やグループ名が同じになるようにしてくれる機能があるので
(もちろん、この機能を使わない場合は同期先にログインしたユーザーのユーザー名・グループ名になります)
この機能を使う前提で、 apache グループの管理下に置いているのですね。
- name: ssh key generate run: echo ”$SSH_PRIVATE_KEY” > key && chmod 600 key env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
SSH するための鍵を配置しています。
先ほど secrets に登録した内容は SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
のように、
(環境変数名): ${{ secrets.(シークレットに登録した Name) }}
の形にすることで
コマンド内で環境変数として使用できます。
echo "$SSH_PRIVATE_KEY" > key && chmod 600 key
これで、環境変数に格納された鍵の情報を key
ファイルに書き出した後、
key
ファイルのパーミッションを 600 にしています。
(パーミッションがそのままだと SSH するときに失敗するため)
- name: rsync deploy run: rsync -rptgDvz --delete --exclude-from=api/.rsyncignore -e ”ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no” api/ john@example.com:/var/www/app
いよいよ実際にデプロイですね。
とは言っても、普通に rsync コマンドをたたいているだけです。
ちなみに、大切なファイルまで削除されたりしないように、必ず dry-run して、動作を確かめてから実施してください。
dry-run は -n
または --dry-run
オプションで実施できます。
今更ですが、自己責任でお願いいたしますね。
詳しいことは SSH や rsync の解説を別途参照していただきたいですが、
known_host の設定は無視するようにしています。
セキュリティ的にきちんとやりたい場合は、別途フィンガープリントを secret に配備して、
うまいこと設定してたいだければ。
- name: migrate database run: ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no john@example.com ’cd /var/www/app && php artisan migrate’
最後に、laravel の機能でデータベースのマイグレーションを実行します。
デプロイ時に一緒にマイグレーションを走らせることで、本当に単純にコードを push するだけで
全ての設定が勝手に実施されていきます。
とても便利ですね。
以上で、デプロイ完了となります。
GitHub Actions の CI/CD を活用しよう!
今回はデプロイの設定方法をご紹介いたしました。
もちろん、テストを回したりすることもできますし、
テストの結果、エラー終了したりすると、きちんと GitHub の方に反映されるようになっています。
プライベートでも無料枠があったり、パブリックだと無制限だったりととても使い勝手も良いので、
是非使ってみてくださいね。