目前在我的公司使用Jenkins,我为所有工程师设置了一个服务器插件,这样做我做了一些服务器管理工作,让我的生活更轻松一点。其中一个是配置编辑器,用于编辑$JENKINS_HOME/config.xml
文件并触发配置重新加载以反映新的更改。
然而今天,当我去使用那份工作时,我们不再生效的更改,当ssh进入服务器并cat
- 在config.xml文件中时,它们也没有显示。< / p>
做了一些调试,确保文件内容被正确替换,甚至将检查放入构建执行器,以确保在运行reload-configuration
命令之前通过双重检查md5总和来确定一切正确因为整个内容在我的脚本中被替换。我甚至在重新加载之前sleep 15
- d,所以我可以捕获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
答案 0 :(得分:0)
对于每个人来到这里,我解决了自己的问题。詹金斯有自己的故障保护,以保持正常运行时间,但没有给你任何通知它这样做。如果用一个插件无法正确解析的东西替换config.xml(在我的情况下是Amazon EC2插件),那么插件告诉Jenkins配置文件是坏的,Jenkins将恢复到最后一个正确的XML文件使用(通常是它在记忆中的那个)。
如果发生这种情况,请仔细检查您是否使用了特殊字符。
我的违规代码是标签部分的输出,包括html字符转换引用"
- &gt; "
并且插件无法解析此问题。这完全不同于:
<tags>
<hudson.plugins.ec2.EC2Tag>
<name>"Email</name>
<value><removed for security reasons>"</value>
</hudson.plugins.ec2.EC2Tag>
<hudson.plugins.ec2.EC2Tag>
<name>"Name</name>
<value><removed for security reasons>"</value>
</hudson.plugins.ec2.EC2Tag>
</tags>
和
<tags>
<hudson.plugins.ec2.EC2Tag>
<name>Email</name>
<value><removed for security reasons></value>
</hudson.plugins.ec2.EC2Tag>
<hudson.plugins.ec2.EC2Tag>
<name>Name</name>
<value><removed for security reasons></value>
</hudson.plugins.ec2.EC2Tag>
</tags>