目次

目次

Jenkins S3 Plugin がクロスアカウントで不便だった

高橋克幸
高橋克幸
最終更新日2017/04/19 投稿日2017/04/19

ビルドサーバ構築する際に、ビルド後成果物を S3 にアップロードする必要がありました。 今回は S3 Plugin を利用してハマったので、その原因と代替案について書きたいと思います。

S3 Plugin でできること

以下にS3アップロードする際に設定できる項目をまとめます。

項目 機能 対応するCLIパラメータ
Source アップロードするファイルを指定 LocalPath
Exclude アップロードしないファイルを指定 –exclude
Destination bucket アップロード先のバケットを指定 S3Uri
Storage class STANDARD か REDUCED_REDUNDANCY –storage-class
Bucket Region リージョン指定 –source-region
Server side encryption 暗号化キーによるサーバー側の暗号化 –sse

お気づきだろうか… S3 plugin では ACL のパラメータを設定する項目がありません。

問題点

結論から言うと、S3 plugin を利用しクロスアカウントでアップロードするとアップロード先のアカウントでオブジェクトを操作することができませんでした。 S3 plugin はアップロードする際に、ACL の設定をおこなわないためアプロードした際にデフォルト値の private が設定されてしまい、アップロードしたアカウントでしか操作することができないようになってしまいます。

代替案

代替案としてプラグインを利用せずにアップロードするためのジョブを作成し対応しました。 ビルド後の処理として、アップロードするジョブを実行するように設定し成果物をアップロードします。 このとき、ジョブごとに成果物の数やファイルのパスが違うためビルドのパラメータとして成果物の情報を渡す必要があります。パラメータを渡すには、Parameterized Trigger Plugin というプラグインを利用します。 パラメータはJVMのプロパティ形式で記述します。

PROJECT_NAME=hoge-test
BUCKET_NAME=app-hoge-recochoku-jp-t
FILE_NUM=2
FILE_NAMES=hoge-front-test*.war, hoge-api-test*.zip
PUT_DIRS=hoge_manage, hoge_api

アップロードするジョブの設定では、General->ビルドのパラメータ化 にチェックをし渡されるパラメータの名前を入力しておきます。そして、ビルドでシェルを実行し受け取ったパラメータをもとに S3 へアップロードします。

#!/bin/sh
#ファイル一覧を文字列から配列に変換
FILE_NAMES_ARRAY=( `echo ${FILE_NAMES} | tr -s ',' ' '`)
#バケットのディレクトリ名一覧を文字列から配列に変換
PUT_DIR_ARRAY=( `echo ${PUT_DIRS} | tr -s ',' ' '`)

for i in `seq 0 \`expr ${FILE_NUM} - 1\``
do
    FILE_PATH="${JENKINS_HOME}/workspace/${PROJECT_NAME}/server/build/${FILE_NAMES_ARRAY[${i}]}"
    BUCKET="${BUCKET_NAME}/${PUT_DIR_ARRAY[${i}]}/"
    aws s3 cp ${FILE_PATH} s3://${BUCKET} --acl bucket-owner-full-control
    if [ $? -ne 0 ]; then
        exit 1
    fi
done

exit 0

おわりに

今回新しくジョブを作成しそこで成果物をアップロードすることで対応しました。 S3 plugin のプルリクに ACL を設定できるように実装されたものがありましたが、 プルリクが出されたのが1年以上前… マージされる日は来るのでしょうか…

高橋克幸

新卒3年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。

目次