😀

GitHub Actionsでpulumi previewを実行してPRコメントを追加する

2024/02/26に公開

きっかけ

個人開発でPulumiのCI/CDにPulumi Cloudの有料プランTeamを利用していたところ、
リソース数が増えて無料枠をオーバーしてしまった。(オーバーした時点で月💲18ほど)
開発中はなるべく節約したいので、Pulumi CloudのCI/CDをGitHub Actionsに移行することに。

やりたいこと

GitHub Actionspulumi previewを実行し、PRコメントで実行結果を確認できるようにしたい

前提条件

  • Pulumiの言語はTypeScript
  • Pulumiのstate管理にはS3バケットを利用
    • pulumi stack initでS3にPulumiのstackが作成されていること
  • GitHubからAWSへの認証はOIDCを利用、ロールのARNを取得しておく

上記の細かい設定は別記事に書く予定
https://zenn.dev/wac/articles/3fba8f5e64211a

ymlファイルを作成

下記のように.github/workflows/pulumi-preview.ymlを作成する

name: Pulumi Preview
run-name: Pulumi Preview
on:
  pull_request:
    paths:
      - "<Pulumiファイルのあるディレクトリ>/**" # 任意
jobs:
  preview:
    name: Preview
    runs-on: ubuntu-latest
    permissions:
      id-token: write # OIDCを利用する時に必要
      contents: read
      pull-requests: write # Pull Request内にコメントを残すときに必要
    defaults:
      run:
        working-directory: <Pulumiファイルのあるディレクトリ> # 任意
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20" # 16のままだとwarningが出る
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ${{ vars.AWS_REGION }} # AWSのリージョン
          role-to-assume: ${{ vars.AWS_ASSUME_ROLE_ARN }} # OIDCのロール
      - run: npm install
      - uses: pulumi/actions@v5
        env:
          PULUMI_CONFIG_PASSPHRASE: ${{ secrets.PULUMI_CONFIG_PASSPHRASE }} # `pulumi stack init`で設定した値
        with:
          command: preview
          refresh: true # previewの前にrefreshを行いたい場合に設定
          stack-name: ${{ vars.PULUMI_STACK_NAME }}
          cloud-url: ${{ vars.PULUMI_BUCKET_URL }} # s3://<バケット名>を指定
          work-dir: <Pulumiファイルのあるディレクトリ>
          comment-on-pr: true # Pull Request上にコメントを残すかどうか
          github-token: ${{ secrets.GITHUB_TOKEN }} # comment-on-prがtrueの時に必要

まとめ

上記の設定の後にPull Requestを作成するとGitHub Actionspulumi previewが実行されて、結果がPRコメントに追加されるようになる。

参考文献

https://github.com/pulumi/actions

Discussion