GitHub Actionsメモ
概要
GitHub Actionsでよく使うもしくは便利だなと思ったアクションを書いていく。
GitHub Actionsまわりで気になったことをメモしておく
アクションの検索
アクションは以下から検索できる。
actions/github-script
ワークフロー内からGitHub APIを呼びだせる。
ジョブの結果をPRのコメントに返したりみたいなことがサクッとできる。
actions/setup-node
node.jsの実行環境を提供してくれる。
以下のように書くだけでライブラリのキャッシュ、テスト、lintを実行できる。lintのエラーはGithub ActionsのAnnotationとして返してくれるのでPRからも確認しやすい。
steps:
- name: checkout
uses: actions/checkout@v3
- name: eslint
uses: actions/setup-node@v3
with:
node-version: "xx.xx.x"
cache: 'npm'
- run: npm install
- run: npm run test
- run: npm run lint
aws-actions/configure-aws-credentials
AWSの認証情報とリージョンを設定するのに使う。よく使う。
認証情報の取得にはアクセスキー/シークレットキーやOIDCプロバイダーを使ってロールを引き受ける方法がある。OIDCプロバイダーの使用が推奨されている。
以下のようにすることでロールを引き受けることができる。
role-session-name
に実行者(github.actor
)を渡すことで、IAMロール側のConditionで実行者を制限出来たりもする。
GitHub Actionsをデプロイに使用していると実行者の制御が課題になるので、↑が解決案の一つになる。
- uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: us-east-1
role-to-assume: ${{ secret.AWS_ROLE_ARN }}
role-session-name: ${{ github.actor }}
technote-space/get-diff-action
git diffにPATTERNS
やFILES
にマッチしたファイルがあるかをチェックできる。
差分を見ていてるのでcheckoutする際にfetch-depth: 2
とする必要がある。
マッチしたファイルはGIT_DIFF
に入る。
処理を切り出せばon.<push|pull_request|pull_request_target>.paths
でも代替できそう。
- uses: actions/checkout@v2
with:
fetch-depth: 2
- uses: technote-space/get-diff-action@v6
id: diff
with:
PATTERNS: |
packages/**/*.php
!packages/**/*Tests.php
- if: env.GIT_DIFF
run: echo ${{ env.GIT_DIFF }}
意図せず挙動が変わるのを防ぐためGitHub-hosted runnersのバージョンは固定しておいた方が良い
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
20220608時点でサポートされているのは以下
CircleCIのaws_authに相当する機能がなくパスワード認証しか出来ないみたいなので、ECRのプライベートリポジトリを使いみたいな場合は以下のようにジョブを2段階にする必要がある
jobs:
login:
timeout-minutes: 1
runs-on: ubuntu-20.04
outputs:
password: ${{ steps.get_ecr_password.outputs.password }}
steps:
- name: checkout
uses: actions/checkout@v3
- name: configure aws credentials
# awsの認証をする
- name: get ecr password
id: get_ecr_password
# passwordを後続のジョブに渡す
run: echo "::set-output name=password::$(aws ecr get-login-password)"
build:
timeout-minutes: 3
needs: login
name: build
runs-on: ubuntu-20.04
container:
image: xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/xxxxxxxx:xxxx
credentials:
username: AWS
password: ${{ needs.login.outputs.password }}
timeout-minutes
は必ず設定する
ワークフローの処理内容自体に問題がなくても、GitHub Actions側の調子が悪くジョブの実行時間が延びたりするケースもある