【问题标题】:Jenkins Reload Configuration Removes ChangesJenkins 重新加载配置删除更改
【发布时间】: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 总和
  • 用解释解决了我自己的问题

标签: bash jenkins


【解决方案1】:

对于以后遇到此问题的每个人,我都解决了自己的问题。 Jenkins 有自己的故障保险机制来保持正常运行时间,但不会通知您这样做。如果您将 config.xml 替换为插件无法正确解析的内容(在我的情况下为 Amazon EC2 插件),那么插件会告诉 Jenkins 配置文件错误,Jenkins 将恢复到上一个​​正确的 XML 文件使用(通常是它在内存中的那个)。

如果您遇到这种情况,请仔细检查您没有使用特殊字符。

我的违规代码是标签部分的输出,包括 html char 转换的引号" -> &amp;quot;,插件无法解析。只是在以下方面有所不同:

 <tags>
    <hudson.plugins.ec2.EC2Tag>
      <name>&quot;Email</name>
      <value><removed for security reasons>&quot;</value>
    </hudson.plugins.ec2.EC2Tag>
    <hudson.plugins.ec2.EC2Tag>
      <name>&quot;Name</name>
      <value><removed for security reasons>&quot;</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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多