如果事情已经改变,只能build立项目

我们想把我们的项目分成小块。 我们目前的CI过程经历了一个短暂的testing阶段,然后运行一个部署脚本。 但是,如果子项目中没有任何变化,我们不想为此通过构build。

没有pipe道的Jenkins支持SCMconfiguration中的排除(我们使用git),并基于此,可以configuration特定的作业运行。 但是,当使用pipe道时,我怎么知道,如果我应该build立这个部分? 如何访问受上次推送影响的path?

目前我们的脚本非常简单,我们希望尽可能简单。

我们正在玩脚本语句和声明语法,但找不到一个好的解决scheme。

声明:

#!groovy​ pipeline { agent any tools { nodejs '8.1' } stages { stage('Checkout') { steps { checkout scm } } # Only continue, if something has changed stage('Install') { steps { sh 'npm install' } } stage('Test') { steps { sh 'npm run test-jenkins' } post { always { junit "artifacts/test/report.xml" } } } } } 

脚本:

 #!groovy​ node { def nodejs = tool name: '8.1', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation' env.PATH = "${nodejs}/bin:${env.PATH}" stage('Checkout') { checkout scm } # Only continue, if something has changed stage('Install') { sh 'npm install' } stage('Test') { try { sh 'npm run test-jenkins' } finally { junit "artifacts/test/report.xml" } } } 

感谢ElpieKay对我的问题的快速评论 ,我们现在有一个优雅的解决scheme:

  1. 在成功构build时为当前提交做一个标记
  2. 在下一个版本中比较新的提交和更改的标记

我们正在使用一个多分支pipe道和一个并行构build来处理同一个源根下的多个项目。 我们遍历项目( serviceX )并检查相应的目录中的更改:

 def projects = ['service1', 'service2'] def builders = [:] for (p in projects) { def label = p builders[label] = { def tag = "${BRANCH_NAME}_last" node { echo "Checking for changes compared to ${tag} in directory ${label}" try { sh "./check-for-changes ${tag} ${label}" } catch (ignored) { echo "Nothing to do" return } dir (label) { stage(label + ": Install") { sh "npm install" } stage(label + ": Test") { try { sh "npm run test-jenkins" } finally { junit 'artifacts/test/report.xml' } } echo "Setting tag for the last build on this branch" sh "git tag -f ${tag}" } } } } parallel builders 

…以及检查更改的脚本:

 #!/bin/bash SHA_PREV=$1 if [ -z ${SHA_PREV} ]; then echo "Usage: `basename $0` <tag> <path>" exit 1 fi CHECK_PATH=$2 if [ -z ${CHECK_PATH} ]; then echo "Usage: `basename $0` <tag> <path>" exit 1 fi if `git rev-parse ${SHA_PREV} >/dev/null 2>&1`; then echo "Found previous tag: ${SHA_PREV}" else SHA_PREV=`git rev-list --max-parents=0 HEAD` echo "Using initial commit: ${SHA_PREV}" fi changes=`git diff --name-only ${SHA_PREV} HEAD | grep ${CHECK_PATH}/` if [ ! -n "${changes}" ]; then echo "No changes found" exit 2 # no changes found fi