31

我正在尝试创建一个用于设置 Jenkins 的 bash 脚本。有没有办法从 Jenkins 终端更新插件列表?

在第一次设置时,列表中没有可用的插件

IE:

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

行不通

4

6 回答 6

44

一个简单但可行的方法是首先列出所有已安装的插件,查找更新并安装它们。

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,它会自动升级到最新版本。

最后你必须重新启动詹金斯。

把它们放在一起(可以放在一个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
于 2014-09-03T15:06:20.153 回答
32

您实际上可以从计算机终端(而不是 Jenkins 终端)安装插件。

  1. 从插件站点下载插件 ( http://updates.jenkins-ci.org/download/plugins)
  2. 将该插件复制到$JENKINS_HOME/plugins目录中
  3. 此时要么启动 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
于 2012-02-14T00:11:44.137 回答
7

这是使用 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

这是您可以在以下位置找到的更完整示例的一部分: https ://github.com/sakaal/service_platform_ansible/blob/master/roles/jenkins_ci/tasks/main.yaml

随意调整它以适应您的需求。

于 2014-11-15T23:43:46.123 回答
3

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

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
于 2014-10-13T15:26:35.540 回答
1

仅供参考——除非您使用它们的短名称,否则某些插件(尤其是 mercurial)无法从命令行正确安装。我认为这与 jenkins 包信息数据中的触发器有关。127.0.0.1:8080/pluginManager/checkUpdates您可以通过在支持 javascript 的浏览器中访问来模拟 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.

于 2013-10-16T21:11:39.153 回答
0

使用当前的 Jenkins 版本,只能通过 SSH 使用 CLI。这必须在管理界面的“全局安全设置”页面中启用,如文档中所述。此外,应该触发更新的用户必须添加其公共 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。

于 2020-07-25T10:11:07.120 回答