♾️

GitHub Actionsでブランチ間でのawspecの共通化

2024/04/29に公開

概要

以前、CircleCIでawspecを使ったテスト方法を調べました。
https://zenn.dev/jnxjez/articles/aa4b441571ef91

今回はCircleCIではなく、GitHub Actionsを使用します。
また、GitHubのブランチによって構築する環境が異なる場合を想定して、テストファイル内でブランチに応じたパラメータを使用してawspecを実行する方法を調べました。

GitHub ActionsがAWSにアクセス可能とするためのOIDCの設定については、本記事では割愛します。

結論

GitHubでは規定の環境変数が用意されていて、今回のケースだとGITHUB_REF環境変数が使えます。
GITHUB_REF環境変数には、pushの場合はpush先のブランチ、pull_requestの場合はマージ先のブランチが設定されます。
テストファイルはRubyで記述されるので、以下のようにしてブランチ名を取得できます。

ENV['GITHUB_REF'].split('/').last

ファイル構成

% tree -aFI .git 
./
├── .github/
│   └── workflows/
│       └── test-awspec.yml
├── Gemfile
└── awspec/
    ├── .rspec
    ├── Rakefile
    ├── reports/
    │   └── .keep
    └── spec/
        ├── .gitignore
        ├── spec_helper.rb
        └── vpc_spec.rb

5 directories, 8 files

設定方法

ワークフローファイル

ワークフローファイル(test-awspec.yml)は長いので折りたたんでいます。
test-awspec.yml
name: Run awspec tests

run-name: Run awspec tests

on:
  push:
    branches:
      - test
      - main

permissions:
  id-token: write
  contents: read
  issues: read
  checks: write
  pull-requests: write

jobs:
  test-vpc:
    runs-on: ubuntu-22.04

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-1
          role-to-assume: ${GitHub ActionsからAWSにアクセスするためのIAM RoleのARN}

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.1.4

      - name: Install dependencies
        run: |
          gem install bundler
          bundle install

      - name: Run awspec tests for my-vpc
        run: |
          export AWS_REGION=ap-northeast-1
          cd ./awspec
          bundle exec rake spec

      - name: Publish Test Results
        uses: EnricoMi/publish-unit-test-result-action@v2
        if: always()
        with:
          files: /home/runner/work/CfnTest/CfnTest/awspec/reports/awspec.xml

今回の本題ではないですが、.rspecファイルに以下を設定しています。

--no-color
--format RspecJunitFormatter
--out /home/runner/work/CfnTest/CfnTest/awspec/reports/awspec.xml

awspecの結果をJUnit形式で出力し、EnricoMi/publish-unit-test-result-actionを使って以下のようにGitHub Actionsにawspecの結果を出力しています。

テストファイル

vpc_spec.rb
require 'spec_helper'

# GITHUB_REFからブランチ名を取得
branch_name = ENV['GITHUB_REF'].split('/').last

check_vpc_name = {main: 'TestVPC', test: 'test-vpc'}
check_vpc_id = {main: 'vpc-052218b0ffdddd2c0', test: 'vpc-09e6117e80d2b3221'}

# どのVPCを対象にテストしているか判別するために出力
puts "branch_name = " + branch_name
puts "check_vpc_name[branch_name.to_sym] = " + check_vpc_name[branch_name.to_sym]

describe vpc(check_vpc_name[branch_name.to_sym]) do
  it { should exist }
  it { should be_available }
  its(:vpc_id) { should eq check_vpc_id[branch_name.to_sym] }
end

GITHUB_REF環境変数を参照してbranch_nameにブランチ名(main, test)を取得します。

branch_name = ENV['GITHUB_REF'].split('/').last

環境によって異なるテストを実施するパラメータをハッシュのkeyにブランチ名を指定して定義します。

check_vpc_name = {main: 'TestVPC', test: 'test-vpc'}
check_vpc_id = {main: 'vpc-052218b0ffdddd2c0', test: 'vpc-09e6117e80d2b3221'}

check_vpc_nameやcheck_vpc_idを使って、環境に応じたテストを実施します。

describe vpc(check_vpc_name[branch_name.to_sym]) do
  it { should exist }
  it { should be_available }
  its(:vpc_id) { should eq check_vpc_id[branch_name.to_sym] }
end

結果

testブランチはtest-vpc、mainブランチはTestVPCを取得してテストで使えました。

参考

https://docs.github.com/ja/actions/learn-github-actions/variables#default-environment-variables

Discussion