Closed9

GitHub Actionsメモ

k_ik_i

概要

GitHub Actionsでよく使うもしくは便利だなと思ったアクションを書いていく。
GitHub Actionsまわりで気になったことをメモしておく

k_ik_i

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

https://github.com/marketplace/actions/setup-node-js-environment

https://github.com/actions/setup-node

k_ik_i

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 }}

https://github.com/marketplace/actions/configure-aws-credentials-action-for-github-actions

https://github.com/aws-actions/configure-aws-credentials

k_ik_i

technote-space/get-diff-action

git diffにPATTERNSFILESにマッチしたファイルがあるかをチェックできる。
差分を見ていてるので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 }}

https://github.com/marketplace/actions/get-diff-action

https://github.com/technote-space/get-diff-action

k_ik_i

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 }}
k_ik_i

timeout-minutesは必ず設定する
ワークフローの処理内容自体に問題がなくても、GitHub Actions側の調子が悪くジョブの実行時間が延びたりするケースもある

このスクラップは2023/07/23にクローズされました