【发布时间】:2017-10-25 00:49:44
【问题描述】:
目前在我的公司使用 Jenkins,我设置了一个服务器供我们所有的工程师插入,这样做我做了一些服务器管理工作,让我的生活更轻松一些。其中之一是配置编辑器,用于编辑 $JENKINS_HOME/config.xml 文件并触发配置重新加载以反映新更改。
但是今天当我去使用那个工作时,我们的更改不再生效,当 ssh 进入服务器并cat-ing config.xml 文件时,它们也没有显示出来。
进行了一些调试,确保文件内容被正确替换,甚至将检查放入构建执行程序,以确保在运行reload-configuration 命令之前我知道一切都是正确的,方法是仔细检查 md5 总和作为整个内容在我的脚本中被替换。我什至在重新加载之前sleep 15-d,这样我就可以 cat config.xml 文件并确保我的更改在那里,而且它们总是在那里。
但是,一旦运行 reload 命令,我的所有更改都将替换为我进行更改之前的配置内容(我还在调试中从文件的 md5 总和中确认了这一点)
如果有帮助的话,这是我工作的执行人:
$CONFIG_FILE 始终是$JENKINS_HOME/config.xml
#!/bin/bash
set -o pipefail -e -u -x
cp "$CONFIG_FILE" "$WORKSPACE/config_backup.xml"
printf "Creating an AMI profile with these parameters: \n\n\
Config File: | $CONFIG_FILE \n\
AMI ID: | $AMI_ID \n\
Description: | $DESCRIPTION \n\
Instance Type: | $INSTANCE_TYPE \n\
Security Groups: | $SECURITY_GROUPS \n\
Remote Workspace: | $REMOTE_WORKSPACE \n\
Label(s): | $LABELS \n\
Subnet ID: | $SUBNET_ID \n\
IAM Profile: | $IAM_INSTANCE_PROFILE \n\
Instance Tags: | $TAGS \n\
Executors: | $EXECUTORS \
\n\n\
"
new_xml="$(python "$WORKSPACE/<scriptname removed for security reasons>" \
--file $CONFIG_FILE \
--ami $AMI_ID \
--description $DESCRIPTION \
--type $INSTANCE_TYPE \
--security-groups $SECURITY_GROUPS \
--remote-workspace $REMOTE_WORKSPACE \
--labels $LABELS \
--iam-instance-profile $IAM_INSTANCE_PROFILE \
--subnet-id $SUBNET_ID \
--tags $TAGS \
--executors $EXECUTORS)" || true
if [ -z "$new_xml" ]; then
echo "Ran into an error..."
cat "xml_ami_profile_parser.log"
exit 1
fi
echo "setting new config file content..."
echo "$new_xml" > "$CONFIG_FILE"
echo "config file set!"
CONFIG_MD5="$(md5sum "$CONFIG_FILE" | awk '{print $1}')"
NEW_MD5="$(echo "$new_xml" | md5sum | awk '{print $1}')"
printf "comparing MD5 Sums: \n\
[ $CONFIG_MD5 ] \n\
[ $NEW_MD5 ]\n\n"
if [[ "$CONFIG_MD5" != "$NEW_MD5" ]]; then
echo "Config File ($CONFIG_FILE) was not overwritten successfully. Restoring backup..."
cp "$WORKSPACE/config_backup.xml" "$CONFIG_FILE"
exit 1
fi
# use jenkins api user info
USERNAME="$(cat <scriptname removed for security reasons> | awk '{print $8}')"
PASSWORD="$(cat <scriptname removed for security reasons> | awk '{print $9}')"
curl -X POST -u "$USERNAME:$PASSWORD" "<url removed for security reasons>"
sleep 10
NEW_MD5="$(md5sum "$CONFIG_FILE" | awk '{print $1}')"
printf "comparing MD5 Sums: \n\
[ $CONFIG_MD5 ] \n\
[ $NEW_MD5 ]\n\n"
if [[ "$CONFIG_MD5" != "$NEW_MD5" ]]; then
echo "Config file reverted after reload, marking build as error."
exit 1
fi
非常感谢任何帮助!
编辑:
这是现在的通用输出,无法通过它:
setting new config file content...
config file set!
comparing MD5 Sums:
[ 58473de6acbb48b2e273e3395e64ed0f ]
[ 58473de6acbb48b2e273e3395e64ed0f ]
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
comparing MD5 Sums:
[ 58473de6acbb48b2e273e3395e64ed0f ]
[ f521cec2a2e376921995f773522f78e1 ]
Config file reverted after reload, marking build as error.
Build step 'Execute shell' marked build as failure
Finished: FAILURE
【问题讨论】:
-
您如何设置针对 Jenkins 的身份验证?有没有?如果是这样,在尝试更改作业配置之前,您的脚本是否成功登录 Jenkins?
-
手动运行时在 Jenkins 之外一切正常吗?
-
@RamanSailopal 我在盒子上做了一个脚本,它运行完全一样,正确替换
config.xml,然后在重新加载后恢复。 -
@AndrewGray 身份验证设置为使用 linux 机器用户/组来委派登录信息(因为我们公司使用 LDAP 和 AD)然后我们在 Jenkins 中创建角色并将用户/组附加到角色权限。但是是的,它正在成功登录,否则 curl 命令会返回 401 并触发构建终止,然后再重新检查 md5 总和
-
用解释解决了我自己的问题