Jenkins的分布式环境构建

Posted shadow-yin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins的分布式环境构建相关的知识,希望对你有一定的参考价值。

1.简介

jenkins分布式环境是由master机和多个slave机组成的

2.master安装jenkins

环境:centos

假如有多台机器,我会选择储存空间较大的机器来安装master,master主消耗的是储存空间

2.1 安装JDK

yum install -y java

2.2 安装jenkins

添加Jenkins库到yum库,Jenkins将从这里下载安装。

wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum install -y jenkins

如果不能安装就到官网下载jenkis的rmp包,官网地址(http://pkg.jenkins-ci.org/redhat-stable/

 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.3-1.1.noarch.rpm
 rpm -ivh jenkins-2.7.3-1.1.noarch.rpm

配置jenkis的端口

vi /etc/sysconfig/jenkins

找到修改端口号:

JENKINS_PORT="8080"  此端口不冲突可以不修改 

2.3 启动jenkins

yum安装的jenkins能直接使用 systemctl start/stop/restart jenkins 控制jenkins服务,不需要配置

为保证环境的稳定性,我一般会设置systemctl enable jenkins,保证机器挂掉之后,重启能自动启动jenkins

 

    • 安装成功后Jenkins将作为一个守护进程随系统启动
    • 系统会创建一个“jenkins”用户来允许这个服务,如果改变服务所有者,同时需要修改/var/log/jenkins, /var/lib/jenkins, 和/var/cache/jenkins的所有者
    • 启动的时候将从/etc/sysconfig/jenkins获取配置参数
    • 默认情况下,Jenkins运行在8080端口,在浏览器中直接访问该端进行服务配置
    • Jenkins的RPM仓库配置被加到/etc/yum.repos.d/jenkins.repo

2.4 打开jenkins

在浏览器中访问 

首次进入会要求输入初始密码如下图, 

初始密码在:/var/lib/jenkins/secrets/initialAdminPassword 

技术图片

选择“Install suggested plugins”安装默认的插件,下面Jenkins就会自己去下载相关的插件进行安装。 

技术图片

技术图片

创建超级管理员账号 

技术图片

技术图片

 

3.Slave部署

我部署slave时使用的JNLP的方式,使用的agent,但我推荐使用ssh方式

首先保证slave的机器和master是在同一网段,能互相ping通

3.1 新建节点

技术图片

技术图片

技术图片

3.2 JNLP方式连接Slave

3.2.1 node配置

 

技术图片

3.2.2 agent安装与配置

技术图片

1.右击slave.jar (现在已改名为slave-agent.jar) 复制路径

2.进入slave机器,下载agent:wget agent路径

 

3.准备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需要根据节点信息而修改。

 

4.配置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

 

5.启动

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

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

 

6.检查node是否已在线

技术图片

 

3.3 SSH方式连接Slave

3.3.1新建节点

系统管理>管理节点>新建节点

技术图片

选择固定代理,输入节点名称,点击ok

技术图片

    • Name是节点名字;
    • Description是节点描述;
    • # of executors是该节点可以同时运行job的数量;
    • Remote root directory主要是添加了workspace的目录;
    • Label是该节点的标签名,在运行job的时候,可以使用该标签指定job运行的node;
    • Usage是你如何使用该节点,通常选择Utilize this node as much as possible,即尽量使用该节点。
    • Lance method:是将该node挂载到master上的方法。这里有四个选项,常用的是前两选项,即“Launch slave agents on Unix machine via SSH”和“Launch slave agents via Java Web Start”。本文将详细介绍这两种挂载node的方法。
    • Availability是你何时连接该节点。通常选择一直连接即可,即“Keep this slave on-line as much as possible”

 

关于SSH连接slave,jenkins有如下描述:

Launch slave agents on Unix machines via SSH

Starts a slave by sending commands over a secure SSH connection. The slave needs to be reachable from the master, and you will have to supply an account that can log in on the target machine. No root privileges are required.

这段描述的意思是说,选择此种方式连接时,master和slave必须是能够通过ssh进行连接的,必须有slave机器的账号才行,但不要求必须是root账号。这种方式的前提是需要安装SSH Slaves plugin插件。

3.3.2 连接步骤

1、输入slave节点的IP。

2、Add Credentials:

有如下两种方式:

1)方式一:通过Username with password方式(个人觉得这个方式比较方便)

