我对使用Jenkins文件和GIT插件的Jenkins多分支pipleline有一个问题。
问题是,每次向暂存分支推送都会触发master管道。所需的行为是,推送到暂存分支仅触发用于暂存的管道,而推送到主分支仅触发主管道
这是我的詹金斯档案
#!/usr/bin/env bash
pipeline {
agent any
triggers {
pollSCM('*/1 * * * *')
}
environment {
GCLOUD_PATH="/var/jenkins_home/GoogleCloudSDK/google-cloud-sdk/bin"
}
stages {
stage('Git Checkout'){
steps{
// Clean Workspace
cleanWs()
// Get source from Git
git branch: 'staging',
credentialsId: ****',
url: 'git@github.com:***/****.git'
}
}
stage('Update Staging') {
when {
branch 'staging'
}
environment{
INSTANCE="***"
}
steps {
sshagent(credentials : ['****']) {
sh 'ssh -tt -o StrictHostKeyChecking=no jenkins@"${INSTANCE}" sudo /opt/webapps/****/deploy.sh firstinstance'
}
}
}
stage('Update Production') {
when {
branch 'master'
}
environment{
gzone="us-central1-a"
}
steps {
sh '''
#!/bin/bash
echo "${BRANCH_NAME}"
export instances=$("${GCLOUD_PATH}"/gcloud compute instances list --filter="status:(running) AND tags.items=web" --format="value(name)")
FIRST=1
for instance in ${instances}
do
echo "### Running Instance: ${instance} ###"
if [[ $FIRST == 1 ]]; then
echo "first instance"
${GCLOUD_PATH}/gcloud compute ssh jenkins@${instance} --zone ${gzone} '--ssh-flag=-tt -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no' --command="echo first"
else
${GCLOUD_PATH}/gcloud compute ssh jenkins@${instance} --zone ${gzone} '--ssh-flag=-tt -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no' --command="sudo uptime"
fi
FIRST=0
done
'''
}
}
}
post {
success {
cleanWs()
}
}
}
我将分享一些日志:这是主分支的日志
http://34.69.57.212:8080/job/tinytap-server/job/master/2/pollingLog/ returns
Started on Dec 10, 2019 1:42:00 PM
Using strategy: Specific revision
[poll] Last Built Revision: Revision 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d (master)
using credential ccb9a735-04d9-4aab-8bab-5c86fe0f363c
> git --version # timeout=10
using GIT_ASKPASS to set credentials
> git ls-remote -h -- https://github.com/tinytap/tinytap-web.git # timeout=10
Found 222 remote heads on https://github.com/tinytap/tinytap-web.git
[poll] Latest remote head revision on refs/heads/master is: 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d - already built by 1
Using strategy: Default
[poll] Last Built Revision: Revision f693e358ce14bc5dfc6111e62ed88e6dd1d0dfc9 (refs/remotes/origin/staging)
using credential 17f45a89-da78-4969-b18f-cb270a526347
> git --version # timeout=10
using GIT_SSH to set credentials jenkins key
> git ls-remote -h -- git@github.com:tinytap/tinytap-web.git # timeout=10
Found 222 remote heads on git@github.com:tinytap/tinytap-web.git
[poll] Latest remote head revision on refs/heads/staging is: 907899a0e7e131e9416ee65aad041c8da111e2fe
Done. Took 1 sec
Changes found
这是主分支的日志,但只有暂存有一个新的提交:
http://34.69.57.212:8080/job/tt-server/job/master/3/pollingLog/ returns
Started on Dec 10, 2019 1:55:00 PM
Using strategy: Specific revision
[poll] Last Built Revision: Revision 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d (master)
using credential ****-****-****-****-5c86fe0f363c
> git --version # timeout=10
using GIT_ASKPASS to set credentials
> git ls-remote -h -- https://github.com/tt/tt-web.git # timeout=10
Found 222 remote heads on https://github.com/tt/tt-web.git
[poll] Latest remote head revision on refs/heads/master is: 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d - already built by 2
Using strategy: Default
[poll] Last Built Revision: Revision 907899a0e7e131e9416ee65aad041c8da111e2fe (refs/remotes/origin/staging)
using credential ****-****-****-****-cb270a526347
> git --version # timeout=10
using GIT_SSH to set credentials jenkins key
> git ls-remote -h -- git@github.com:tt/tt-web.git # timeout=10
Found 222 remote heads on git@github.com:tt/tt-web.git
[poll] Latest remote head revision on refs/heads/staging is: eab6e8bc6d8586084e9fe9856dec7fd8b31dd098
Done. Took 0.98 sec
Changes found
注意“已发现更改”,即使主分支上的头未更改
詹金斯·弗。2.190.1 Git插件版本4.0.0 Git客户端插件版本2.9.0
我认为你的文件中有一些逻辑上的遗漏。按照目前的情况,您可以轮询SCM以获取更改。如果检测到任何更改,第一阶段“Git Checkout”将签出临时分支(始终)。然后你有另一个阶段,如果分支是“暂存”的(它是这样的,因为它是硬编码的,用于签出上面的分支)等等。这将是第一件要修复的事情-如果检测到SCM更改,签出正确的分支。如何-有几个选择。我通常在“选项”中使用“skipDefaultCheckout()”,并在第一个管道阶段使用显式签出:
steps {
sshagent(['github-creds']) {
git branch: "${env.BRANCH_NAME}", credentialsId: 'github-creds', url: 'git@github.com:x/y.git'
}
}
第二件事是尝试将处理两个不同分支压缩到一个文件中。这不是应该怎么做的。Jenkins将使用来自给定分支的Jenkinsfile-只需确保staging上的Jenkinsfile包含您希望它包含的内容,与master上的Jenkinsfile相同。
希望有帮助。
我使用这个插件-https://github.com/lachie83/jenkins-pipeline,它为我工作正常。您需要为每个分支设置单独的if块,然后在其中设置阶段块。以下示例:
#!/usr/bin/groovy
@Library('https://github.com/lachie83/jenkins-pipeline@master')
def pipeline = new io.estrado.Pipeline()
def cloud = pipeline.getCloud(env.BRANCH_NAME)
def label = pipeline.getPodLabel(cloud)
// deploy only the staging branch
if (env.BRANCH_NAME == 'staging') {
stage ('deploy to k8s staging') {
//Deploy to staging
}
}
// deploy only the master branch
if (env.BRANCH_NAME == 'master') {
stage ('deploy to k8s production') {
//Deploy to production
}
}
我有一个参数化的Jenkins多分支管道,使用GitHub repo作为Jenkins文件和一些脚本的源。管道被配置为在Webhook上触发分支和拉请求,但我还希望只对主分支使用参数化的cron触发器,特别是在工作日每4小时一次。 我使用声明性管道语法,但如果必要,我愿意使用脚本化管道。 我使用参数化调度器插件来实现带有参数的cron触发器。 这个管道示例捕获了我试图实现但不支持的内容: 这项功能
我有一个场景,但我有两个项目(a和B),都在Jenkins中配置了多分支管道作业,问题是项目B依赖于项目a。 所以我发现有时候当我在项目A中签入代码时,我也需要在项目A构建后构建项目B。现在,在我开始调查管道构建之前,我将每个分支都有一个作业,然后在Jenkins中为相应的分支触发项目B的适当作业。 我想在Jenkins文件中设置什么,这样当ProjectA/develop执行时,它就会触发Pro
对于一个新项目,我想使用Jenkins CI的新管道功能。我们的Git存储库中有几个分支,应该以同样的方式进行测试。它还应该自动跟踪和处理新的分支。因此,我创建了一个多分支管道作业。但它的配置有两个问题: 1) 为了被Jenkins标记为有效,分行需要一个“Jenkinsfile”。如果这不存在,詹金斯将忽略该分支。有没有办法标记与模式匹配的所有分支,而不需要在其中包含此文件? 2) 每个分支都应
问题内容: 我目前正在测试Jenkins 2.0的管道方法,以查看它是否适用于我正在使用的构建环境。 首先是环境本身。当前它由多个SCM存储库组成。每个存储库都包含多个分支,用于开发的不同阶段,并且每个分支都使用多种配置构建。并非所有配置都适用于每个存储库。 当前,每个存储库/分支都被设置为适用于不同配置的矩阵项目。每个项目将其构建结果作为工件公开,并且这些工件在下游项目中使用。 不同的存储库彼此
我们看到在Jenkins多分支管道项目上触发了重复构建。构建通常使用来自Bitbucket的推送通知触发,并使用以下插件:https://marketplace.atlassian.com/plugins/com.nerdwin15.stash-stash-webhook-jenkins/server/overview 然而,出于某种原因,我们现在看到了“双重”构建。如果查看触发的两个生成,一个由
我目前设置了一个 Jenkins 多分支管道作业,该作业基于 Gitlab 服务器上托管的 Git 存储库。Jenkins 可以读取存储库中的分支,并为存储库中的每个分支创建一个作业。但是我不知道如何在Gitlab中使用webhook触发作业。 我的问题是: > < li> 如何从Gitlab服务器触发在Jenkins中创建新的分支作业?我看不到一个新分支的webhook被推。 如何触发单个分支的