GitHub Actions
コンテキストの参照には、中間環境変数を利用する
コンテキストをシェルコマンドへ直接埋め込むのはアンチパターン
特殊文字、トークン分割やパス名展開を抑止する
code: workflow.yaml
name: Intermediate environment variables
on: push
jobs:
print:
runs-on: ubuntu-latest
env:
ACTOR: ${{ github.actor }} # コンテキストの値を環境変数へセット
steps:
- run: echo "${ACTOR}" # 環境変数経由でコンテキストのプロパティを参照。ダブルクォーテーションで囲む
GITHUB_ ENV環境変数よりもGITHUB_ OUTPUT環境変数を利用する
GITHUB_ ENV環境変数
ステップ間の依存関係が分かりづらくなる
事実上のグローバル変数
GITHUB_TOKEN
GitHub APIの利用に必要なクレデンシャル
ghコマンド、アクション(actions/checkout等)
ワークフロー開始時に自動生成され、終了すると自動的に破棄
パーミッションを明示的に定義していない場合、ソースコードの読み込みは暗黙的に許可される
明示的にパーミッションを記述した場合は、ソースコードの読み込みも明示的に許可する必要がある
制約
ワークフロー実行リポジトリ以外のアクセスは許可されない
GITHUB_TOKEN起因のイベントではワークフローは起動しない
Actionsからプルリクエストを作成しても、そのプルリクエストではワークフローは起動しない
GITHUB_TOKENの制約に縛られたくない場合のクレデンシャル
GitHub Appsトークンを利用すべき
有効期限が短く、セキュア
秘密鍵の有効期限はない
実行可能なAPIやアクセス可能なリポジトリを細かく制御可能
利用を避けるべきクレデンシャル
デプロイキー
一個人が払い出したクレデンシャル
Fine-grainedパーソナルアクセストークン
有効期限が存在し、長期運用には向かない
パーソナルアクセストークン( classic)
最悪の選択肢
GitHub Actionsではソースコードへのアクセスに、明示的なチェックアウトが必要
全てのワークフローにタイムアウトを設定すべき
timeout-minutesキーを使うと、分単位でタイムアウトを指定できる
デフォルトのタイムアウトは6時間
デフォルトシェルを設定すべき
トップレベルで指定してしまう
code: actions.yaml
defaults:
run:
shell: bash # ワークフローで使うシェルをまとめて指定する
省略時はbash
ただし、省略時と指定時で起動オプションが変わる
省略時の起動オプションではパイプエラーが拾えない
課金
プライベートリポジトリは使用時間で課金される
使用時間は分単位で切り上げられる
1秒でも実行すると1分実行した扱いとなる
matrix利用時は注意
GitHub Actionsではクラウドプロパイダの一時クレデンシャルを利用可能
OICDトークン
実態はIDトークン
クラウドプロパイダの認証アクションを利用する
ワークフローレベルでのパーミッションを無効化する
code: workflow.yaml
permissions: {}
各ジョブへ都度、必要なパーミッションを定義する
pull_request_targetイベントは利用しないべき
pull_requestイベントは、forkプルリクエストの場合はいくつかの制限がかかる
コード変更不可、Secrets読み込み不可
pull_request_targetはこれが回避できてしまう
GitHub CI/CD実践ガイド