需要知道slave机器的用户名和密码,见下图:

技术图片

2)方式二:通过SSH Username with private key方式

需要先在master机器上生成ssh key pair。生成的 public key放到slave机器的~/.ssh/authorized_keys里面。然后chmod 600 ~/.ssh/authorized_keys。

然后,添加连接slave的credential,见下图:

技术图片

这两种方式的Scope选项,我选择的是System,表示这个Credentials仅仅是用来master和node进行连接用的。还有另外一种是“Global(Jenkins、nodes、items、child items)”,这种scope的Credential可以用来连接git等其他机器。具体选择哪种scope,根据自己的需要。就连接slave这个需求来说,哪种scope的credential都可以。

Username填写在master上生成key pair时使用的用户名。

Private key选择From the jenkins master ~/.ssh

 

3、开启agent

技术图片

【扩展知识】

Jenkins的SSH Credentials Plugin插件,可以集中管理这些ssh 的key。安装完这个插件,可以在Jenkins上看到这样的页面

技术图片

这个页面可以对credentials进行添加、删除、修改等操作。在这里设置的credentials在jenkins的其他需要credentials的地方,可以通过下拉菜单选择使用,比如添加slave时,可以直接在Credentials下拉菜单里选择对应的credential就行:

技术图片

还有git clone代码时:

技术图片

此时一定要把在master上生成的 public key添加到github账号的的Profile setting页面里的SSH Keys Settings中。

 

 

 

4.插件安装方法

如果要真正熟悉Jenkins,还是要能灵活使用其插件,目前已有1700多个插件,所以jenkins功能强大到似乎有点过分了,具体的插件我就不介绍了,大家可以自己去熟悉,以下我只讲述以下插件的安装以及优化插件安装速度。

4.1 离线安装

手工下载(*.hpi): http://updates.jenkins-ci.org/download/plugins/

进入:系统管理 / 管理插件 / 高级,然后上传插件进行安装。 

无需重启 Jenkins 插件即生效。

4.2 在线安装

进入:系统管理 / 管理插件 / 可选插件 

查找并勾选所需插件,点击“直接安装”; 

需重启 Jenkins 插件才生效。

 

技术图片

4.3 插件下载加速

国外镜像下载较慢,会导致插件下载失败,可优化插件的镜像地址,以下是jenkins插件清华大学镜像地址

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

点击高级,修改升级站点的地址为清华大学镜像地址

技术图片    有的时候更换镜像之后下载插件还是走的官方地址,原因:配置了清华的镜像之后他还是走的jenkins官方去拉取的,是因为清华镜像的配置文件里面的插件下载地址并不是指向的清华镜像,仍然指向的是jenkins官方的地址,我的解决方案是把jenkins官方的地址通过nginx吞掉直接转发到清华镜像去。

host配置

127.0.0.1 updates.jenkins-ci.org

nginx配置

rewrite ^/download/plugins/(.*)$ https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/$1? last;

location /download/plugins
{
    proxy_next_upstream http_502 http_504 error timeout invalid_header;
    proxy_set_header Host mirrors.tuna.tsinghua.edu.cn;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    rewrite /download/plugins(.*) /jenkins/plugins/$1 break;
    proxy_pass https://mirrors.tuna.tsinghua.edu.cn;
}

解决:可以通过在nginx上配置代理,将官方的插件下载地址映射到                 https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/

这样下载插件也会从镜像网站下载

以上是关于Jenkins的分布式环境构建的主要内容,如果未能解决你的问题,请参考以下文章

jenkins分布式

Jenkins分布式构建与并行构建

jenkins-slave的搭建和使用

技术分享 | Jenkins 节点该如何管理?

技术分享 | Jenkins 节点该如何管理?

jenkins系列3-gitlab webhook,jenkins自动构建