Jenkins setup:
Jenkins: 2.504.3
OS: Windows Server 2019 - 10.0
Java: 21.0.6 - Oracle Corporation (Java HotSpot™ 64-Bit Server VM)
antisamy-markup-formatter:173.v680e3a_b_69ff3
apache-httpcomponents-client-4-api:4.5.14-269.vfa_2321039a_83
apache-httpcomponents-client-5-api:5.5-150.veb_76e719855b_
asm-api:9.8-135.vb_2239d08ee90
authentication-tokens:1.131.v7199556c3004
bootstrap5-api:5.3.7-1
bouncycastle-api:2.30.1.80-261.v00c0e2618ec3
branch-api:2.1229.ve86b_d02b_5e56
build-timeout:1.38
caffeine-api:3.2.0-166.v72a_6d74b_870f
checks-api:373.vfe7645102093
cloudbees-bitbucket-branch-source:936.4.3
cloudbees-folder:6.1033.v7a_d11b_20c8df
command-launcher:123.v37cfdc92ef67
commons-lang3-api:3.17.0-87.v5cf526e63b_8b_
commons-text-api:1.13.1-176.v74d88f22034b_
config-file-provider:988.v0461fcc2b_9d1
coverage:2.7.1
credentials:1415.v831096eb_5534
credentials-binding:696.v256688029804
data-tables-api:2.3.2-3
display-url-api:2.209.v582ed814ff2f
dotnet-sdk:1.4.0
dtkit-api:3.0.3
durable-task:587.v84b_877235b_45
echarts-api:5.6.0-5
eddsa-api:0.3.0.1-19.vc432d923e5ee
email-ext:1916.vc954a_f86ff21
emma:1.31
external-monitor-job:223.vb_fddcf42c9b_3
favorite:2.237.v79163ca_8b_892
font-awesome-api:6.7.2-1
forensics-api:3.1.0
git:5.7.0
git-client:6.2.0
github:1.43.0
github-api:1.321-488.v9b_c0da_9533f8
github-branch-source:1824.v046257273408
gradle:2.15
gson-api:2.13.1-139.v4569c2ef303f
handy-uri-templates-2-api:2.1.8-36.v85e4cb_234a_13
htmlpublisher:427
instance-identity:203.v15e81a_1b_7a_38
ionicons-api:88.va_4187cb_eddf1
jackson2-api:2.19.0-404.vb_b_0fd2fea_e10
jakarta-activation-api:2.1.3-2
jakarta-mail-api:2.1.3-2
javadoc:327.vdfe586651ee0
javax-activation-api:1.2.0-8
javax-mail-api:1.6.2-11
jaxb:2.3.9-133.vb_ec76a_73f706
jdk-tool:83.v417146707a_3d
jjwt-api:0.11.5-120.v0268cf544b_89
joda-time-api:2.14.0-127.v7d9da_295a_d51
jquery3-api:3.7.1-3
jsch:0.2.16-95.v3eecb_55fa_b_78
json-api:20250517-153.vc8a_a_d87c0ce3
json-path-api:2.9.0-148.v22a_7ffe323ce
jsoup:1.21.1-52.v96e4041b_60fd
junit:1335.v6b_a_a_e18534e1
ldap:780.vcb_33c9a_e4332
mailer:509.vc54d23fc427e
matrix-auth:3.2.6
matrix-project:849.v0cd64ed7e531
maven-plugin:3.26
mina-sshd-api-common:2.15.0-161.vb_200831a_c15b_
mina-sshd-api-core:2.15.0-161.vb_200831a_c15b_
msbuild:1.37
mstest:1.0.5
mstestrunner:1.5.0
multibranch-scan-webhook-trigger:1.0.11
okhttp-api:4.11.0-189.v976fa_d3379d6
oss-symbols-api:356.v2da_d59a_3742b_
pam-auth:1.12
pipeline-build-step:571.v08a_fffd4b_0ce
pipeline-github-lib:65.v203688e7727e
pipeline-graph-analysis:241.vc3d48fb_b_2582
pipeline-groovy-lib:752.vdddedf804e72
pipeline-input-step:527.vd61b_1d3c5078
pipeline-milestone-step:138.v78ca_76831a_43
pipeline-model-api:2.2255.v56a_15e805f12
pipeline-model-definition:2.2255.v56a_15e805f12
pipeline-model-extensions:2.2255.v56a_15e805f12
pipeline-rest-api:2.38
pipeline-stage-step:322.vecffa_99f371c
pipeline-stage-tags-metadata:2.2255.v56a_15e805f12
pipeline-stage-view:2.38
plain-credentials:199.v9f8e1f741799
plugin-util-api:6.1.0
powershell:2.3
prism-api:1.30.0-1
pubsub-light:1.19
resource-disposer:0.25
scm-api:704.v3ce5c542825a_
script-security:1373.vb_b_4a_a_c26fa_00
snakeyaml-api:2.3-125.v4d77857a_b_402
sse-gateway:1.28
ssh-credentials:359.v2191c4cf635f
ssh-slaves:3.1031.v72c6b_883b_869
sshd:3.372.v5d04a_e92d8cf
structs:350.v3b_30f09f2363
timestamper:1.30
token-macro:444.v52de7e9c573d
trilead-api:2.209.v0e69b_c43c245
variant:70.va_d9f17f859e0
workflow-aggregator:608.v67378e9d3db_1
workflow-api:1373.v7b_813f10efa_b_
workflow-basic-steps:1079.vce64b_a_929c5a_
workflow-cps:4151.v5406e29e3c90
workflow-durable-task-step:1434.v1b_595c29ddd7
workflow-job:1540.v295eccc9778f
workflow-multibranch:806.vb_b_688f609ee9
workflow-scm-step:437.v05a_f66b_e5ef8
workflow-step-api:704.ve4f0967e98fa_
workflow-support:968.v8f17397e87b_8
ws-cleanup:0.48
xunit:3.1.5
Hi, I’m a relative newbie to Jenkins, so this might be an easy fix, but I just don’t know.
I have a multibranch pipeline. I’m using a self-hosted git repository. Also, I use the Multibranch Scan Webhook Trigger plugin. I have a number of different branches. Currently I do work in the master branch. When I’ve done enough work to do a release, I then merge into a branch that is there to handle deployment of a specific application to a specific environment. For instance, I have dev_client and prod_client branches, each of which will deploy a particular application (which I’m calling “client”) to the appropriate environment (dev or prod in this case). For completeness, I’ll add an anonymized version of my JenkinsFile below. Every branch has the same JenkinsFile and I coded it to do different things depending on what branch it’s on.
As part of my post-receive hook, I invoke the following URL to start the pipeline:
https://myserver:8443/multibranch-webhook-trigger/invoke?token=ClientToken
What I’m expecting to happen is this order of operations:
- Push changes to
master. - Webhook detects changes to
masterand invokes trigger URL above. - The
masterbranch pipeline runs.
What I’m actually seeing:
- Push changes to
master. - Webhook detects changes to
masterand invokes trigger URL above. - The
masterbranch pipeline runs. - The
dev_clientbranch pipeline runs.
In my post-receive, I am logging branch name. At the time in which dev_client branch pipeline runs, the only branch that has been logged is master. Also, if I manually visit the webhook URL, it always seems to choose to run the dev_client branch. I just can’t figure out why. I would think it’s all or nothing. And it’s not random, because it’s always dev_client.
As a side note, is there something weird about this forum that is changing the word master to controller if you don’t put it in quotes?
def deploy = false
def test = false
pipeline {
agent any
options {
disableConcurrentBuilds(abortPrevious: true)
}
environment {
git_credentials = "git credentials here"
git_url = "git url here"
dotnet_version = "net9.0-windows"
deploy_user_login = "deploy-login"
}
stages {
stage('Set Environment Variables') {
steps {
script {
echo "Working with branch from ${env.BRANCH_NAME}"
if (env.BRANCH_NAME == 'prod_client') {
env.client_appsettings_file = "prod-client-appsettings"
deploy = true
} else if (env.BRANCH_NAME == 'dev_client') {
env.client_appsettings_file = "test-client-appsettings"
deploy = true
} else if (env.BRANCH_NAME == 'master') {
test = true
}
}
}
}
stage('CleanWorkspace') {
when {
expression { deploy || test }
}
steps {
cleanWs()
}
}
stage ('Git Checkout')
{
when {
expression { deploy || test }
}
steps
{
git branch: "${env.BRANCH_NAME}", credentialsId: "${env.git_credentials}", url: "${env.git_url}"
}
}
stage('Update Configuration')
{
when {
expression { deploy }
}
steps
{
configFileProvider([configFile(fileId: "${env.client_appsettings_file}", replaceTokens: true, targetLocation: 'Client\\appsettings.production.json')])
{
}
}
}
stage('Test')
{
when {
expression { test }
}
steps
{
bat 'dotnet tool uninstall --global dotnet-coverage || exit 0'
bat 'dotnet tool install --global dotnet-coverage || exit 0'
bat 'dotnet test -l:trx --collect "Code Coverage" --results-directory:"./TestResults" || true'
bat 'dotnet-coverage merge *.coverage --recursive -f cobertura --output TestResults/coverage.xml'
}
}
stage('Publish')
{
when {
expression { deploy }
}
steps
{
bat "msbuild.exe /p:WarningLevel=0 /t:Restore;Publish /p:PublishProfile=ClickOnceProfile \"${workspace}\\Client\\Client.csproj\""
}
}
stage('Update ClickOnce Versions') {
when {
expression { deploy }
}
steps {
script {
def xmlFilePath = "${workspace}\\Client\\Properties\\PublishProfiles\\ClickOnceProfile.pubxml"
def (currentRevision, newRevision, newXmlContent, newMinVersion) = updateClickOnceVersionNumbers(xmlFilePath)
writeFile(file: xmlFilePath, text: newXmlContent)
echo "Updated ApplicationRevision from ${currentRevision} to ${newRevision}"
echo "Updated MinimumRequiredVersion to ${newMinVersion}"
}
script {
bat 'git add Client\\Properties\\PublishProfiles\\ClickOnceProfile.pubxml'
bat 'git commit -m "Updated ClickOnce Version" || echo "Nothing to commit"'
withCredentials([gitUsernamePassword(credentialsId: "${env.git_credentials}")])
{
bat "git push --set-upstream origin ${env.BRANCH_NAME}"
}
}
}
}
}
post
{
always
{
script
{
if (test)
{
mstest(testResultsFile: '**/*.trx', failOnError: true, keepLongStdio: true)
recordCoverage(tools: [[parser: 'COBERTURA', pattern: 'TestResults/coverage.xml']], sourceCodeRetention: 'LAST_BUILD')
}
}
}
}
}
@NonCPS
def updateClickOnceVersionNumbers(String xmlFilePath) {
def xmlFile = new File(xmlFilePath)
def parser = new XmlParser()
def project = parser.parse(xmlFile)
def propertyGroup = project['PropertyGroup'][0]
def currentRevision = propertyGroup['ApplicationRevision'][0].text() as Integer
def newRevision = currentRevision + 1
propertyGroup['ApplicationRevision'][0].value = newRevision.toString()
def minVersionText = propertyGroup['MinimumRequiredVersion'][0].text()
def versionBase = minVersionText.substring(0, minVersionText.lastIndexOf('.') + 1)
def newMinVersion = versionBase + newRevision
propertyGroup['MinimumRequiredVersion'][0].value = newMinVersion
def writer = new StringWriter()
def printer = new XmlNodePrinter(new PrintWriter(writer))
printer.preserveWhitespace = true
printer.print(project)
return [currentRevision, newRevision, writer.toString(), newMinVersion]
}