docker - Jenkins Pipeline ${params.Environment} 错误替换
问题描述
我正在尝试通过 Jenkins 管道向 docker run 中的 docker 容器发送命令。Jenkins 机器在不同的服务器上,而 docker 镜像在不同的服务器上。当我对环境参数进行硬编码时,脚本会按预期执行。但是每当我尝试用参数替换它时,它都会出错:
bash: ${params.Environment} 错误替换
这是我的管道脚本
pipeline {
agent any
parameters {
choice(
name: 'Environment',
choices: ['qa','dev'],
description: 'Passing the Environment'
)
}
stages {
stage('Environment') {
steps {
echo " The environment is ${params.Environment}"
}
}
stage('run') {
steps {
sh 'ssh 10.x.x.x \'sudo docker run --name docker_container_name docker_image_name sh -c "cd mytests ; pip3 install -r requirements.txt ; python3 runTests.py -env ${params.Environment} "\''
}
}
}
}
解决方案
命令的sh
参数需要有双引号,或者三重双引号。
sh """ssh 10.x.x.x 'sudo docker run --name docker_container_name docker_image_name sh -c "cd mytests ; pip3 install -r requirements.txt ; python3 runTests.py -env ${params.Environment} "'"""
在管道脚本使用的 Groovy 语言中,单引号字符串根本不做任何插值,因此${params.Environment}
字符串按原样传递给 shell。 双引号字符串会执行插值,因此 Groovy 引擎会${params.Environment}
在调用 shell 之前进行替换。
(您可能会查看对Using Docker with Pipeline的原生支持,它可以避免ssh 'sudo "..."'
包装,尽管它要求 Jenkins 能够在工作节点上运行 Docker 本身。)
推荐阅读
- powershell - Powershell:不正确的返回为最高值
- sonarqube - 在向 ActiveMQ 发送消息的情况下删除 Thread.sleep()
- android - Android 下载文件到内部应用空间
- c# - 你如何获得远程计算机的主机名?
- r - 使用系统和回声未提供正确的文本
- java - 在 NestedScrollView 中隐藏滚动视图并取而代之
- php - 更新今天 created_at 的记录 - Laravel
- mysql - 带有 MySql 提供程序的实体框架核心上的许多“包含”
- python - 模拟新行,Python比SAS慢很多,如何加速?
- java - PSQLException:错误:重复键值违反唯一约束