Node.js 只有在发生更改时才构建项目
我们想把我们的项目分成几个小部分。我们当前的CI流程经过一个简短的测试阶段,然后运行一个部署脚本。然而,如果其中一个子项目没有任何变化,我们就不想为此进行构建 Jenkins With pipelines支持SCM配置中的排除(我们使用git),基于此,您可以配置要运行的特定作业。但是,当使用管道时,我如何知道是否应该构建此部件?如何访问受上次推送影响的路径 目前我们的脚本非常简单,我们希望它尽可能简单 我们在玩弄和语法,但找不到好的解决方案 声明性:Node.js 只有在发生更改时才构建项目,node.js,git,jenkins,jenkins-pipeline,Node.js,Git,Jenkins,Jenkins Pipeline,我们想把我们的项目分成几个小部分。我们当前的CI流程经过一个简短的测试阶段,然后运行一个部署脚本。然而,如果其中一个子项目没有任何变化,我们就不想为此进行构建 Jenkins With pipelines支持SCM配置中的排除(我们使用git),基于此,您可以配置要运行的特定作业。但是,当使用管道时,我如何知道是否应该构建此部件?如何访问受上次推送影响的路径 目前我们的脚本非常简单,我们希望它尽可能简单 我们在玩弄和语法,但找不到好的解决方案 声明性: #!groovy pipeline {
#!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"
}
}
}
多亏了我的提问,我们现在有了一个优雅的解决方案:
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
沙乌上一站=1美元
如果[-z${SHA_PREV}];然后
echo“用法:`basename$0`”
出口1
fi
检查路径=$2
如果[-z${CHECK_PATH}];然后
echo“用法:`basename$0`”
出口1
fi
如果'git rev parse${SHA_PREV}>/dev/null 2>&1';然后
echo“找到上一个标记:${SHA_PREV}”
其他的
SHA_PREV=`git rev list--max parents=0头`
echo“使用初始提交:${SHA_PREV}”
fi
changes=`git diff--name only${SHA_PREV}HEAD | grep${CHECK_PATH}/`
如果[!-n“${changes}”];然后
回显“未发现任何更改”
退出2#未找到任何更改
fi
构建完成后,为当前提交创建一个标记。在下一个构建中,比较新提交和标记。如果它们不是相同的提交,则继续(如果只关心文件内容,则继续执行树)。在新构建完成后,将标记从上一次提交重置为当前提交。@ElpieKay这有效了!非常感谢你。我会把它写下来,然后作为答案贴上去。没关系。很高兴这有帮助