CircleCIで下記のように本番用とpre(stg)用で filters
を使ってECS/Fargateをデプロイしているのですが、まったく関係ない特定のディレクトリ(docker,terraform)を修正してマージしてしまうと本番もpreもリリースされてしまいます。(なんだか怖い…)ということもあり、特定のディレクトリに差分があったら circleci step halt
でjobを終了するようにシェルスクリプトを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
workflows: version: 2 deploy_pre_and_rspec: jobs: - rspec - deploy_app_devops_pre: filters: branches: only: develop deploy_prd_and_rspec: jobs: - rspec - deploy_app_devops_prd: filters: branches: only: master |
■shell script/circleci
参考: https://qiita.com/sensuikan1973/items/2f7d04e7ce93305dd2f4
- scripts/circleci/is_changed_directory.sh
1 2 3 4 5 6 7 |
#!/bin/bash DIFF_FILES=(`git diff HEAD^ HEAD --name-only --relative=${1}`) if [ ${#DIFF_FILES[@]} -ge 1 ]; then exit 99 fi |
git diff HEAD^ HEADは1つ前のコミットを確認して、masterにマージしたときはマージコミットの差分で見ています。 @
は配列なので変更があるファイル数で検知しているので、終了ステータスコードで判断しているわけではありません。なので、変更あるファイル数が(戻り値)0以外の場合で1以上ならば99を返して、 circleci step halt
を実行しています。以下のようにCircleCIにはcheckout後に発動するのが良いでしょう。
- .circleci/config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
deploy_app_devops_prd: working_directory: ~/app executor: default steps: - setup_remote_docker - checkout - run: name: check_changed_directory_docker_terraform command: | if ! ~/app/scripts/circleci/is_changed_directory.sh "docker/dev"; then circleci step halt fi \ && \ if ! ~/app/scripts/circleci/is_changed_directory.sh "terraform"; then circleci step halt fi ~省略~ |
- docker/dev,terraformディレクトリに差分あった場合(job終了)
- docker/dev,terraformディレクトリに差分がない場合(そのままデプロイ)
■まとめ
しかし参考にしたのをちゃんと理解してシェルスクリプト書かないとわけがわからないので、一つ一つのコマンドを手動で叩いて確認すると良き!あと運用してみてわかったけど、dockerディレクトリはメンテよくするからterraformディレクトリのみでいいな。
0件のコメント