Jenkins JNLP Agent的配置

Jenkins是一个单Master多Slave的集群架构(莫提什么Gearman)。 Jenkins Master是另一个比较大的话题,这里只谈Slave Agent。 (以前大多叫Slave,现在大多叫Agent。)

Jenkins的Agent大概分两种。 一是基于SSH的,需要把Master的SSH公钥配置到所有的Agent宿主机上去。 二是基于JNLP的,走HTTP协议,每个Agent需要配置一个独特的密码。 基于SSH的,可以由Master来启动;基于JNLP的,需要自己启动。 (1.611以后据说可以由Master启动了,但这版本5天前才更新,孤还没玩明白。)

本文介绍JNLP的Agent如何用systemd守护启动。 文末提供了Ansible Playbook的示例。

简单启动

Jenkins Node

如何用systemd守护启动在Jenkins Master新增Node以后,可以在界面上获取启动命令及agent.jar。 (上图虽然是官方的,但比较老了,仍然显示的是slave.jar。) 启动命令的大概形式如下:

java -jar agent.jar \
    -jnlpUrl http://jenkins.example.com/computer/NODE-NAME/slave-agent.jnlp \
    -secret a3868b087f3935cbb5195b26b4732aaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
    -workDir "/home/jenkins/"

简单启动,默认在前台,而且无法开机自启。 因什么原因挂掉以后,也不会自动重启。 所以,这只是用来验证的启动方式,不推荐在生产环境使用。

自动启动

这里的自动启动方案,是用systemd来守护。 虽然也有其它的可选项,比如supervisor

安装JRE

sudo apt install openjdk-8-jre

下载agent.jar

mkdir /opt/jenkins
curl http://jenkins.example.com/jnlpJars/agent.jar -o agent.jar

准备env.sh

/opt/jenkins/env.sh中,写入以下环境变量:

JNLP_URL=http://jenkins.example.com/computer/NODE-NAME/slave-agent.jnlp
JNLP_SECRET=a3868b087f3935cbb5195b26b4732aaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
JNLP_WORKDIR=/home/jenkins/

其中,JNLP_URLJNLP_SECRET需要根据节点信息而修改。

配置systemd

新增文件/etc/systemd/system/jenkins-agent.service

[Unit]
Description=Jenkins agent of http://jenkins.example.com

[Service]
User=jenkins
Group=jenkins
Type=simple
EnvironmentFile=/opt/jenkins/env.sh
ExecStart=/usr/bin/java -jar /opt/jenkins/agent.jar -jnlpUrl $JNLP_URL -secret $JNLP_SECRET -workDir "$JNLP_WORKDIR"
ExecStop=/usr/bin/pkill -f 'java -jar /opt/jenkins/agent.jar'
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

启动

配置完成后,可以通过systemctl管理,实现开机自启。

sudo systemctl daemon-reload
sudo systemctl enable jenkins-agent.service
sudo systemctl start jenkins-agent.service

参考

Ansible Playbook

---
- hosts:
  - jenkins
  remote_user: root
  tasks:
    - name: Install JRE 8
      apt:
        name: openjdk-8-jre

    - name: Create user jenkins
      user:
        name: jenkins
        comment: jenkins slave agent
        shell: /bin/bash
        groups: docker
        append: yes

    - name: mkdir /opt/jenkins
      file:
        name: /opt/jenkins
        state: directory

    - name: Download jar
      get_url:
        url: http://jenkins.example.com/jnlpJars/agent.jar
        dest: /opt/jenkins/agent.jar

    - name: Config systemd
      copy:
        src: ./jenkins/jenkins-agent.service
        dest: /etc/systemd/system/jenkins-agent.service

    - name: Initialize env.sh
      file:
        name: /opt/jenkins/env.sh
        state: file

    # Config env.sh before start agent
    # - name: Start in systemd
    #   systemd:
    #     name: jenkins-agent
    #     state: started

相关笔记