Passing minion list to Jenkins pipeline, Error: workflowScript: 15: illegal string body character after dollar sign;
Passing minion list to Jenkins pipeline, Error: workflowScript: 15: illegal string body character after dollar sign;
下面是 Jenkins 管道。 运行s 是针对存储在 salt 主服务器上的 .txt 文件中的 minions 列表的状态。下面的命令 运行 在 salt master cli 上没问题:
salt --list `awk -vORS=, '{ print }' /srv/salt/TMjenkins/minions.txt | sed 's/,$/\n/'` test.ping
但是,当我 运行 它通过 Jenkins 管道时,我在美元符号后得到非法的字符串正文字符。 salt master 在远程服务器中,因此我无法在本机执行 cmd。
所以,到目前为止,我已经尝试在“””“””和''''''中传递cmd,还有{print \"${1}\"}。到目前为止没有任何效果。任何建议,不胜感激。
pipeline = {
ansiColor('xterm') {
def remote = [:]
remote.name = 'saltmaster'
remote.host = 'xx.xxx.xx.x'
remote.allowAnyHosts = true
withCredentials([usernamePassword(credentialsId: 'saltmaster', passwordVariable: 'password', usernameVariable: 'ops')]) {
remote.user = 'xxx'
remote.password = password
stage('Filetransfer') {
sshCommand remote: remote, command: " salt -L `awk -vORS=, '{ print \"\" }' /srv/salt/TMjenkins/minions.txt | sed 's/,$/\n/'` test.ping "
}
}
sh '/home/jenkins/jenkins-data/slack_notification.sh " ${minionid}" "Deployment finished successfully" "good" ":jenkins:"'
}
}
postFailure = {
sh '/home/jenkins/jenkins-data/slack_notification.sh " ${minionid}" "Unfortunately deployment was unsuccessful this time" "danger" ":jenkinserror:"'
}
postAlways = {
echo 'Cleaning Workspace now'
env.WORKSPACE = pwd()
sh "rm ${env.WORKSPACE}/* -fr"
}
node{
properties([
parameters([
string(name: 'Region', defaultValue: '', description: 'Region for which the process should run. ')
])
])
try {
pipeline()
} catch (e) {
postFailure()
throw e
} finally {
postAlways()
}
}
如果你想通过它,你需要转义你的 $
标志。所以:
awk -vORS=, '{ print }' /srv/salt/TMjenkins/minions.txt
变成
sh "awk -vORS=, '{ print $1 }' /srv/salt/TMjenkins/minions.txt "
和
sed 's/,$/\n/'
变成
sh "sed 's/,$/\n/'"
最后,不要使用 bash 脚本发送 Slack 通知,您应该使用 Slack plugin for Jenkins,像这样:
slackSend color: "danger", text: "Failed"
下面是 Jenkins 管道。 运行s 是针对存储在 salt 主服务器上的 .txt 文件中的 minions 列表的状态。下面的命令 运行 在 salt master cli 上没问题:
salt --list `awk -vORS=, '{ print }' /srv/salt/TMjenkins/minions.txt | sed 's/,$/\n/'` test.ping
但是,当我 运行 它通过 Jenkins 管道时,我在美元符号后得到非法的字符串正文字符。 salt master 在远程服务器中,因此我无法在本机执行 cmd。 所以,到目前为止,我已经尝试在“””“””和''''''中传递cmd,还有{print \"${1}\"}。到目前为止没有任何效果。任何建议,不胜感激。
pipeline = {
ansiColor('xterm') {
def remote = [:]
remote.name = 'saltmaster'
remote.host = 'xx.xxx.xx.x'
remote.allowAnyHosts = true
withCredentials([usernamePassword(credentialsId: 'saltmaster', passwordVariable: 'password', usernameVariable: 'ops')]) {
remote.user = 'xxx'
remote.password = password
stage('Filetransfer') {
sshCommand remote: remote, command: " salt -L `awk -vORS=, '{ print \"\" }' /srv/salt/TMjenkins/minions.txt | sed 's/,$/\n/'` test.ping "
}
}
sh '/home/jenkins/jenkins-data/slack_notification.sh " ${minionid}" "Deployment finished successfully" "good" ":jenkins:"'
}
}
postFailure = {
sh '/home/jenkins/jenkins-data/slack_notification.sh " ${minionid}" "Unfortunately deployment was unsuccessful this time" "danger" ":jenkinserror:"'
}
postAlways = {
echo 'Cleaning Workspace now'
env.WORKSPACE = pwd()
sh "rm ${env.WORKSPACE}/* -fr"
}
node{
properties([
parameters([
string(name: 'Region', defaultValue: '', description: 'Region for which the process should run. ')
])
])
try {
pipeline()
} catch (e) {
postFailure()
throw e
} finally {
postAlways()
}
}
如果你想通过它,你需要转义你的 $
标志。所以:
awk -vORS=, '{ print }' /srv/salt/TMjenkins/minions.txt
变成
sh "awk -vORS=, '{ print $1 }' /srv/salt/TMjenkins/minions.txt "
和
sed 's/,$/\n/'
变成
sh "sed 's/,$/\n/'"
最后,不要使用 bash 脚本发送 Slack 通知,您应该使用 Slack plugin for Jenkins,像这样:
slackSend color: "danger", text: "Failed"