如何在Jenkins声明式管道中的代理设置期间运行某些内容?

时间:2018-11-01 04:47:43

标签: docker jenkins gradle

我们当前的Jenkins管道如下所示:

pipeline {

  agent {
    docker {
      label 'linux'
      image 'java:8'
      args '-v /home/tester/.gradle:/.gradle'
    }
  }

  environment {
    GRADLE_USER_HOME = '/.gradle'
    GRADLE_PROPERTIES = credentials('gradle.properties')
  }

  stages {
    stage('Build') {
      steps {
        sh 'cp ${GRADLE_PROPERTIES} ${GRADLE_USER_HOME}/'
        sh './gradlew clean check'
      }
    }
  }

  post {
    always {
      junit 'build/test-results/**/*.xml'
    }
  }

}

我们挂载/.gradle是因为我们想在构建之间重用缓存的数据。问题是,如果该计算机是全新的构建计算机,则主机上的目录尚不存在。

我在哪里放置在之前运行的设置逻辑,以便可以确保在运行docker映像之前该目录存在?

1 个答案:

答案 0 :(得分:1)

您可以在所有阶段之前运行准备阶段,并在此之后更改代理

pipeline {

  agent { label 'linux' } // slave where docker agent needs to run

  environment {
    GRADLE_USER_HOME = '/.gradle'
    GRADLE_PROPERTIES = credentials('gradle.properties')
  }

  stages {

    stage('Prepare') {
      // prepare host
    }

    stage('Build') {

      agent {
        docker {
          label 'linux' // should be same as slave label
          image 'java:8'
          args '-v /home/tester/.gradle:/.gradle'
        }
      }

      steps {
        sh 'cp ${GRADLE_PROPERTIES} ${GRADLE_USER_HOME}/'
        sh './gradlew clean check'
      }
    }
  }

  post {
    always {
      junit 'build/test-results/**/*.xml'
    }
  }

}

Specifying a Docker Label

  

Pipeline在Manage Jenkins页面和Folder级别提供了一个全局选项,用于指定要使用哪些代理(按Label)来运行基于Docker的管道。

How to restrict the jenkins pipeline docker agent in specific slave?