Open13

【読書メモ】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

https://docs.github.com/ja/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable

利点

  • シェルコマンドの実行に意図しない影響を与えないようにできる
  • スクリプトインジェクションの対策になる
ゆうやゆうや

デフォルトシェルの指定

指定せずともデフォルトで下記のようにBashが起動するが、

bash -e {0}

shellオプションで明示的にBashを指定すると、pipefailオプションが有効化されて下記のようにBashが起動する

bash --noprofile --norc -eo pipefail {0}

https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#defaultsrunshell

すべてのワークフローで、指定したほうがよさそう

ゆうやゆうや

Concurrency

同一ワークフローの多重起動を抑制できる

on:
  push:
    branches:
      - main

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#concurrency

感想

ワークフローに、同一ワークフローが動いていたらそれをキャンセルする処理を入れてたけど、Concurrencyを使えば不要そう

てか利用してたやつ今見たらREADMEにもその旨が書いてるな

You probably don't need to install this custom action.
Instead, use the native concurrency property to cancel workflows

https://github.com/styfle/cancel-workflow-action

ゆうやゆうや

フレーキーテスト(Flaky tests)

なぜかよく分からないけどもたまに落ちるテストのこと

「同じコードでpass/failどちらの結果にもなってしまう」テストの呼び方
flaky=当てにならない、という意味

https://qiita.com/seigot/items/bec2c934b762a2f50821

感想

これ稀によくある
その時々は面倒くさくて、ついリトライでごまかしてしまいがち
ただ意外とすぐ修正できることが多くて、直せば快適になるのでサボらないようにしたい

ゆうやゆうや

フラジャイルテスト

ソフトウェアを少し変化させるたびに大量のテストを変更しなければならない状況

https://gihyo.jp/dev/serial/01/savanna-letter/0008

感想

これやってしまったことあって、とてもツラかった
実装の詳細ではなくて、振る舞いをテストするの強く意識したい

本書でも紹介されてるこの本いつか必ず読む
https://book.mynavi.jp/ec/products/detail/id=134252

てかフレーキーテストといい、これにもフラジャイルテストという名前があるのね

ゆうやゆうや

アノテーション

ジョブページに任意のメッセージを出力できる

通知メッセージ

echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-a-notice-message

警告メッセージ

echo "::warning file=app.js,line=1,col=5,endColumn=7::Missing semicolon"

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-a-warning-message

エラーメッセージ

echo "::error file=app.js,line=1,col=5,endColumn=7::Missing semicolon"

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-an-error-message

ゆうやゆうや

ジョブサマリー

シンプルなメッセージなら、アノテーションで十分
テーブルやリストなど、凝った出力にしたいときに有効なのがジョブサマリー

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

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary

ゆうやゆうや

Environments

環境ごとに異なるデータを管理できる

name: Deployment

on:
  push:
    branches:
      - main

jobs:
  deployment:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: deploy
        # ...deployment-specific steps

https://docs.github.com/ja/actions/deployment/targeting-different-environments/using-environments-for-deployment

下記を設定することで、

  • Environment variables
  • Environment secrets

下記のように参照できる(通常のVariablesやSecretsと同じ方法)

env:
  USERNAME: ${{ vars.USERNAME }}
  PASSWORD: ${{ secrets.PASSWORD }}