tjinjin's blog

インフラ要素多めの個人メモ

JenkinsのPipelineでjobを並列実行させる

About

Jenkinsを弄ってみたので記事にしてみました。

この記事は「LITALICO Engineers Advent Calendar 2020」の13日目の記事です。

LITALICO Engineers Advent Calendar 2020 https://qiita.com/advent-calendar/2020/litalico

これは何か

私が関わっているプロダクトではJenkinsを使ってデプロイを行う仕組みになっていました。ただデプロイ時間が非常にかかっていてリリース作業のコストが高い状況になっています。そこでデプロイ時間の短縮を進めるなかでPipelineを調べたので簡単にまとめておきます。

ちなみにデプロイ時間短縮に関しては現時点では半分くらいまで短縮できるようになっています。(詳細はまた別の機会に…)

Jenkins pipelineについて

www.jenkins.io

Jenkinsではpipelineという形で複数の実行ステップなどを管理することができます。こちらを使うと依存関係がある一連の処理をまとめて管理することができたりします。

最終形

f:id:cross_black777:20201212152710p:plain

pipelineから実行対象のjobをselectboxで指定しつつ、dateというparameterを個別jobに渡しています。

個別jobのパラメータは下記のようになります

f:id:cross_black777:20201212152829p:plain

build内容は下記のようにしています。

echo "date: $date"
echo "test: $test"

それでは少しずつ見ていきます。

pipelineからjobを呼び出す

pipelineから各jobを呼び出すには下記のようにbuild jobを指定することで呼び出すことが可能です。この際にparametersを指定することでpipelineで入力したものを各jobに渡すことができます。

pipeline {
  agent any
  stages {
    stage('job1') {
      steps {
        build job: 'test-job1', parameters: [
            [$class: 'StringParameterValue', name: "date", value: "$date"]
        ]
      }
    }
  }
}

checkがついたjobのみ実行する

下記のような記載になります。

pipeline {
  agent any
  stages {
    stage('job1') {
      when {
        expression {
          return job1.toBoolean()
        }
      }
      steps {
        build job: 'test-job1', parameters: [
            [$class: 'StringParameterValue', name: "date", value: "$date"]
        ]
      }
    }
  }
}

今回はpipelineのselectboxでチェックが付いたもののみjobを実行させたかったので、上記のようにwhenを使って条件分岐をさせています。

pipelineからジョブを並列に呼び出す

最後にjobを並列実行させる書き方にしてみます。

pipeline {
  agent any
  stages {
    stage("parallel") {
      parallel {
        stage('job1') {
          when {
            expression {
              return job1.toBoolean()
            }
          }
          steps {
            build job: 'test-job1', parameters: [
                [$class: 'StringParameterValue', name: "date", value: "$date"]
            ]
          }
        }
        stage('job2') {
          when {
            expression {
              return job2.toBoolean()
            }
          }
          steps {
            build job: 'test-job2', parameters: [
                [$class: 'StringParameterValue', name: "date", value: "$date"]
            ]
          }
        }
        stage('job3') {
          when {
            expression {
              return job3.toBoolean()
            }
          }
          steps {
            build job: 'test-job3', parameters: [
                [$class: 'StringParameterValue', name: "date", value: "$date"]
            ]
          }
        }
      }
    }
  }
}

上記のようにparallelを使うことで並列実行できました。ただしExecutorが余ってないとqueueに入ってしまうので注意しましょう。

まとめ

まだまだ改善の余地があるのでいろいろ直していきたいと思います。

弊社ではSREも募集しておりますので、ご興味ある方は下記のページや私に個別にご連絡いただければと思います。

LITALICO Engineers Recruit Information | 株式会社LITALICO