How can I update jenkins plugins from the terminal?

后端 未结 6 1894
庸人自扰
庸人自扰 2021-01-30 11:07

I am trying to create a bash script for setting up Jenkins. Is there any way to update a plugin list from the Jenkins terminal?

At first setup there is no plugin availab

相关标签:
6条回答
  • 2021-01-30 11:38

    A simple but working way is first to list all installed plugins, look for updates and install them.

    java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins

    Each plugin which has an update available, has the new version in brackets at the end. So you can grep for those:

    java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins | grep -e ')$' | awk '{ print $1 }'

    If you call install-plugin with the plugin name, it is automatically upgraded to the latest version.

    Finally you have to restart jenkins.

    Putting it all together (can be placed in a shell script):

    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
    
    0 讨论(0)
  • 2021-01-30 11:38

    Here is how you can deploy Jenkins CI plugins using Ansible, which of course is used from the terminal. This code is a part of 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
    

    This is a part of a more complete example that you can find at: https://github.com/sakaal/service_platform_ansible/blob/master/roles/jenkins_ci/tasks/main.yaml

    Feel free to adapt it to your needs.

    0 讨论(0)
  • 2021-01-30 11:47

    You can actually install plugins from the computer terminal (rather than the Jenkins terminal).

    1. Download the plugin from the plugin site (http://updates.jenkins-ci.org/download/plugins)
    2. Copy that plugin into the $JENKINS_HOME/plugins directory
    3. At that point either start Jenkins or call the reload settings service (http://yourservername:8080/jenkins/reload)

    This will enable the plugin in Jenkins and assuming that Jenkins is started.

    cd $JENKINS_HOME/plugins
    curl -O http://updates.jenkins-ci.org/download/plugins/cobertura.hpi
    curl http://yourservername:8080/reload
    
    0 讨论(0)
  • 2021-01-30 11:56

    You can update plugins list with this command line

    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
    
    0 讨论(0)
  • 2021-01-30 11:59

    With a current Jenkins Version, the CLI can just be used via SSH. This has to be enabled in the "Global Security Settings" page in the administration interface, as described in the docs. Furthermore, the user who should trigger the updates must add its public ssh key.

    With the modified shell script from the accepted answer, this can be automatized as follows, you just have to replace HOSTNAME and 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
    

    This greps the used SSH port of the Jenkins CLI and then connects via SSH without checking the host key, as it changes for every Jenkins restart.

    Then all plugins with an update available are upgraded and afterwards Jenkins is restarted.

    0 讨论(0)
  • 2021-01-30 12:00

    FYI -- some plugins (mercurial in particular) don't install correctly from the command line unless you use their short name. I think this has to do with triggers in the jenkins package info data. You can simulate jenkins' own package update by visiting 127.0.0.1:8080/pluginManager/checkUpdates in a javascript-capable browser.

    Or if you're feeling masochistic you can run this python code:

    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'
    

    And once you've run this, you should be able to run jenkins-cli -s http://127.0.0.1:8080 install-plugin mercurial -deploy.

    0 讨论(0)
提交回复
热议问题