Jenkins の CodeBuild プラグイン の TIPS

はじめに

Jenkins から CodeBuild を使うためのプラグインAWS で提供されていて、このプラグインのちょっとした使い方についてです。

docs.aws.amazon.com

github.com

plugins.jenkins.io

検索してもこのプラグインの情報があまり無くて使われてないような感じがありますが Jenkins 使っている場合は便利な場合もあると思います。

使いそうなケースは以下のようなものがあると思います。

  • Jenkins で使える色々なトリガーで CodeBuild ジョブを実行したい
  • AWS マネジメントコンソールからやるより Jenkins のほうが慣れている人が多い
  • Jenkins に色々ジョブがあって、実行中に Jenkins サーバーに負荷をかけたくない

Switch Role して使いたい

CodeBuild プラグインを使うには CodeBuild 関連の IAM 権限が必要になります。

Jenkins サーバーを EC2 インスタンスで動かしている場合は EC2 インスタンスに付いているインスタンスプロファイルの IAM ロールが使えます。

しかし Jenkins では色々なジョブを動かしたりするので一つの IAM ロールにたくさん権限付けたく無いことがあります。

それから Jenkins が動いているのとは別の AWS アカウントの CodeBuild を実行したい場合も考えられます。

こういう時に Switch Role が便利です。

Switch Role についは下のドキュメントなどに書かれていました。

docs.aws.amazon.com

やり方

Jenkins の認証情報設定のところから CodeBuild Credentials を作成します。

f:id:tkaaad97:20191027011448p:plain

(画像は一部情報を書き換えています)

IAM Role ARN に Switch Role 先の IAM ロールを指定します。

インスタンスプロファイルの IAM ロールから Switch Role できるようになっていればアクセスキーなどは空のままで大丈夫でした。

CodeBuild プラグインを使うところでこの認証情報を credentialsId で指定します。

下はパイプラインジョブ中の書き方の例です。

node {
    stage('build') {
        awsCodeBuild(
            credentialsId: 'jenkins-codebuild-role-credentials',
            credentialsType: 'jenkins',
            projectName: 'hello',
            region: 'ap-northeast-1',
            sourceControlType: 'project'
        )
    }
}

AWS_PROFILE 環境変数で切り替えられるかもやってみたのですが、こちらは上手く行きませんでした。

環境変数を指定する

Jenkins ジョブをパラメーター化して実行時にパラメーターを渡し、これを CodeBuild ジョブの環境変数に渡したいときのやり方です。

なぜか独特なフォーマットになっているので注意が必要なことがあります。

フォーマットの説明は以下です。これは Jenkins 中のパイプラインシンタックスのページにあった情報です。

 Optional parameter. These environment variables will be passed to the StartBuild API and will override any project environment variables.
Example: [ { VAR, value } ]
Example: [ { VAR, value }, { VAR2, value } ]

Commas in the name or value must be escaped. For freestyle projects, escape with one backslash:
[ { VAR, value1\,value2 } ]
For pipeline projects, escape with two backslashes:
awsCodeBuild ... envVariables: '[{VAR, value1\\,value2}]'

カンマはエスケープが必要になっているようです。

また試していて環境変数の値に空文字列を渡すことができないようでした。 下のようなエラーが出ました。

[AWS CodeBuild Plugin] CodeBuild configured improperly in project settings
    > CodeBuild environment variable keys and values cannot be empty and the string must be of the form [{key, value}, {key2, value2}] (Service: null; Status Code: 0; Error Code: null; Request ID: null)

Jenkins ジョブにパラメーターを渡すところでこのプラグインの挙動を考慮するのは微妙なのでパイプラインジョブの中で書き換えて渡してやるのがいいような気がしています。 カンマのエスケープもパイプラインのコードの中で行ってもいいと思います。

node {
    stage('build') {
        def envVariables = null;
        if ("${PARAM1}" != '') {
            envVariables = "[{PARAM1,${PARAM1}}]"
        }

        awsCodeBuild(
            credentialsId: 'jenkins-codebuild-role-credentials',
            credentialsType: 'jenkins',
            projectName: 'hello',
            region: 'ap-northeast-1',
            sourceControlType: 'project',
            envVariables: envVariables
        )
    }
}