-
Notifications
You must be signed in to change notification settings - Fork 0
自動デプロイ
特に何も考えずにサイト開発をする場合、
- masterへmerge・push
- サーバーにログイン
- git pull することでサイトを更新できますが、毎回サーバーにログインするのも面倒ですし、緊急時にログインできる人がいなければ即効性が失われる可能性もあります。そこで、masterへpushされたら自動的にサーバーにデプロイする設定をしましょう。この自動デプロイのことをContinuous Deploymentと言います。
CircleCIとはCI(Continuous Integration)サービスの一つです。CIとは、自動でテスト・ビルドなどを行うことでミスを早期発見してソフトの品質を高めることです。CIとCDは概念が違いますので注意してください。理工展のサイトではテストを行うほど大きなものを作っているわけではないので、めんどくさいのでCIはやらずにCDのみを行っています。
CIサービスなのにCDもできるのか?と思うかもしれませんが、できます。
まずはログインしましょう。GitHubのアカウントがあれば、簡単にログインすることができます。
CircleCI
CircleCIでは、GitHub上の1つのリポジトリならプライベートでも無料で使うことができます。CDしたいリポジトリで右側の「Set Up Project」ボタンを押します。
次にOSやら言語を選ぶ画面が出てきますが、これを選ぶとそれに合った設定ファイルをcircleCI側が提示してくれます。しかしそれはCI用のファイルなので今回は無視して、「Starg building」ボタンを押します。何も書いていないので当然CIには失敗します。なので設定ファイルを作ってコミットしましょう。
その前に準備をします。一度ビルドを走らせると、JOBSにリポジトリとビルドの詳細が表示されるようになります。対象のリポジトリの名前の右に設定アイコンが表示されるので、それをクリックします。一番左のsettingsを押すと違うものに飛ばされるので間違えないように注意してください!
表示された一覧から「BUILD SETTINGS」->「Environment Variables」を選択します。ここで環境変数の設定をします。これを設定することで、設定ファイルに重要な情報を直書きすることを防ぐことができます。以下の設定をします。
- GCP_COMPUTE_ZONE
サーバーが動いているゾーンです - GCP_PROJECT_ID GCPのプロジェクトIDです。
- GCP_SERVICE_ACCOUNT サービスアカウントキーのjsonファイルをbase64でエンコードしたものです。
- HOST_NAME 対象サーバーのホスト名です。IPかドメインを記述します。
- INSTANCE_NAME サーバーのインスタンス名です。
- PORT SSH接続する際のポート番号です。22番から変えているので環境変数に設定します。
- USER_NAME
接続先サーバーでのユーザー名です。
但し毎回これを設定する必要はなく、右上の「Import Variables」ボタンから、別のプロジェクトより環境変数をコピーしてくることができます。困ったらsite2018の環境変数から全部コピーしてくれば大丈夫です。
サービスアカウントについて軽く説明します。GCPにCircleCIなどの外部サービスを経由してアクセスする場合、サービスアカウントを利用してアクセス権限を取得する必要があります。今回はGCEへのデプロイなので、GCEアクセス権などを取得しています。詳しくはドキュメントを参考にしてください。
次にssh通信するためにRSA秘密鍵を登録しましょう。今度は「PERMISSIONS」->「SSH Permissions」を選択します。
残念ながら別プロジェクトからの秘密鍵のインポートはできないので、毎回作るか何らかの方法をとる必要があります。右上の「Add SSH Key」を押し、ホスト名と秘密鍵を入力したら画像のようにfinger printが表示されます。これは鍵が正しいことを照明するためのもので、あとで使います。
ここまで出来たらあとはファイルを書くだけです。対象のディレクトリ直下に.circleci
フォルダを作ります。頭に.
をつけるのを忘れないように注意!そのフォルダの中にconfig.yml
ファイルを作成し、以下の内容を書きます。
version: 2
jobs:
deploy:
docker:
# only 5MB Linux!
- image: alpine:latest
steps:
# default directory /root/project
- checkout
- add_ssh_keys:
fingerprints:
- "ba:a2:14:b0:cd:84:37:4c:64:8d:95:f0:48:00:27:37"
- run:
name: Get rsync Command
command: |
apk update
apk add rsync openssh
- run:
name: Set Known Host
command: ssh-keyscan -p ${PORT} ${HOST_NAME} >> ~/.ssh/known_hosts
- run:
name: List up Excluding Files
command: |
touch excludes.txt
echo "./.git/" > excludes.txt
echo "./.gitignore" > excludes.txt
echo "./.circleci/" > excludes.txt
echo "./sass/" > excludes.txt
echo "./package.json" > excludes.txt
echo "./*.lock" > excludes.txt
echo "./excludes.txt" > excludes.txt
- run:
name: Create Directory for Deploy
command: mkdir -p /tmp/site2018
- run:
name: Copy Files for Deploy
command: rsync -rva --delete --exclude-from=excludes.txt ./ /tmp/site2018
- run:
name: Deploy
command: |
rsync -avr --delete -e "ssh -p ${PORT}" /tmp/site2018 ${USER_NAME}@${HOST_NAME}:/var/www/rikoten.com
workflows:
version: 2
deploy:
jobs:
- deploy:
filters:
branches:
only: master
ymlはインデントで区別します。スペース一個でエラー吐かれるので注意してください。
全部を説明すると疲れるのでそこそこ省きますが、jobsではcircleCIが行うべきことを羅列しています。stepsブロック以下では、上から順に定義したコマンドを実行していきます。簡単に説明すると、リポジトリに移動し先ほど設定したssh鍵を読み込み、/tmp/site2018
にデプロイしたいファイルをコピーし、rsync
でサーバーにアップロードしています。さらにこのコマンドはmaster
ブランチにpushされた場合のみに起動します。
設定ファイルが書けたらコミットしてpushしましょう。実際に起動するためにはmasterブランチへマージします。