LoginSignup
0
0

Jenkins PipelineのTips

Posted at

当記事の概要

当記事では、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)など、多様な設定方法が提供されています。

2024-05-02 at 23.16.56@2x.png

ジョブパラメータの指定

以下のように 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)を含める
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0