Jenkins JNLP Agent的配置
2019-01-26 21:18:38 +08 字数:928 标签: CI AnsibleJenkins是一个单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的示例。
简单启动 ¶
如何用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_URL
和JNLP_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
参考 ¶
- Systemd 入门教程:实战篇 - 阮一峰的网络日志
- bash - linux script to kill java process - Stack Overflow
- Architecting for Scale | Jenkins
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