宣言型パイプライン
Jenkinsfile(宣言型パイプライン)
groovy
pipeline {
agent any // 任意のノードで実行可能;noneを指定し、グローバルagentなしにもできる。
stages {
stage('Build') {
agent { // 実行ノード指定
label 'master'
}
steps {
//
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}
各 stage には steps は 1 つだけ配置でき、 agent { label 'master' }
でその stage の実行ノードを指定できます。
宣言型パイプラインの特徴
- 異なる stage で同じ label を指定しても、実行ノードが必ずしも同じとは限らず、Jenkins はその label に紐づく使用可能なノードをランダムで割り当てます。
- バージョン管理システムで Jenkinsfile を管理する場合、宣言型パイプラインは各ステージごとにリポジトリ全体をルートディレクトリにチェックアウトするため、サブノードにも git のインストールが必要です。
- 同じ steps ブロック内では前のコマンドの状態を継承します。例えば、最初の行が
sh 'cd nya'
の場合、2 行目は nya ディレクトリ内で実行されます。
特徴1への対応策
最初にノードを呼び出す際に env.NODE_NAME
をグローバル変数に渡し、その変数を使いたいノードの label タグに格納します。
env.NODE_NAME
は Jenkins の組み込み変数で、現在のステージが動作するノード名を示します。
スクリプト型パイプライン
Jenkinsfile(スクリプト型パイプライン)
groovy
node('master') { // masterラベルのノードを指定
stage('Build') {
//
}
stage('Test') {
//
}
}
node('RVV') { // RVVラベルのノードを指定
stage('Build') {
//
}
stage('Test') {
sh 'にゃー'
sh 'にゃー'
}
}
シンプルで便利、 pipeline
フレームワークなしで、node ブロックでノード実行をコントロールできます。使用例:https://github.com/Leetfs/opencv-riscv-perf/blob/main/Jenkinsfile
スクリプト型パイプラインの特徴
- 1 つのパイプライン内で複数の node が使え、1 つの node で複数の stage が指定可能。同じ node ブロック内の各 stage は同一ノードで動作します。
- バージョン管理で Jenkinsfile を管理しても、スクリプト型パイプラインは Jenkinsfile だけをノードで読み込み、リポジトリ全体は取得しません。リポジトリ内容が必要な場合は自分で clone してください。
- 同じ steps ブロック内でも前のコマンド状態は継承されません。例えば 1 行目が
sh 'cd nya'
なら、2 行目の作業ディレクトリは依然としてデフォルトの作業領域です(nya ではありません)。- 複数行スクリプト
sh ''' 内容 '''
はこの制限を受けません。なぜなら複数行コマンドはひとつの sh ブロック内で処理されるためです。
- 複数行スクリプト