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

詹金斯:用单一管道安排特定阶段

仲鸿风
2023-03-14

我有一个单一的管道,它是声明性的,我有几个阶段,例如下面通过网络钩子触发。

我想执行和计划阶段B在某个时间也可以通过webhook运行没有触发。很明显,它需要在通过webhook触发时运行,也需要在被调度时运行。我能在Jenkins中不创建单独的工作或管道的情况下处理这个问题吗?

           stage('A'){
                when{
                    beforeAgent true
                    expression{return env.GIT_BRANCH == "origin/development"}
                }
                steps{
                    script{
                         //Do something
            }  


            stage ('B'){
                when {
                    beforeAgent true
                    expression{return env.GIT_BRANCH == "origin/development"}
                steps {
                    script {
                        //Run Tests
                    }
                }
            }


            stage('C'){
                when{
                    beforeAgent true
                    expression{return env.GIT_BRANCH == "origin/development"}
                }
                steps{
                    script{
                       //Do something
            }

共有2个答案

徐飞龙
2023-03-14

不是以干净或一流的方式,但是的,你可以有效地做到这一点。

对于至少运行过一次的任何作业,您可以单击“重播”进行上一次运行。

然后,您将在文本编辑框中看到Jenkinsfile。此时,您可以对Jenkinsfile执行任何想要的编辑(如果您愿意,包括粘贴到完全不相关的Jenkinsfile中),Jenkins将执行修改后的版本。对于您的特定情况,您可以删除所有不想重新运行的阶段,只留下您想要的一个(或两个等)。

田鸿彩
2023-03-14

您可以发现导致管道运行的原因。这可能是< code>cron触发器、手动触发器、代码提交触发器、webhook触发器、GitHub上的注释、上游作业等。(根据安装的插件,列表可能会很长。)

这是理解触发器的代码示例。此示例设置环境变量TRIGGERED_BY

def checkForTrigger() {
    def timerCause = currentBuild.rawBuild.getCause(hudson.triggers.TimerTrigger.TimerTriggerCause)
    if (timerCause) {
        echo "Build reason: Build was started by timer"
        env.TRIGGERED_BY = 'timer'
        return
    }

    def userCause = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)
    if (userCause) {
        echo "Build reason: Build was started by user"
        env.TRIGGERED_BY = 'user'
        return
    }

    def remoteCause = currentBuild.rawBuild.getCause(hudson.model.Cause$RemoteCause)
    if (remoteCause) {
        echo "Build reason: Build was started by remote script"
        env.TRIGGERED_BY = 'webhook'
        return
    }
    // etc.
    println "We haven't caught any of triggers, might be a new one, here is the dump"
    def causes = currentBuild.rawBuild.getCauses()
    println causes.dump()
}

我认为一个构建可能有不止一个触发器,如果是这样的话,你的子句的顺序很重要。

一旦你明白了这一点,只有当触发器符合你的定义时,你才能运行你的阶段。

            stage ('B'){
                when {
                    beforeAgent true
                    anyOf {
                       expression{return env.GIT_BRANCH == "origin/development"}
                       environment name: 'TRIGGERED_BY', value: 'timer'
                       environment name: 'TRIGGERED_BY', value: 'webhook'
                    }
 类似资料:
  • 问题内容: 已解决 :感谢S.Richmond的以下答复我需要取消所有类型的存储映射,这意味着将变量和使用后作废。 附加 :搜索此错误的人员可能有兴趣使用Jenkins管道步骤- 在此处查找更多信息。 我正在尝试使用Jenkins Pipeline从用户那里获取输入,该输入作为json字符串传递给作业。管道然后使用隔离器对此进行解析,然后选择重要信息。然后,它将使用该信息与不同的作业参数并行运行1

  • 下面是我简单的jenkins pipeline groovy脚本,它将用这两个阶段和我们想要构建的作业创建一个管道,我希望在job configuration下的脚本中每次都更新用于构建和代码分析的作业名,方法是从用户界面中获取数据,用户将使用Eclipse提供构建作业名和代码分析作业名- jenkinsfile脚本:-

  • 问题内容: 考虑一个詹金斯管道有两个阶段, A阶段 则 B阶段 。 在阶段B中,是否可以为某些特定文本解析阶段A的日志? 问题答案: 自7月28日以来已有更新! 正如mentionned 这个答案,作为2.4版本的_管道:节点和进程_ ,你可以使用: 至少,与输出到文件然后读取文件相比,它更加简单和干净。

  • 问题内容: 我们所有分支机构都有“阶段(构建)”。临时如何跳过此阶段,以便在多分支管道中的所有分支上运行。我知道一种解决方案是在阶段条件下使用,并要求所有开发人员将该分支拉入他们的分支。但这就是很多工作和协调。取而代之的是,我正在寻找一个全局配置,在该配置中,我们可以简单地按名称跳过任何分支上的阶段。 问题答案: 听起来好像您将Jenkinsfile放在代码的旁边,但是想要从管理的角度更改Jenk

  • 问题内容: 我有两条詹金斯管道,比方说管道A和管道B。我想在管道B中调用管道A。我怎样才能做到这一点? (管道A是管道B的子集。管道A负责执行一些日常工作,可以在管道B中重用) 我已经在计算机上安装了Jenkins 2.41。 问题答案: 以下解决方案对我有效: 在此处添加“管道:构建步骤”官方文档的链接:https : //jenkins.io/doc/pipeline/steps/pipeli

  • 我打算有一个带有Jenkins的光盘管道,它接受我的应用程序,将码头工人映像发布到我的私人码头工人存储库。我想我知道怎么做。 我不确定的是库伯内特斯部分。我想把那个图像部署到我的私人库伯内特斯集群(目前是1个主集群) 问:安装了 kubectl 和 docker 的詹金斯从站是否需要成为 Kubernetes 集群的一部分才能触发部署?如何触发该部署?