GithubのReleaseを使う
GithubのRelease機能を使ったことある人はいますでしょうか?
これまでブランチをdevelopment, staging, productionに切って、それぞれに対応するデプロイ環境にリリースするようにしていたのですが、仕事ではフロントエンドとサーバーサイドの開発をそれぞれ別リポジトリで管理しており、デプロイしたバージョンに何を入れたか忘れてしまったり、コミット履歴長すぎて見る気しなかったりして、リリースノートにすべてまとめたいと思い、今回はGithubのReleaseを公開したらCircleCIでデプロイまで走る方法を調べました。
基本的な実装方法は、ここを参考にしました。
https://qiita.com/oohira/items/09aa91cc01109f8d053b
デプロイには以下の条件を設定しました。
- リポジトリのブランチはmasterブランチのみを使用する
- masterブランチにコミットされたら、develop環境にデプロイする
- GithubのReleaseでRCバージョンのタグ(ex. 0.1.0-rc1)が打たれたら、staging環境にデプロイする
- GithubのReleaseでリリースバージョンのタグ(ex. 0.1.0)が打たれたら、production環境にデプロイする
- sandboxブランチにコミットされたら、sandbox環境にデプロイする(masterブランチにマージする前に実験できるお遊びサーバーを追加しました)
対象のブランチ&タグでビルドが走るようにする
要点だけまとめると、.circleci/config.yml
に以下の点に気をつけて書くだけでOKです。
version: 2
jobs:
build:
docker:
- image: circleci/node:8.15.1
steps:
- checkout
- deploy:
name: deploy build artifact
command: |
if [[ "${CIRCLE_TAG}" =~ ^[0-9]+\.[0-9]+\.[0-9]+\-rc[0-9]+$ ]]; then
echo "Deploy to staging"
elif [[ "${CIRCLE_TAG}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Deploy to production"
else
if [ "${CIRCLE_BRANCH}" == "master" ]; then
echo "Deploy to development"
elif [ "${CIRCLE_BRANCH}" == "sandbox" ]; then
echo "Deploy to sandbox"
else
fi
fi
環境変数のCIRCLE_TAG
が設定してある場合、CIRCLE_BRANCH
にはブランチ名が入ってこないため、タグで判定したあとにブランチで判定しています。
念の為補足ですが、CIRCLE_BRANCH
が設定してある場合、CIRCLE_TAG
は空になっています。
workflows:
version: 2
build-and-deploy:
jobs:
- build:
filters:
tags:
only:
- /^[0-9]+\.[0-9]+\.[0-9]+\-rc[0-9]+$/
- /^[0-9]+\.[0-9]+\.[0-9]+$/
branches:
only:
- /^sandbox$/
- /^master$/
- deploy:
requires:
- build
filters:
tags:
only:
- /^[0-9]+\.[0-9]+\.[0-9]+\-rc[0-9]+$/
- /^[0-9]+\.[0-9]+\.[0-9]+$/
branches:
only:
- /^sandbox$/
- /^master$/
requiresで指定している前処理でfilterを設定しているだけだと、その後の処理は実行されないため、タグですべての処理に実行してほしい処理全てにfilter設定を書く必要があります。