AWS CodePipeline(以下、CodePipeline)は GitHub と連携した場合、通常は Push 時にパイプラインが実行されますが、Push 以外のイベント時にパイプラインを実行したい場合もあります。例えば、特定のタグを付けたり、Pull Request 作成時やコメントをつけた場合などです。
Push 以外のイベントでパイプラインを実行したい場合は CodePipeline の Webhook を設定する方法がありますが、イベントのフィルタを書いたり動作検証するのが面倒です。
GitHubのpush以外のWebHookイベントからCodePipelineを発火させる - Qiita
Github の Pull Request がマージされたときに CodePipeline を発火させる - Qiita
そこで本記事は GitHub Actions から CodePipeline のパイプラインを実行する方法を紹介します。GitHub Actions であれば、ワークフローのトリガーを簡単に設定できます。
AWS アクセスキーの発行
GitHub Actions から CodePipeline のパイプラインを実行するための AWS アクセスキーを作成する必要があります。まずは以下の権限で IAM ユーザを作成します。IAM ポリシーはインラインでも管理ポリシーでも構いません。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:<REGION>:<AWS_ACCOUNT_ID>:<PIPELINE_NAME>" ] } ] }
<REGION>
はリージョン名、<AWS_ACCOUNT_ID>
は AWS アカウント ID、<PIPELINE_NAME>
は CodePipeline のパイプライン名に置き換えてください。
今回はパイプライン名を hoge-pipeline
としました。
例: arn:aws:codepipeline:ap-northeast-1:123456789012:hoge-pipeline
GitHub Actions の設定
ここから GitHub Actions の設定をしていきます。すでに Marketplace に公開されている GitHub Actions を使います。
まず、先ほど作成した AWS アクセスキーを GitHub の Secrets に格納します。GitHub リポジトリの [Settings] タグから [Secrets] を選択し、以下の名前で AWS アクセスキーとシークレットキーを保存します。
AWS_PIPELINE_ACCESS_KEY
: AWS アクセスキーAWS_PIPELINE_SECRET_KEY
: AWS シークレットキー
GitHub リポジトリの .github/workflows/codepipeline.yml
(ファイル名は任意)に以下のような設定を入れます。今回は簡単に main ブランチへの Push 時にワークフローを実行するようにしました。このファイルを Commit、Push しておきます。
name: Deploy by Codepipeline on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Trigger AWS CodePipeline # v1.0.7 uses: zulhfreelancer/aws-codepipeline-action@492467f78d67ac2301e55e208326a8e9fbd23284 with: aws-region: 'ap-northeast-1' aws-access-key: ${{ secrets.AWS_PIPELINE_ACCESS_KEY }} aws-secret-key: ${{ secrets.AWS_PIPELINE_SECRET_KEY }} pipeline-name: 'hoge-pipeline'
AWS CodePipeline の設定
このままだと GitHub Actions と CodePipeline の Webhook で二重にパイプラインが実行されてしまうため、CodePipeline で Push 時にパイプラインを実行しないように設定します。
CodePipeline の Source の編集画面を開き、アクションプロバイダーを [GitHub (バージョン 1)] にして、検出オプションを [AWS CodePipeline] にします。
保存時に CodePipeline の Webhook を削除するかの確認がでますので [保存] をクリックします。
aws codepipeline delete-webhook
を実行して Webhook が無いことを確認します。もし残っていたら aws codepipeline delete-webhook
で削除します。
これだけだと、ポーリングによってパイプラインが実行されてしまうため、PollForSourceChanges
を false
にすることでポーリングを無効化します。
現在のパイプラインの設定を JSON ファイルで出力します。
$ aws codepipeline get-pipeline --name hoge-pipeline > pipeline.json
pipeline.json
を編集し PollForSourceChanges
を false
にします。
"configuration": { "Branch": "main", "OAuthToken": "****", "Owner": "ohsawa0515", "PollForSourceChanges": "false", "Repo": "hoge-repo" },
一番下にある metadata
を削除します。
# これを削除 "metadata": { "pipelineArn": "arn:aws:codepipeline:ap-northeast-1:123456789012:hoge-pipeline", "created": "2020-12-21T21:07:11.043000+09:00", "updated": "2021-01-13T20:50:15.671000+09:00" }
aws codepipeline update-pipeline
で更新します。
$ aws codepipeline update-pipeline --cli-input-json file://pipeline.json # 確認 $ aws codepipeline get-pipeline --name hoge-pipeline \ --query 'pipeline.stages[?name==`Source`].actions[].configuration[]' [ { "Branch": "main", "OAuthToken": "****", "Owner": "ohsawa0515", "PollForSourceChanges": "false", "Repo": "hoge-repo" } ]
実行
以上で設定が終わりです。動作確認をします。今回は空コミットして Push します。
$ git commit --allow-empty -m "github actions test" $ git push origin
Actions タブから実行結果を確認できます。