Semaphore(CI/CD)でテスト中に出力されたファイルをS3にアップロードしてみた

2017.11.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

SmaphoreはクラウドのCI/CDツールです。 ざっくりいってしまえばTravis CIやCircleCIのようなツールとなります。

以下の記事にて初期のセットアップし、GitHubと連携させてコードの変更ごとにテストを実行しました。

Semaphore(CI/CD)をセットアップしてみた

この時に、テスト中に出力されたレポートファイルはどうやって見ればいいんだろう?という疑問が残りましたので、本記事では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に関するリソースを管理する、というところがかなりはっきりしている印象を受けました。

私からは以上です。

参考