♾️
GitHub Actionsでブランチ間でのawspecの共通化
概要
以前、CircleCIでawspecを使ったテスト方法を調べました。
今回は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を取得してテストで使えました。
参考
Discussion