Docker 如何在Jenkins声明性管道中的代理安装过程中运行某些东西?

Docker 如何在Jenkins声明性管道中的代理安装过程中运行某些东西?,docker,jenkins,gradle,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.pro

我们目前的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映像之前存在此目录?

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

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'
    }
  }

}

管道在Manage Jenkins页面和文件夹级别提供了一个全局选项,用于指定运行基于Docker的管道所使用的代理(按标签)


如何确保
代理{docker{label'linux'}}
将获得与准备阶段相同的代理?已更新以限制某些主机上的docker代理。因此,此处是否有隐藏的详细信息?这两次它都只指定了一个标签,但是否可以保证即使有18台主机具有相同的标签,您也会得到相同的主机?您不能有重复的节点名(Jenkins Slaves)用作dockerWe的主机。实际上,我们没有重复的节点名“linux”是我们应用于18台主机的标签,这些主机都运行各种linux发行版。无论如何,我们当然不能将自己简化为在一台主机上运行,我们几乎没有足够的处理能力来按原样构建一切(