Semaphore(CI/CD)でテスト中に出力されたファイルをS3にアップロードしてみた
SmaphoreはクラウドのCI/CDツールです。 ざっくりいってしまえばTravis CIやCircleCIのようなツールとなります。
以下の記事にて初期のセットアップし、GitHubと連携させてコードの変更ごとにテストを実行しました。
この時に、テスト中に出力されたレポートファイルはどうやって見ればいいんだろう?という疑問が残りましたので、本記事ではCIのコマンドでレポートをS3にアップロードしてみます。
やってみた
S3側の設定
バケットを作成する
レポートの出力先となるバケットを作成します。 HTTP経由レポートを確認したいので、Static website hostingを有効化しました。
IAM Policyを作成する
aws s3 sync
でS3にファイルをアップロードするため、以下のPolicyを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::semaphore-test-inaba", "arn:aws:s3:::semaphore-test-inaba/*" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" } ] }
PutObject
,ListBucket
,PutObjectAcl
を指定しているStatementのResourceは、先に作成したバケットと、バケットのオブジェクト全てを指定します。
aws s3 sync
に必要なActionは以下を参考にしました。
AWS IAM POLICY FOR ALLOWING S3CMD TO SYNC TO AN S3 BUCKET
IAM Userを作成する
ユーザーを作成します。CLIを使うので、「プログラムによるアクセス」にチェックを入れます。
先ほど作成したPolicyをアタッチし、ユーザーの作成を完了します。
アクセスキーID,シークレットアクセスキーはSemaphoreに設定するのでメモしておきます。
Semaphore側の設定
credentialをアップロードする
IAM UserのアクセスキーID,シークレットアクセスキーを設定します。
Semaphoreでは、コマンド実行時に使用するファイルをSemaphore側に設定することができます。
.aws/credentials
ファイルをSemaphore側に配置し、コマンドでファイルを読み込んで使用することでAWSとの接続を行います。
Projects Settings -> Configration Filesを選択肢し、File PathとContentを指定します。
aws_access_key_idにはIAMユーザのアクセスキーIDを、aws_secret_access_keyにはシークレットアクセスキーを指定します。
設定したらEncrypt fileにチェックを入れてファイルを保存します。
コマンドを設定する
After Jobに以下のコマンドをそれぞれ指定します。
設定したAWSのcredentialsを、AWS_SHARED_CREDENTIALS_FILEに指定します。
AWS CLIで使える認証情報とオプションの設定方法まとめ | Developers.IO
export AWS_SHARED_CREDENTIALS_FILE=/home/runner/.aws/credentials
S3にレポートを連携します。ここでは連携対象のディレクトリをbuild/reports/tests/test
としています。
レポートが一箇所にまとまっていない場合は、連携以前のコマンドで一箇所にファイルをまとめてから一度に連携すると整理しやすいと思います。
環境変数が別途設定可能なので、ファイルをまとめる場合パスを変数として設定しておくと良いと思います。
aws s3 sync build/reports/tests/test s3://semaphore-test-inaba/$BRANCH_NAME/$SEMAPHORE_BUILD_NUMBER --acl=public-read --delete --exclude '.git/*'
最後にS3側のURLを出力します。ビルド結果からテストレポートにアクセスしやすくするために設定しています。
echo https://s3-us-west-2.amazonaws.com/semaphore-test-inaba/$BRANCH_NAME/$SEMAPHORE_BUILD_NUMBER/index.html
ここでは、ビルドごとに出力先が分かれるよう、バケット名/ブランチ名/ビルド番号/index.html
にファイルをアップロードしています。
$BRANCH_NAME
や$SEMAPHORE_BUILD_NUMBER
はデフォルトで使える環境変数です。
Available Environment Variables - Semaphore
ビルドを実行する
ビルドを実行すると、それぞれのコマンドが正常に完了しました。
出力されたURLにアクセスすると、テストのレポートが確認できました。
デプロイ機能について
コマンド以外にデプロイのための機能があり、こちらはGUIでデプロイ先などを選択していくだけでS3や、ElasticBeanstalk、Heroku、その他のプラットフォームにアプリケーションをデプロイ(≒アップロード)することができます。 最初はこちらの機能でレポートのアップロードを試し問題なく動いたのですが、設定上「あらゆるコミット」に対してデプロイを実行することができません。
「特定のブランチ」が変更された際にデプロイ、という動作になるためテスト結果のレポートをアップロードする機能としては不向きです。
やはりデプロイと名付けられているだけあって、「masterブランチ」に変更があったら開発環境へアプリをデプロイ、などといった使い方が良いのではないかと思います。
Continuous Deployment Options - Semaphore
まとめ
Semaphoreで出力されたレポートファイルをS3にアップロードし、HTTP経由で見れるようになりました。
Semaphoreでは、CI実行用のアプリケーションとは本質的に関係のないファイルはSemaphore側で管理することができます。 コマンドそのものもSemaphore側で管理するので、リポジトリではアプリケーションそのものを、SemaphoreではCIに関するリソースを管理する、というところがかなりはっきりしている印象を受けました。
私からは以上です。