我正在尝试创建一个用于设置Jenkins的bash脚本。是否有任何方法可以从Jenkins终端更新插件列表?
在第一次设置时,列表上没有可用的插件。
即:
java -jar jenkins-cli.jar -s `http://localhost:8080` install-plugin dry
无法工作
我正在尝试创建一个用于设置Jenkins的bash脚本。是否有任何方法可以从Jenkins终端更新插件列表?
在第一次设置时,列表上没有可用的插件。
即:
java -jar jenkins-cli.jar -s `http://localhost:8080` install-plugin dry
无法工作
一个简单但有效的方法是首先列出所有已安装的插件,查找更新并安装它们。
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins
每个有可用更新的插件,在其末尾都会有新版本号括在括号里。所以你可以使用grep来搜索:
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins | grep -e ')$' | awk '{ print $1 }'
如果你使用插件名称调用install-plugin命令,它将自动升级到最新版本。
最后,你需要重启Jenkins。
将所有步骤放在一起(可以放在一个shell脚本中):
UPDATE_LIST=$( java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins | grep -e ')$' | awk '{ print $1 }' );
if [ ! -z "${UPDATE_LIST}" ]; then
echo Updating Jenkins Plugins: ${UPDATE_LIST};
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ install-plugin ${UPDATE_LIST};
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ safe-restart;
fi
您实际上可以从计算机终端(而非Jenkins终端)安装插件。
http://updates.jenkins-ci.org/download/plugins
)下载插件$JENKINS_HOME/plugins
目录中http://yourservername:8080/jenkins/reload
)这将在Jenkins中启用插件,假设Jenkins已启动。
cd $JENKINS_HOME/plugins
curl -O http://updates.jenkins-ci.org/download/plugins/cobertura.hpi
curl http://yourservername:8080/reload
以下是如何使用Ansible部署Jenkins CI插件的方法,当然,这需要从终端中运行。此代码是roles/jenkins_ci/tasks/main.yaml
的一部分:
- name: Plugins
with_items: # PLUGIN NAME
- name: checkstyle # Checkstyle
- name: dashboard-view # Dashboard View
- name: dependency-check-jenkins-plugin # OWASP Dependency Check
- name: depgraph-view # Dependency Graph View
- name: deploy # Deploy
- name: emotional-jenkins-plugin # Emotional Jenkins
- name: monitoring # Monitoring
- name: publish-over-ssh # Publish Over SSH
- name: shelve-project-plugin # Shelve Project
- name: token-macro # Token Macro
- name: zapper # OWASP Zed Attack Proxy (ZAP)
sudo: yes
get_url: dest="{{ jenkins_home }}/plugins/{{ item.name | mandatory }}.jpi"
url="https://updates.jenkins-ci.org/latest/{{ item.name }}.hpi"
owner=jenkins group=jenkins mode=0644
notify: Restart Jenkins
get_url
模块只会在文件不存在时获取文件,这意味着您的playbook只会安装新插件,而不是更新。这是正确的吗? - benzadocurl -s -L http://updates.jenkins-ci.org/update-center.json | sed '1d;$d' | curl -s -X POST -H 'Accept: application/json' -d @- http://localhost:8080/updateCenter/byId/default/postBack
127.0.0.1:8080/pluginManager/checkUpdates
来模拟jenkins自己的软件包更新。import urllib2,requests
UPDATES_URL = 'https://updates.jenkins-ci.org/update-center.json?id=default&version=1.509.4'
PREFIX = 'http://127.0.0.1:8080'
def update_plugins():
"look at the source for /pluginManager/checkUpdates and downloadManager in /static/<whatever>/scripts/hudson-behavior.js"
raw = urllib2.urlopen(self.UPDATES_URL).read()
jsontext = raw.split('\n')[1] # ugh, JSONP
json.loads(jsontext) # i.e. error if not parseable
print 'received updates json'
# post
postback = PREFIX+'/updateCenter/byId/default/postBack'
reply = requests.post(postback,data=jsontext)
if not reply.ok:
raise RuntimeError(("updates upload not ok",reply.text))
print 'applied updates json'
一旦您运行了这个命令,您应该能够运行 jenkins-cli -s http://127.0.0.1:8080 install-plugin mercurial -deploy
。
Groovy路径有一个巨大的优势:可以在作业的“系统 Groovy 脚本”构建步骤中添加,无需进行任何更改。
创建文件 'update_plugins.groovy' 并包含以下内容:
jenkins.model.Jenkins.getInstance().getUpdateCenter().getSites().each { site ->
site.updateDirectlyNow(hudson.model.DownloadService.signatureCheck)
}
hudson.model.DownloadService.Downloadable.all().each { downloadable ->
downloadable.updateNow();
}
def plugins = jenkins.model.Jenkins.instance.pluginManager.activePlugins.findAll {
it -> it.hasUpdate()
}.collect {
it -> it.getShortName()
}
println "Plugins to upgrade: ${plugins}"
long count = 0
jenkins.model.Jenkins.instance.pluginManager.install(plugins, false).each { f ->
f.get()
println "${++count}/${plugins.size()}.."
}
if(plugins.size() != 0 && count == plugins.size()) {
println "restarting Jenkins..."
jenkins.model.Jenkins.instance.safeRestart()
}
然后执行这个curl命令:
curl --user 'username:token' --data-urlencode "script=$(< ./update_plugins.groovy)" https://jenkins_server/scriptText
在当前的Jenkins版本中,CLI只能通过SSH使用。必须在管理界面的“全局安全设置”页面中启用此功能,如docs所述。此外,应触发更新的用户必须添加其公共SSH密钥。
使用已接受答案的修改后的shell脚本,可以按以下方式自动化操作,只需替换HOSTNAME和USERNAME:
#!/bin/bash
jenkins_host=HOSTNAME #e.g. jenkins.example.com
jenkins_user=USERNAME
jenkins_port=$(curl -s --head https://$jenkins_host/login | grep -oP "^X-SSH-Endpoint: $jenkins_host:\K[0-9]{4,5}")
function jenkins_cli {
ssh -o StrictHostKeyChecking=no -l "$jenkins_user" -p $jenkins_port "$jenkins_host" "$@"
}
UPDATE_LIST=$( jenkins_cli list-plugins | grep -e ')$' | awk '{ print $1 }' );
if [ ! -z "${UPDATE_LIST}" ]; then
echo Updating Jenkins Plugins: ${UPDATE_LIST};
jenkins_cli install-plugin ${UPDATE_LIST};
jenkins_cli safe-restart;
else
echo "No updates available"
fi
这个命令会查找Jenkins CLI使用的SSH端口,然后通过SSH连接而不检查主机密钥,因为每次Jenkins重启时它都会更改。
然后升级所有可用更新的插件,最后重新启动Jenkins。
-auth @~/.ssh/jenkins.txt
进行身份验证,例如:java -jar ~/tmp/jenkins-cli.jar -s https://jenkins.server.com -auth @~/.ssh/jenkins.txt list-plugins
其中~/.ssh/jenkins.txt
是包含您的用户名:密码
信息的文件。 - hit3kssh -p $port jenkins.example.com list-plugins
。请参阅 https://www.jenkins.io/doc/book/managing/cli/#ssh 了解如何设置它。 - andrewdotn... | grep -e ')$' | awk '{ print $1 }'
可以缩短为... | awk ' /)$/ {print $1}'
。少用一根管道。 - SiKing