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

Jenkins, S3

ビルドサーバ構築する際に、ビルド後成果物を 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のプロパティ形式で記述します。

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

おわりに

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

この記事を書いた人

高橋克幸
高橋克幸

新卒2年目の準新人です。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。

最近書いた記事

Jenkins, S3