如何从终端更新jenkins插件?

tvz2xvvm  于 2022-11-21  发布在  Jenkins
关注(0)|答案(7)|浏览(265)

我正在尝试创建一个bash脚本来设置Jenkins。有没有办法从Jenkins终端更新插件列表?
在第一次安装时,列表中没有可用的插件
即:

java -jar jenkins-cli.jar -s `http://localhost:8080` install-plugin dry

行不通

mrphzbgm

mrphzbgm1#

一 个 简单 但 有效 的 方法 是 首先 列出 所有 已 安装 的 插件 , 寻找 更新 并 安装 它们 。
x1月 1 日
每个 有 更新 的 插件 , 在 最 后 的 括号 里 都 有 新 的 版本 。 所以 你 可以 用 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

中 的 每 一 个

x6h2sr28

x6h2sr282#

您实际上可以从计算机终端(而不是Jenkins终端)安装插件。
1.从插件网站下载插件(http://updates.jenkins-ci.org/download/plugins
1.将该插件复制到$JENKINS_HOME/plugins目录
1.此时,启动Jenkins或调用重新加载设置服务(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
7cwmlq89

7cwmlq893#

下面 是 使用 Ansible 部署 Jenkins CI 插件 的 方法 , 当然 Ansible 是 从 终端 使用 的 。

- 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

中 的 每 一 个
这 是 一 个 更 完整 示例 的 一 部分 , 您 可以 在 以下 位置 找到 该 示例 :https://github.com/sakaal/service_platform_ansible/blob/master/roles/jenkins_ci/tasks/main.yaml 的 最 大 值
您 可以 根据 自己 的 需要 随意 调整 。

zengzsys

zengzsys4#

您可以使用此命令行更新插件列表

curl -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
shyt4zoc

shyt4zoc5#

FYI --一些插件(特别是mercurial)不能从命令行正确安装,除非你使用它们的短名称。我认为这与jenkins包信息数据中的触发器有关。你可以通过在支持javascript的浏览器中访问127.0.0.1:8080/pluginManager/checkUpdates来模拟jenkins自己的包更新。
或者,如果你觉得自己是受虐狂,你可以运行下面的python代码:

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

h9vpoimq

h9vpoimq6#

在当前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

这将greps Jenkins CLI的已用SSH端口,然后通过SSH连接,而不检查主机密钥,因为每次Jenkins重新启动时主机密钥都会更改。
然后升级所有具有可用更新的插件,然后重新启动Jenkins。

qgelzfjb

qgelzfjb7#

在groovy中
groovy路径有一个很大的优势:可以将其添加到作业中的“systemgroovyscript”构建步骤中而无需任何更改。

使用以下内容创建文件“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

相关问题