使用代理docker时如何在同一节点上运行jenkins作业的所有阶段?

时间:2020-04-16 08:52:45

标签: jenkins

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

我有3个节点: master slave-1 slave-2 。我的管道有时只是一个例子,首先使用 master ,然后在调用代理 image-docker-1 时使用 slave-1 然后调用代理 image-docker-2 时,它将再次使用 master

如何强制它始终使用 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()
        }
      }
    }
  }
}

4 个答案:

答案 0 :(得分:2)

使用 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 /"
        }

    }

}

}

答案 1 :(得分:0)

使用:

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

将其放置在管道级别上,以供所有阶段使用,或者在每个阶段(如果要逐级分离)放置

感谢João的小修正:)

答案 2 :(得分:0)

感谢答案@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"
    }
}

答案 3 :(得分:0)

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

的同一节点
...
        elif keyboard.is_pressed('S'):
            if not was_pressed:
                if '@' in map1:
                    map1[place], map2[place] = map2[place], map1[place]
                    print(f"Moved {map1[place]}, {map2[place]} to {map2[place]} {map1[place]}")
                    print(*top, sep='')
                    print(*map1, sep='')
                    print(*map2, sep='')
                    print(*map3, sep='')
                    print(*bot, sep='')
                    was_pressed = True
                elif '@' in map2: # Now only runs once
                    map2[place], map3[place] = map3[place], map2[place]
                    print(f"Moved {map2[place]}, {map3[place]} to {map3[place]} {map2[place]}")
                    print(*top, sep='')
                    print(*map1, sep='')
                    print(*map2, sep='')
                    print(*map3, sep='')
                    print(*bot, sep='')
                    was_pressed = True
...