【问题标题】:How to run all stages from jenkins job on same node when using agent docker?使用代理 docker 时,如何在同一节点上运行 jenkins 作业的所有阶段?
【发布时间】:2020-10-08 01:56:07
【问题描述】:

我有一个在 docker 代理上运行的 Jenkins 管道,每次它进入具有不同代理的阶段时,它都会更改 Jenkins 节点。如何强制它始终在同一个节点上运行?

我有 3 个节点:ma​​sterslave-1slave-2。我的管道有时,只是一个例子,从使用 ma​​ster 开始,然后当它调用代理 image-docker-1 时,它使用 slave-1 和然后当它调用代理 image-docker-2 时,它再次使用 ma​​ster

如何强制它始终使用 slave-1?我知道,如果我不使用 docker 作为代理,我可以使用类似的东西:

node (label: "slave-1") {
(...)

pipeline {
agent { label "slave-1 }
(...)

但我认为情况并非如此。

这是我的管道:

node {
properties([
          pipelineTriggers(
              [cron('H 00 * * 1-5') ]
          )]
  )
  workloadPipeline = load("ImagePull.groovy")
  workloadPipeline
}

pipeline {
  options {
    ansiColor('xterm')
    timestamps()
  }
  agent none    
  environment {
  TOKEN = credentials("token") 
  HOME = '.'
  }    
  stages {
    stage("initiating"){
      agent {
        docker {
          image 'image-docker-1'
          args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
        }
      }
      stages {
        stage('docker 1 scanning') {     
          steps {
            script {
              workloadPipeline.loopImages(Images)
            }
          }             
        }
        stage ('docker 1 test'){
         (...)
        }
      }
    }
    stage('docker 2 scanning') {
      agent {         
        docker {          
          image 'image-docker-2'
          args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'         
        }
      }
      steps {
        script {
            workloadPipeline.Scanning()
        }
      }
    }
  }
}

【问题讨论】:

    标签: jenkins


    【解决方案1】:

    通过使用 reuseNode true

    this example 找到了一个简单的解决方案
    pipeline {
    
    agent none
    
    stages {
    
        stage("Fix the permission issue") {
    
            agent any
    
            steps {
                sh "sudo chown root:jenkins /run/docker.sock"
            }
    
        }
    
        stage('Step 1') {
    
            agent {
                docker {
                    image 'nezarfadle/tools'
                    reuseNode true
                }
            }
    
            steps {
                sh "ls /"
            }
    
        }
    
    }
    

    }

    【讨论】:

    【解决方案2】:

    用途:

    agent { 
        docker {
            image 'image-docker-1'
            args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
            label 'slave-1'
        }
    }
    

    将它或放在管道级别,以便让所有阶段都使用它,或者如果您想按阶段分开,则在每个阶段

    感谢 João 的小修正 :)

    【讨论】:

      【解决方案3】:

      感谢@Washwater 的回答。事实上,我需要做一些改变。

      如果我使用您的建议,它会返回错误“未指定代理类型。必须是 [any, docker, dockerfile, label, none] 之一”

      agent { 
          node { label "slave-1" } 
          docker {
              image 'image-docker-1'
              args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
          }
      }
      

      所以,正确的语法必须是:

      agent { 
          docker {
              image 'image-docker-1'
              args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
              label "slave-1"
          }
      }
      

      【讨论】:

        【解决方案4】:

        -当我有多个标有“从属”的节点时,以下代码适用于我 'init' 阶段将从 'slaves' 中选择一个节点,随后的阶段将使用与 env.NODE_NAME 相同的节点(由 init 状态设置)

        pipeline {
         agent {
          node {
          labe 'slaves'
        }
        stages {
          stage ('init') {  steps  {echo "node is $NODE_NAME"} }
          stage ( 'test1') {
           agent {
             docker {
               label env.NODE_NAME
               image  nginx
             }
             steps {
               echo "test done"
             }
            }
           }
         }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-05
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-27
          相关资源
          最近更新 更多