当記事の概要
当記事では、Jenkins Pipeline(Declarative Pipeline)を作成するうえで「これどうすればいいんだっけ?」と個人的に迷うことのあったポイントについて、Tipsとしていくつか紹介していきます。
ジョブ実行時に与えたい環境変数の設定
Jenkinsサーバ全体で利用可能なグローバルな環境変数は、Jenkinsのメニューの「Jenkinsの管理」→「System」→「グローバルプロパティ」で設定することができます。
また、ジョブ単位で使用する環境変数は、Jenkinsfile内のenvironment
ディレクティブで設定できます。
ただ、environment
ディレクティブ内での設定では、環境変数をJenkinsfileで静的に設定することになり、Jenkinsでのジョブ定義時に環境変数を設定することができません。ジョブ定義時の環境変数の設定は、Jenkinsのデフォルトの状態ではできず、「Environment Injector」というプラグインを導入する必要があります。
プラグイン導入後、ジョブの設定画面で以下のような項目(「Prepare an environment for the run」)が表示され、環境変数設定が可能となります。Gitリポジトリに含まれるプロパティファイルを参照させたり(下記画面のProperties File Path)、Jenkinsのジョブ設定の中で直接設定する(下記画面のProperties Content)など、多様な設定方法が提供されています。
ジョブパラメータの指定
以下のように parameters
ディレクティブを使用することで、ジョブの実行を「パラメータ付きビルド」にすることができます。パラメータ付きビルドでは、ジョブの実行時にWeb画面上でパラメータの値を設定することができます。パラメータの型は、文字列、Boolean、選択リスト(choice)などを指定できます。また、デフォルト値の指定も可能です。
pipeline {
parameters {
string(name: "PARAM1", defaultValue: "default value", description: "パラメータの説明")
booleanParam(name: "PARAM2", defaultValue: true, description: "パラメータの説明")
}
パスワード、APIキーの取り扱い
パスワードやAPIキーといった秘匿情報はJenkinsfileに直接書くべきではなく、JenkinsのCredentialとして設定すべきです(Credentialは「Jenkinsの管理」→「Credentials」で設定)。
JenkinsfileでこのCredential情報にアクセスするには、credentials()
というヘルパーメソッドを environment
ディレクティブ内で以下のように使用します。
SAMPLE_CREDENTIAL = credentials("sample-credential")
「sample-credentials」をJenkinsで「Secret text」として作成している場合、環境変数SAMPLE_CREDENTIALにその値が設定されます。
「sample-credentials」を「ユーザ名とパスワード」として作成している場合、以下のように値が設定されます。
環境変数 | 設定される値 |
---|---|
SAMPLE_CREDENTIAL | ユーザ名とパスワードを「:」で連結した値 |
SAMPLE_CREDENTIAL_USR | ユーザ名 |
SAMPLE_CREDENTIAL_PSW | パスワード |
コンテナ上でのビルド
ソースコードをコンパイルするための環境(JavaではJDKなど)を用意する場合、Jenkinsのメニューの「Jenkinsの管理」→「Tools」で設定することが可能です(導入も自動導入が可能)。
ただ、必要とされる環境がジョブごとにまちまちであったり、定期的にバージョンアップなどの作業が必要であったりと、運用上不便な点もあります。
そこで、ビルド環境としてコンテナを利用することで、上記の不便さが解消されます。
Jenkinsでは、ジョブ全体、あるいはステージごとに実行環境をagent
で指定することができ、そこでdocker
を指定することで、指定したイメージのコンテナ上での実行が可能となります。
以下は、「Java Build」というステージに対して、「eclipse-temurin:17-jdk」というイメージでの実行を指定したものになります。
stage('Java Build') {
agent {
docker {
image "eclipse-temurin:17-jdk"
}
}
コンテナ上でのビルドでのキャッシュ保持
コンテナ上でMaven、Gradleなどでビルド処理を実行した場合の問題点として、(コンテナの揮発性ゆえに)Maven Centralなどから取得した依存ライブラリがキャッシュされず、2回目以降のビルドでも1回目と同じ時間がかかるという点があります。
これを解消するために、Maven、Gradleのキャッシュが保存されるディレクトリに対してJenkinsサーバ(ホスト)のディレクトリを割り当て、永続化されるようにします。
Gradleでは、依存ライブラリは <実行ユーザのホームディレクトリ>/.gradle/caches
に保持されるため、以下のように設定することで永続化されるようになります。
stage('Java Build') {
agent {
docker {
image "eclipse-temurin:17-jdk"
args "-u root --privileged -v <Jenkinsサーバの任意のディレクトリ>/${env.JOB_NAME}:/root/.gradle"
reuseNode true
}
}
ポイントとしては以下になります。
- 実行ユーザをrootとすることで、ホストに割り当てるディレクトリ(今回では
/root/.gradle/
)を固定する(rootでなくても任意のユーザでもよい) - ジョブごとにキャッシュを分けるため、ホスト側のディレクトリにジョブ名(環境変数JOB_NAME)を含める