【読書メモ】GitHub CI/CD実践ガイド
読んでいき
中間環境変数(intermediate environtment variable)
コンテキストをシェルコマンドで扱う際のテクニック
環境変数経由でコンテキストを渡してクォートする
例
- name: Check PR title
env:
TITLE: ${{ github.event.pull_request.title }}
run: |
if [[ "$TITLE" =~ ^octocat ]]; then
echo "PR title starts with 'octocat'"
exit 0
else
echo "PR title did not start with 'octocat'"
exit 1
fi
利点
- シェルコマンドの実行に意図しない影響を与えないようにできる
- スクリプトインジェクションの対策になる
タイムアウト
デフォルトが360分(6時間)になっている
timeout-minutes
Default: 360
すべてのワークフローで、適切な値を設定したほうがよさそう
デフォルトシェルの指定
指定せずともデフォルトで下記のようにBashが起動するが、
bash -e {0}
shellオプションで明示的にBashを指定すると、pipefailオプションが有効化されて下記のようにBashが起動する
bash --noprofile --norc -eo pipefail {0}
すべてのワークフローで、指定したほうがよさそう
Concurrency
同一ワークフローの多重起動を抑制できる
例
on:
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
感想
ワークフローに、同一ワークフローが動いていたらそれをキャンセルする処理を入れてたけど、Concurrencyを使えば不要そう
てか利用してたやつ今見たらREADMEにもその旨が書いてるな
You probably don't need to install this custom action.
Instead, use the native concurrency property to cancel workflows
フレーキーテスト(Flaky tests)
なぜかよく分からないけどもたまに落ちるテストのこと
「同じコードでpass/failどちらの結果にもなってしまう」テストの呼び方
flaky=当てにならない、という意味
感想
これ稀によくある
その時々は面倒くさくて、ついリトライでごまかしてしまいがち
ただ意外とすぐ修正できることが多くて、直せば快適になるのでサボらないようにしたい
フラジャイルテスト
ソフトウェアを少し変化させるたびに大量のテストを変更しなければならない状況
感想
これやってしまったことあって、とてもツラかった
実装の詳細ではなくて、振る舞いをテストするの強く意識したい
本書でも紹介されてるこの本いつか必ず読む
てかフレーキーテストといい、これにもフラジャイルテストという名前があるのね
Bashのトレーシングオプション
「どんなコマンドを実行したか」「その結果はどうなったか」だけ知りたいケースで有効
set -x
アノテーション
ジョブページに任意のメッセージを出力できる
通知メッセージ
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
警告メッセージ
echo "::warning file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
エラーメッセージ
echo "::error file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
ジョブサマリー
シンプルなメッセージなら、アノテーションで十分
テーブルやリストなど、凝った出力にしたいときに有効なのがジョブサマリー
GITHUB_STEP_SUMMARY
環境変数にマークダウンテキストを書き出す
- name: Generate list using Markdown
run: |
echo "This is the lead in sentence for the list" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY # this is a blank line
echo "- Lets add a bullet point" >> $GITHUB_STEP_SUMMARY
echo "- Lets add a second bullet point" >> $GITHUB_STEP_SUMMARY
echo "- How about a third one?" >> $GITHUB_STEP_SUMMARY
Environments
環境ごとに異なるデータを管理できる
name: Deployment
on:
push:
branches:
- main
jobs:
deployment:
runs-on: ubuntu-latest
environment: production
steps:
- name: deploy
# ...deployment-specific steps
下記を設定することで、
- Environment variables
- Environment secrets
下記のように参照できる(通常のVariablesやSecretsと同じ方法)
env:
USERNAME: ${{ vars.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
amazon-ecs-deploy-task-definition の wait-for-service-stability
こう指定すれば、コンテナの入れ替えを待てるとのこと
wait-for-service-stability: true
感想
知らんかった…自前のシェルスクリプトで待つ処理やってた
指定できるパラメータよく見るようにしよう
continue-on-error
下記のように指定すると、エラーを握りつぶして次の処理へ進ませられる
continue-on-error: true
複数のジョブを並列実行している際、1つのジョブがコケたときに他のジョブも止まってしまう
これが不都合なケースにおいて有効