仅在主节点上签出并运行 SCM 管道

luc*_*nza 5 groovy continuous-integration jenkins jenkins-pipeline

我编写了一个通用管道,它接受多个参数,以便将版本从预定义的 GitHub 存储库部署到特定节点。我想在 GitHub 上的 Jenkinsfile 上托管此管道,因此我将作业配置为使用“来自 SCM 的管道脚本”。事实是 - 当我尝试构建作业时 - Jenkinsfile 在每个节点上都会被检查。是否可以仅在主节点上签出并执行 Jenkinsfile 并按预期运行管道?

编辑:正如我之前所说,管道工作得很好,并且按预期将作业设置为与管道脚本一起使用。问题是,当我尝试将其更改为“来自 SCM 的管道脚本”时,Jenkinsfile 会在每个代理上进行检出,这是一个问题,因为除了 master 之外,我没有在任何代理上安装 git。我希望 Jenkinsfile 仅在主代理上签出并按预期执行。仅供参考以下管道:

def agents = "$AGENTS".toString()
def agentLabel = "${ println 'Agents: ' + agents; return agents; }"

pipeline {
    agent none

    stages {
        stage('Prep') {
            steps {
                script {
                    if (agents == null || agents == "") {
                        println "Skipping build"
                        skipBuild = true
                    }
                                    
                    if (!skipBuild) {
                        println "Agents set for this build: " + agents
                    }
                }
            }
        }
    
        stage('Powershell deploy script checkout') {
            agent { label 'master' }
        
            when {
                expression {
                    !skipBuild
                }
            }
        
            steps {
                git url: 'https://github.com/owner/repo.git', credentialsId: 'git-credentials', branch: 'main'
                stash includes: 'deploy-script.ps1', name: 'deploy-script'
            }
        }
    
        stage('Deploy') {
            agent { label agentLabel }
        
            when {
                expression {
                    !skipBuild
                }
            }
        
            steps {
                unstash 'deploy-script'
            
                script {
                    println "Execute powershell deploy script on agents set for deploy"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Fer*_*ndo 5

我认为这skipDefaultCheckout就是您正在寻找的:

pipeline {
    options {
        skipDefaultCheckout true
    }

    stages {
        stage('Prep') {
                steps {
                    script {
                            ........................
                    }
                }       
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

看一下文档:

SkipDefaultCheckout 默认情况下,在代理指令中跳过从源代码管理中检出代码。

https://www.jenkins.io/doc/book/pipeline/syntax/


Chr*_*aes 2

我认为你正在要求不可能的事情。

现在:

您的 Jenkinsfile 位于您的 jenkins 配置中,并按原样发送给您的每个代理。不需要git你的代理。

SCM 的管道脚本:

既然你用了git,SCM= git。所以你是说:我的管道需要从存储库中获取git。您正在声明Deploy要在 上运行的步骤agent { label agentLabel },因此该步骤应该在 master 之外的另一个代理上运行。您如何想象代理可以获取 Jenkinsfile 的内容来知道要做什么,但不使用git

詹金斯会发生什么?

  • 您的主代理被触发需要构建
  • git主代理使用(因为它是来自 SCM 的 Pipeline 脚本)签出 Jenkinsfile
  • jenkins 读取 Jenkinsfile 并查看需要做什么。
  • 对于准备阶段,我不太确定没有代理会发生什么,我猜这在主代理上运行。
  • Powershell部署脚本签出被标记为在主代理上运行,因此它在主代理上运行(请注意,Jenkinsfile 将再签出git两次:
    • 在开始阶段之前,因为詹金斯需要知道要执行什么
    • 由于您指定,可再结帐一次git url: 'https://github.com/owner/repo.git'...
  • 部署阶段被标记为在 上运行agentLabel因此 jenkins 尝试在该代理上签出您的 Jenkinsfile(使用git)...