当前位置: 首页 > 知识库问答 >
问题:

Jenkins 管道总是跳过 Git 标记的“when”条件的阶段

房冥夜
2023-03-14

声明性多分支Jenkins管道中,我只希望在Git标记存在的情况下运行一个阶段。出于测试原因,我设置了一个简单的虚拟管道。但是,始终跳过演示阶段。我检查了Git标签是否存在,并且我也推了标签,但这似乎没有任何效果。

詹金斯文件

pipeline {
    agent any

    environment {
        APP_NAME = 'myapp'
    }

    stages {
        stage('Demo') {
            when { buildingTag() }
            steps {
                echo "Found a tag..."
            }
        }
    }
}

Jenkins构建的控制台输出

[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Demo)
Stage "Demo" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

克隆存储库的日志输出

 > git rev-parse --is-inside-work-tree # timeout=10
Setting origin to git@gitlab.myhost.com:my-project/myapp.git
 > git config remote.origin.url git@gitlab.myhost.com:my-project/myapp.git # timeout=10
Fetching origin...
Fetching upstream changes from origin
 > git --version # timeout=10
 > git config --get remote.origin.url # timeout=10
using GIT_SSH to set credentials 
 > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
Seen branch in repository origin/master
Seen 1 remote branch
Obtained Jenkinsfile from 1bcf713882dbdba6b8007e0f6c23b44207cbab1e
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on vm-abn-jenk-002 in /var/lib/jenkins/workspace/build-myapp-app/master
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Checkout SCM)
[Pipeline] checkout
using credential 7253b0d3-b5a6-4569-a3ad-5392cba89d9b
Fetching changes from the remote Git repository
Checking out Revision 1bcf713882dbdba6b8007e0f6c23b44207cbab1e (master)
Commit message: "Update Jenkinsfile"
 > git rev-parse --is-inside-work-tree # timeout=10
 > git config remote.origin.url git@gitlab.myhost.com:my-project/myapp.git # timeout=10
Fetching upstream changes from git@gitlab.myhost.com:my-project/myapp.git
 > git --version # timeout=10
using GIT_SSH to set credentials 
 > git fetch --tags --progress git@gitlab.myhost.com:my-project/myapp.git +refs/heads/*:refs/remotes/origin/* --depth=1
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 1bcf713882dbdba6b8007e0f6c23b44207cbab1e
 > git rev-list --no-walk 1bcf713882dbdba6b8007e0f6c23b44207cbab1e # timeout=10

共有1个答案

应向晨
2023-03-14

请注意以下几点:

查看修订版1bcf713882dbdba6b8007e0f6c23b44207cbab1e(主)

这表明代码正在检查一个分支,而不是一个标签。你需要检查一个标签来使它工作。输出将类似于:

检查版本A8 deb 8 ef 28 D4 b 83 e5f 146 AFE 132 AC 21 dee 47 f 225(测试标签)

从技术上讲,tag和buildingTag条件检查是否设置了TAG_NAME环境变量(tag还检查值)。这是在Git插件签出标签时自动设置的,但在签出分支时不可用,即使在同一个提交上有标签。

由于您似乎正在使用多分支管道,因此您需要从标签选项卡开始构建以使其正常工作。

 类似资料:
  • 问题内容: 仅在构建特定分支时,如何运行构建步骤/阶段? 例如,仅在调用分支的情况下才运行部署步骤,而其他所有都保持不变。 问题答案: 在声明性管道语法中执行相同的操作,以下是一些示例: 出现更有效的方法-https: //issues.jenkins- ci.org/browse/JENKINS-41187 另请 参阅- https://jenkins.io/doc/book/pipeline/

  • 仅当构建特定分支时,如何运行构建步骤/阶段? 例如,仅当分支被称为时才运行部署步骤,其他操作保持不变。

  • 我们在工作描述中使用jenkins pipeline dsl。现在我们有了这样的东西: 生成过程中的一个阶段,仅当生成主分支时才应运行,您可以考虑部署作业或该方向的任何内容。问题是,我们带有该特定标签的代理商资源有限。当我们构建其他分支时,作业仍然调用slaver1代理,并且在检查分支不是主分支后跳过该阶段。这很糟糕,因为当所有 slave1 代理都在主分支作业上工作时,其他作业将不得不等待 sl

  • 我已经设置了一个Jenkins声明管道作业,它从Git中提取Jenkins文件。我有一个在另一个节点上运行的阶段(由标签选择),但它也试图从Git中检出Jenkinsfile。 我怎样才能阻止这种行为?这个特定的从属服务器位于防火墙的另一端,我只能通过SSH访问它。

  • Jenkins版本=2.19 Jenkins多分支管道插件版本=2.92 我有一个Jenkinsfile,其中有一些基于分支的条件阶段。 为了简洁起见,这是我的Jenkinsfile的修改版本: 我正在使用多分支管道插件。 它成功地检测并构建了我所有的分支。 我的问题是,所有构建报告为失败,即使我悬停每个阶段,它报告'成功'。 我附上了一张图片,显示了一个功能分支,其中我想要运行的两个阶段已经运行

  • 我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如: 第二阶段失败,因此默认情况下第三阶段不执行。 通常这将是的工作,但我想在阶段视图中显示它们。在下面的模型中: 构建4显示了通常发生的情况。作业失败,因此不运行