jenkins - 如果 Jenkins 管道被 dockerized,如何在 docker 主机上执行单步或构建后操作?
问题描述
假设我有一个包含多个步骤的 dockerized 管道。docker 容器在开头定义Jenkinsfile
:
pipeline {
agent {
docker {
image 'gradle:latest'
}
}
stages {
// multiple steps, all executed in 'gradle' container
}
post {
always {
sh 'git whatever-command' // will not work in 'gradle' container
}
}
}
我想git
在构建后操作中执行一些命令。问题是gradle
图像没有git
可执行文件。
script.sh:第 1 行:git:找不到命令
如何在 Docker 主机上执行它仍然使用gradle
容器进行所有其他构建步骤?当然,我不想为每个步骤明确指定容器,而是指定特定的 post-post 操作。
解决方案
好的,下面是我的工作解决方案,将多个阶段(构建和测试)分组到单个 dockerized 阶段(Dockerized gradle)和在 docker 主机和 docker 容器之间重用的单个工作区(请参阅reuseNode
文档):
pipeline {
agent {
// the code will be checked out on out of available docker hosts
label 'docker'
}
stages {
stage('Dockerized gradle') {
agent {
docker {
reuseNode true // < -- the most important part
image 'gradle:6.5.1-jdk11'
}
}
stages{
// Stages in this block will be executed inside of a gradle container
stage('Build') {
steps{
script {
sh "gradle build -x test"
}
}
}
stage('Test') {
steps{
script {
sh "gradle test"
}
}
}
}
}
stage('Cucumber Report') {
// this stage will be executed on docker host labeled 'docker'
steps {
cucumber 'build/cucumber.json'
}
}
}
post {
always {
sh 'git whatever-command' // this will also work outside of 'gradle' container and reuse original workspace
}
}
}
推荐阅读
- elementor - Elementor + W3C 验证器:“此时元素 div 上不允许属性 alt”适用于所有照片库项目
- typescript - 如果未提供位置,则在报告错误时必须提供节点。运行 ESLint 7.11.0 时出现 no-unused-vars 错误
- c# - 使用具有存储库和工作单元模式的实体框架更新一对多关系中的子级
- html - 了解视口元标记
- r - 创建基于按 ID 分组的另一列的值重新启动的序列变量
- python - 奇偶排序:在 CUDA 中使用多个块时结果不正确
- javascript - JavaScript:用 JS/HTML 选项卡替换 HTML 元素
- javascript - 我如何从这个 vue.js 对象创建购物车
- python - 引用函数python之外的变量
- python - 不确定此代码如何获取树直径