Unix sed:-e表达式#1,字符20:unterminated`s';詹金斯管道中的命令
我把我的docker图片上传到nexus。我需要把最新的图片放到Ansible剧本上 下面是我的代码和ansible文件Unix sed:-e表达式#1,字符20:unterminated`s';詹金斯管道中的命令,unix,jenkins,sed,ansible,jenkins-pipeline,Unix,Jenkins,Sed,Ansible,Jenkins Pipeline,我把我的docker图片上传到nexus。我需要把最新的图片放到Ansible剧本上 下面是我的代码和ansible文件 def dockerTag(){ env.Docker_tag = sh (script: "git rev-parse --short HEAD | tr -d '\n'", returnStdout: true) } pipeline{ agent any stages{ stage('Git checko
def dockerTag(){
env.Docker_tag = sh (script: "git rev-parse --short HEAD | tr -d '\n'", returnStdout: true)
}
pipeline{
agent any
stages{
stage('Git checkout'){
steps {
git 'https://github.com/xxxxx/'
}
}
stage('Maven Build'){
steps {
withCredentials([usernamePassword(credentialsId: 'mvn-credentials', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
sh "/opt/maven/bin/mvn -s /opt/maven/conf/settings.xml package -Dproject.username=${USERNAME} -Dproject.password=${PASSWORD}"
}
}
}
stage('Build Docker Image'){
steps{
dockerTag()
sh "docker build . -t 10.220.110.10:8083/halosys:${dockerTag()}"
}
}
stage('Push Docker Image to Nexus'){
steps{
withCredentials([string(credentialsId: 'pwd', variable: 'nexus3')]) {
sh "docker login -u admin -p ${nexus3} 10.220.110.10:8083"
sh "docker push 10.220.110.10:8083/halosys:${dockerTag()}"
}
}
}
stage('Running Ansible playbook'){
steps{
dockerTag()
sh '''
echo $Docker_tag
sed -i "s/docker_tag/$Docker_tag/g" nexus-image-pull.yml
'''
}
}
}
}
当我试图从Nexus获取最新图像并将值替换为yml文件时。我遇到了类似
sed -i 's/docker_tag/01255bc
/g' nexus-image-pull.yml
sed: -e expression #1, char 20: unterminated `s' command
请帮助解决此问题您可能引入了反勾号而不是撇号:这一行中有两个不同的标记(未终止的's'),这表明这可能是一个简单的解决方法 sed-ir's/docker_tag/01255bc/g'nexus-image-pull.yml sed:-e 表达式#1,char 20:unterminated's'命令
你能这样试试吗:
sed-e's!码头工人标签“$Docker\u标签”\'!g\'
这里我使用的是在sed
和\
中,code>作为分隔符用于转义'
在bash中,该命令类似于:sed-e的!码头工人标签“$Docker_tag”!g'
但是由于您使用的是:sh'',其中已经使用了'
,因此我们必须在sed中转义'
更新:
当你写到:sed-I's/docker_tag/01255bc/g'nexus-image-pull.yml sed:-e expression#1,char 20:unterminated's'command关于01255bc和/之间的空格
在管道的控制台日志中,它必须如下所示:
sed -i 's/docker_tag/01255bc
/g' nexus-image-pull.yml
sed: -e expression #1, char 20: unterminated `s' command
因此,我尝试运行您的管道,我认为您面临的问题是由于git提交id末尾的换行字符\n
但是,我根据我为其他东西创建的工作脚本修改了脚本,它正在为我运行。我的脚本版本:
def dockerTag(){
env.Docker_tag = sh (script: "git rev-parse --short HEAD | tr -d '\n'", returnStdout: true)
}
pipeline{
agent any
stages {
stage('Running Ansible playbook'){
steps{
dockerTag()
sh '''
echo $Docker_tag
sed -i "s/docker_tag/$Docker_tag/g" nexus-image-pull.yml
'''
}
}
}
}
我已经像sh''sed-ie'一样更新了你的代码!码头工人标签“$Docker\u标签”\'!g\'''nexus image-pull.yml'我仍然得到了与sed相同的错误:-e expression#1,char 20:unterminated`s'命令尝试运行cat nexus-image-pull.yml | sed-e“s/docker_tag/$docker_tag/g”
,看看它是否运行。这将只输出修改后的文件,不会改变原始文件,甚至cat nexus-image-pull.yml | sed-e“s/docker_tag/$docker_tag/g”
给我同样的错误我刚刚更新了答案并在那里共享了一个工作脚本。也许可以尝试一下?您不需要到处调用dockerTag(),只需在git代码签出阶段调用它一次,然后在其他地方使用$Docker_标记即可。
def dockerTag(){
env.Docker_tag = sh (script: "git rev-parse --short HEAD | tr -d '\n'", returnStdout: true)
}
pipeline{
agent any
stages {
stage('Running Ansible playbook'){
steps{
dockerTag()
sh '''
echo $Docker_tag
sed -i "s/docker_tag/$Docker_tag/g" nexus-image-pull.yml
'''
}
}
}
}