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

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

穆博简
2023-03-14

我编写了一个通用管道,它接受几个参数,以便将预定义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"
                }
            }
        }
    }
}

共有3个答案

秋煌
2023-03-14

您可以使用脚本化管道来实现这一点,它基本上应该是这样的

node('master') {
    checkout scm
    stash includes: 'deploy-script.ps1', name: 'deploy-script'
}

def stepsForParallel = [:]
env.AGENTS.split(' ').each { agent ->
    stepsForParallel["deploy ${agent}"] = { ->

    node(agent) {
        unstash 'deploy-script'
    }
}
parallel stepsForParallel
燕扬
2023-03-14

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

您的Jenkinsfile在您的jenkins配置中,并以此方式发送给您的每个代理。您的代理上不需要git

由于您使用git,SCM=git。你是说:我的管道需要从git存储库中获取。您正在声明要在代理{label agentLabel}上运行的部署步骤,因此该步骤应该在主代理以外的另一个代理上运行。您如何想象代理可以让Jenkinsfile的内容知道该做什么,而不使用git?

  • 您的主代理被触发需要构建
杨飞语
2023-03-14

我认为skipDefaultCheckout是您想要的:

pipeline {
    options {
        skipDefaultCheckout true
    }

    stages {
        stage('Prep') {
                steps {
                    script {
                            ........................
                    }
                }       
        }
    }
}

看看留档:

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

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

 类似资料:
  • 我的问题是我的pyspark作业没有并行运行。 代码和数据格式: 我的PySpark如下所示(显然是简化的): PySpark的全部要点是并行运行这个东西,显然不是这样。我在各种集群配置中运行了这些数据,最后一个配置是大量的,这时我注意到它是单一节点使用的。因此,为什么我的工作需要很长时间才能完成,而时间似乎与集群规模无关。 所有较小数据集的测试在我的本地机器和集群上都没有问题。我真的只是需要高档

  • 我刚开始用几个Raspberry pi设备创建自己的Kubernetes集群。我用的是Alex Ellis的指南。但是我有一个问题,我的NodePort只能从实际运行容器的Pod中工作。因此没有从不运行容器的Pod进行重定向。 服务部署(&D kubectl get服务 在不同于主机的节点上和总是返回连接定时。 sudo iptables-保存(在230主节点上) sudo iptables-保存

  • 我的一台远程机器上有硒集线器,其他机器也有硒节点。 是有集线器的机器,我有一个本地节点和一个远程节点。 两者都连接到远程集线器,但是chrome不在远程节点上运行,而是在本地运行。 当我运行上面的代码(在远程节点上)时,我得到以下异常: 硒。常见的例外。WebDriverException:Message:u“未知错误:Chrome无法启动:崩溃\n(驱动程序信息:chromedriver=2.1

  • 我对在Mesos上测试Spark运行感兴趣。我在Virtualbox中创建了一个Hadoop2.6.0单节点集群,并在其上安装了Spark。我可以使用Spark成功地处理HDFS中的文件。

  • 我试图在正式生产环境中对cassandra节点运行nodetool修复,但没有成功,它给出了以下错误。 **在 /10.253.189.222 中验证失败(进度:0%) DEBUG[ReadRepairStage:99093]2018-11-22 06:29:35,411 ReadCallback.java:234摘要不匹配:org . Apache . Cassandra . service .

  • 目前,Jenkins 上有多个管道(A、B、C)和节点(X、Y、Z)。我们启用了 Throttle Concurrent Builds 插件,以确保管道中只有一个构建在单个节点上运行。 问题是,使用这种方法,来自不同管道的构建可能会发生冲突(例如,管道A可能已经在节点X上执行,我们不希望任何其他管道在节点X上执行,直到管道A完成)。TCB插件确保来自单个管道的多个构建不会在一个节点上运行,但它不会