jenkins配置及使用
# 简介
# 安装
# 普通方式安装【推荐】
# yum安装
Jenkins Redhat Packages
Jenkins
是开源的,使用Java
编写的持续集成的工具,在Centos上可以通过yum
命令行直接安装。记录下安装的过程,方便以后查找。需要先安装Java
,如果已经Java
可以跳过该步骤。
To use this repository, run the following command:
#sudo yum install java
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
2
3
有证书报错问题;可直接复制过去;jenkins.repo
[jenkins]
name=Jenkins-stable
baseurl=http://pkg.jenkins.io/redhat-stable
gpgcheck=1
2
3
4
If you've previously imported the key from Jenkins, the rpm --import
will fail because you already have a key. Please ignore that and move on.
yum install epel-release # repository that provides 'daemonize'
yum install java-11-openjdk-devel
yum install jenkins
#查看安装目录相关信息
rpm -ql jenkins
2
3
4
5
The rpm packages were signed using this key:
pub rsa4096 2020-03-30 [SC] [expires: 2023-03-30]
62A9756BFD780C377CF24BA8FCEF32E745F2C3D5
uid Jenkins Project
sub rsa4096 2020-03-30 [E] [expires: 2023-03-30]
2
3
4
You will need to explicitly install a Java runtime environment, because Oracle's Java RPMs are incorrect and fail to register as providing a java dependency. Thus, adding an explicit dependency requirement on Java would force installation of the OpenJDK JVM.
- 2.164 (2019-02) and newer: Java 8 or Java 11
- 2.54 (2017-04) and newer: Java 8
- 1.612 (2015-05) and newer: Java 7
# 相关配置【要点】
Jenkins
安装目录:/var/lib/jenkins/
- Jenkins配置文件地址:
/etc/sysconfig/jenkins
; 这就是Jenkins
的配置文件,可以在这里查看Jenkins
默认的配置。
jenkins三个比较重要的配置:
JENKINS_HOME
:JENKINS_HOME
是Jenkins的主目录,Jenkins工作的目录都放在这里,Jenkins储存文件的地址,Jenkins的插件,生成的文件都在这个目录下。JENKINS_USER
:JENKINS_USER
是Jenkins的用户,拥有$JENKINS_HOME和/var/log/jenkins的权限。JENKINS_PORT
:JENKINS_PORT
是Jenkins的端口,默认端口是8080。
## Path: Development/Jenkins
## Description: Jenkins Continuous Integration Server
## Type: string
## Default: "/var/lib/jenkins"
## ServiceRestart: jenkins
#
# Directory where Jenkins store its configuration and working
# files (checkouts, build reports, artifacts, ...).
#
JENKINS_HOME="/var/lib/jenkins"
JENKINS_USER="jenkins" #运行用户root
JENKINS_PORT="8080" #监听端口
2
3
4
5
6
7
8
9
10
11
12
# Jenkins用户授予root权限
由于需要在jenkins中执行shell脚本,但是有些目录下没有权限,下面的操作为jenkins用户授予root权限。
jenkins用户加入到root组
[root@master ~]# gpasswd -a jenkins root
Adding user jenkins to group root
2
编辑文件/etc/sysconfig/jenkins
注意:这里不一定就要修改为root用户,可以根据实际情况分配一个可执行相应命令的用户即可。
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
#JENKINS_GROUP="root"
2
3
4
修改目录权限
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
#chgrp -R root:root /var/lib/jenkins
#chgrp -R root:root /var/cache/jenkins
#chgrp -R root:root /var/log/jenkins
2
3
4
5
6
7
重启
service jenkins restart
ps -ef | grep jenkins
#启动 Jenkins 服务
systemctl start jenkins
#别忘了加个开机启动
systemctl enable jenkins
2
3
4
5
6
7
8
# 确认 Java 路径
# which java
/usr/java/jdk1.8.0_181/bin/java
2
然后打开文件/etc/rc.d/init.d/jenkins
,确认candidates
中是否包括了你的Java路径
candidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/lib/jvm/java-1.7.0/bin/java
/usr/lib/jvm/jre-1.7.0/bin/java
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
/usr/bin/java
# 这里就是我们自己安装的jdk的java位置(精确到java文件),这里设置后就不用设置下面的软引用;
# /usr/local/apps/jdk1.8.0_202/bin/java
"
2
3
4
5
6
7
8
9
10
11
12
13
我的 Java 路径没有在默认的路径中,所以做个软链接:
# ln -s /usr/java/jdk1.8.0_181/bin/java /usr/bin/java
# docker方式安装
# 安装及命令
# 需要修改下目录权限, 因为当映射本地数据卷时,/home/docker/jenkins目录的拥有者为root用户,而容器中jenkins user的uid为1000
sudo chown -R 1000:1000 /home/wdp-docker-bak/jenkins
docker run -d -p 8877:8080 --name wdp-jenkins -p 50000:50000 -v /home/wdp-docker-bak/jenkins:/var/jenkins_home jenkins/jenkins:lts
#docker run -d -p 8877:8080 --name wdp-jenkins -p 50000:50000 jenkins/jenkins:lts-jdk11
2
3
4
其他alpine版本
docker run : 用docker命令运行一个容器
- -d 后台运行容器;
- -p 8088:8080 将运行容器内部的8080端口桥接到宿主机器(也就是docker所在的机器)的8088端口 (这里我强行用俩个不同的端口好让大家区分宿主机器与容器);
- --name wdp-jenkins 容器的名字叫做 wdp-jenkins;
- -p 50000:50000 将运行容器内部的50000端口桥接到宿主机器(也就是docker所在的机器)的50000端口 (左边的端口属于宿主机器,右边的端口属于容器);
- jenkins/jenkins:lts 使用jenkins/jenkins镜像,如果宿主机器没有这个镜像,就会从互联网下载。lts 是镜像所选择的版本;
- -v /home/wdp-docker-bak/jenkins:/var/jenkins_home: 生成名为jenkins的容器并运行,并以root用户身份将jenkins_home目录挂载到宿主机上,防止容器删除,数据丢失;
# 注意事项
**注意:**如果出现打不开网页,请用命令docker ps -a 查看jenkins容器是否是up的,还有记得检查防火墙是否开放了8080和50000端口。
附Centos 7开放端口相关命令:
#查看已经开放的端口:firewall-cmd --list-ports
#开启端口:firewall-cmd --zone=public --add-port=8080/tcp --permanent
命令含义:
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
# 重启防火墙:
firewall-cmd --reload #重新载入firewall配置,使配置生效
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
2
3
4
5
6
7
8
9
10
11
# 解锁jenkins
解锁jenkins的方法就是找到容器内部的initialAdminPassword文件,并把内容复制拷贝到浏览器的jenkins登录页
docker安装的方式
# 第一步: 进入myjenkins容器
docker exec -it wdp-jenkins bash
# 第二步: 查看密码文件内容
tail -f /var/jenkins_home/secrets/initialAdminPassword
# 当你运行结束之后,你会得到一串密码,它像这个样子:73cf23dc900da30fa676c2766786bf6a
# 警告:当你尝试的时候,因为jenkins版本迭代的原因,这个文件名可能会改变,所以请以浏览器jenkins的登录页提示为准哦
# 提示:请使用tail命令哦,因为vi vim 在这个容器中是没有预安装的哦
# 第三步:在浏览器jenkins登陆页填写密码文件的内容
# 第四部:选择插件,建议新手玩家选择默认插件配置,反正后面可以修改。老玩家就不用我说了,会玩。
# 第五步:配置用户名密码
2
3
4
5
6
7
8
9
10
11
12
# docker-compose方式安装
# 存在的问题
- 官方的镜像默认不是使用 root 账号,虽然 Jenkins 可以正常启动,但是因为没有权限导致不能向宿主机写文件;
- Jenkins 基于 Docker 搭建,虽然 Jenkins 同样可以正常启动,但不能在容器内部随意使用 Docker;
# 问题一 解决
重新创建镜像修改为 root 用户,安装 docker 依赖库(问题二解决)
FROM jenkins/jenkins:2.137
MAINTAINER samy "yessz@qq.com"
ENV REFRESHED_AT 2018-08-13
USER root
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
&& echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
# 安装 docker 依赖库
RUN apt update && apt install -y libltdl7
2
3
4
5
6
7
8
9
10
11
12
13
创建新镜像:docker build -t samy/jenkins:2.137 .
# 问题二 解决
将宿主机的 Docker 程序挂载到 Jenkins 容器内部(宿主机环境为 Ubuntu 16.04)
docker-compose.yml
version: '2'
services:
jenkins:
restart: always
image: samy/jenkins:2.137
container_name: jenkins
expose:
- "8080"
- "50000"
ports:
- "8080:8080"
- "50000:50000"
environment:
JAVA_OPTS: "-Djava.awt.headless=true -Duser.timezone=Asia/Shanghai"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# 将宿主机的 Docker 程序挂载到 Jenkins 容器内部
- /usr/bin/docker:/usr/bin/docker
- ../data/jenkins:/var/jenkins_home
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 启动及访问
- 启动 Jenkins
docker-compose up -d
- 浏览器打开
http://127.0.0.1:8080
# 启动配置
# 开放防火墙端口
Jenkins站点的默认监听端口是8080
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
2
# 检查防火墙配置
sudo firewall-cmd --list-all
# 开启8080端口
sudo firewall-cmd --zone=public --add-port=8080/tcp
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重新加载防火墙配置
sudo firewall-cmd --reload
2
3
4
5
6
7
# 启动/设置开机启动
#重载服务(由于前面修改了Jenkins启动脚本)
sudo systemctl daemon-reload
#启动Jenkins服务
sudo systemctl start jenkins
systemctl restart jenkins
systemctl status jenkins
#别忘了加个开机启动
systemctl enable jenkins
service jenkins start
service jenkins status
service jenkins stop
#将Jenkins服务设置为开机启动
#由于Jenkins不是Native Service,所以需要用chkconfig命令而不是systemctl命令
# sudo /sbin/chkconfig jenkins on
chkconfig jenkins on
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 修改Jenkins插件源
enkins国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址。
方式一:修改配置文件 hudson.model.UpdateCenter.xml
查看jenkins安装目录和配置文件的目录
$ sudo rpm -ql jenkins
$ sudo cd /var/lib/jenkins
修改文件
$ sudo vim hudson.model.UpdateCenter.xml
2
3
4
5
6
将url的值改为 http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json,然后重启systemctl restart jenkins
因为没有证书而不能使用Https
方式二:修改配置文件 default.json
修改 /var/lib/jenkins/updates/default.json内容
cd /var/lib/jenkins/updates
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
2
3
4
方式三:页面上修改
上述修改也可以在网页上进行修改
Jenkins->Manage jenkins->Manage Plugins,点击Available(高级) ,将https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.jso 复制进Update Site的Url 并提交,需要再点击Check now(立即获取) 检查一下站点。然后浏览器访问http://192.168.31.196:8888/restart 重启jenkins
# 初始化设置
# 解锁Jenkins
查询root账号默认密码
cat /var/lib/jenkins/secrets/initialAdminPassword
# 安装插件
注意添加了:Publish Over SSH
,中文汉化包;
# 添加管理员
插件安装完成后会自动进入添加管理员界面;可以先用选择admin继续登录;等进入里面后在设置管理元密码和一个其他管理账户密码;修改密码和时区;
# 配置Jenkins URL
这里的URL指的是默认访问Jenkins的地址。 默认是是http://:8080,如果你通过Nginx配置了域名,那么直接填写配置的域名即可。跟上面修改的配置端口一致;
可在管理中修改;
# Nginx配置(非必要步骤)
配置Nginx反向代理Jenkins
- 新建配置文件
#新增Jenkins专用Nginx配置文件
sudo vi /etc/nginx/conf.d/jenkins.conf
#输入以下内容并保存
server {
listen 80; #监听80端口
server_name jenkins.xx.io; #监听的域名
access_log /var/log/nginx/jenkins.access.log main;
error_log /var/log/nginx/jenkins.error.log error;
location / { #转发或处理
proxy_pass http://127.0.0.1:8080;
}
error_page 500 502 503 504 /50x.html;#错误页
location = /50x.html {
root /usr/share/nginx/html;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 重载Nginx配置
sudo nginx -s reload
# 项目配置
# 设置密码和时区
单个用户的定制设置;设置时区,跟下面的定时构建有关;
# 定时构建设置
# 定时构建时间描述
在上述设置定时构建时,输入了一行命令H2/ * * * *
来表示每隔 2 分钟构建一次,这是一种crontab
的写法,具体描述分五个部分:
分钟 小时 日期 月份 星期几
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 7) (星期天 为 0 或 7)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
2
3
4
5
6
7
8
9
- 星号(*):代表所有可能的值,例如 month 字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如 “2-6” 表示 “2,3,4,5,6”。
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如 “0-23/2” 表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10,如果用在 minute 字段,表示每十分钟执行一次。
但是实际在 Jenkins 中进行定时构建时,写法相似但是还是有区别,还是以上述的H2/ * * * *
来表示每隔 2 分钟为例,当我们用*/2 * * * *
写法时:
可以看到 Jenkins 建议我们使用H
来代表通配符,因此在表示每隔多久时建议使用H/
的方式。
# 定时构建语法
要提前设置号用户对应系统的时区;
* * * * *
- 第一个*号表示分钟,取值范围是0~59。
- 第二个*号表示小时,取值范围是0~23。
- 第三个*号表示是一个月中的第几天,取值范围是1~31。
- 第四个*号表示的第几个月,取值范围是1~12。
- 第五个*号表示一周中的第几天,取值范围是0~7,其中0和7都是代表周日。
下面是一些常用定时方式的参考示例:
- 每 30 分钟构建一次:
H/30 * * * *
。 - 每 2 小时构建一次:
H H/2 * * *
。 - 每天早上 9 点构建一次:
H 9 * * *
。 - 每天 8 点、12 点、21 点各构建一次:
H 8,12,21 * * *
。 - 周一至周五,每天 22 点到 23 点之间每隔 3 分钟构建一次:
H/3 22-23 * * 1-5
。
H 8,12,17 * * *
# 时间不一致
# 现象原因
运行完毕后,会发现一个问题,构建的时间与我们实际的时间不一致:
- Jenkins 显示时间
- 系统实际时间
因为我们是用 Docker 部署的,所以再通过打印 Docker 容器的时间进行查看:
jenkins@0520b8208ffb:/$ date
Fri Apr 10 01:35:30 UTC 2020
jenkins@0520b8208ffb:/$ exit
exit
xxxdeMacBook-Pro:jenkins_home xxx$ date
2020 年 4 月 10 日 星期五 09 时 35 分 35 秒 CST
2
3
4
5
6
再进入"系统管理"->"系统信息"->"user.timezone"
查看:
综上所述可以确定因为 Jenkins 容器使用的是 UTC 时间,和我们的北京时间差了正好 8 个小时,针对我们是 Docker 部署的,解决方法如下 (其他直接在系统部署的可以另行百度~)。
# 解决方法
在 Jenkins 容器启动的时候添加参数
$ docker run ... -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai
启动后再次查看"系统管理"->"系统信息"->"user.timezone"
,发现时区已修改为上海:
查看构建历史,发现时间已于系统时间保持一致,修改完成:
# Docker集群配置
# 设置主机上的OPTIONS
ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock \ 参考下图:
**注意:**4243为端口号,只要不跟系统冲突,任意端口都行。修改完后执行以下两条命令使配置生效:systemctl daemon-reload和service docker restart ,防火墙一定要记得开放4243端口。
设置后重启;
systemctl daemon-reload && service docker restart
另外一种方式用ssh连接运行命令:
- SSH 密钥(基于唯一的 Jenkins 主实例标识)可以在启动时注入容器中,只要使用标准的 openssl sshd,就不需要设置任何凭据。为了向后兼容或打包在 Docker 映像中的非标准 sshd,您还可以选择提供手动配置的 ssh 凭据
- **注意:**如果 Jenkins 不信任 Docker 容器的主机 SSH 密钥(通常为这种情况),则需要将 SSH 主机密钥验证方法设置为"非验证"。
上图中,SSH远程Docker主机执行的Shell命令如下:
REPOSITORY=192.168.1.xxx:5000/zpzc
# 部署
docker rm -f zpzc
docker rmi $REPOSITORY
docker run -d --name zpzc -p 28888:8080 -v /usr/java/jdk1.8.0_171:/usr/local/jdk $REPOSITORY
2
3
4
5
# 全局配置
# 相关插件
- Docker commons Plugin为其他与Docker相关的插件提供了APIs;
- Docker build step plugin都依赖了Docker commons Plugin;
- Kubernetes Plugin依赖了Docker Plugin;
# 位置
# 位置:系统配置===> Cloud ===>配置集群
配置之后记得测试连接下;
设置成功后,可以在Dashboard/docker查看到宿主机中容器及镜像相关信息;
# 项目中构建设置
安装docker相关插件
设置
# 权限设置
设置匿名模式可以读取后,可把jks资源变成了ftp文件服务器了;
wget http://10.45.xx.xx:8877/job/autorun-web-dev/lastSuccessfulBuild/artifact/AAWeb.tar.gz
# 设置归档
**/*Web.tar.gz
对应真实目录:
访问直接下载获取:
wget http://10.45.xx.xx:8877/job/autorun-web-dev/lastSuccessfulBuild/artifact/AAWeb.tar.gz
curl -o http://10.45.xx.xx:8877/job/autorun-web-dev/lastSuccessfulBuild/artifact/AAWeb.tar.gz
http://10.45.xx.xx:8877/job/autorun-web-dev/lastSuccessfulBuild/artifact/AAWeb.tar.gz
2
3
4
5
# 常用插件
publish over ssh
Maven Integration
Git Parameter
BUILD_ID
具体的内容安装上图填写,其中 tag to push中的$build可以根据实际情况替换成其他变量,比如时间戳 create new tag 一定要勾选,一定要勾选,一定要勾选 重要的事情说三遍;
# 使用
# android
设置构建的git分支版本,及生成.apk文件后,再artifacts存档apk文件,方便测试下载使用;
# 前端
设置构建的git分支版本,及构建后把dist文件通过scp上传到nginx静态服务器目录下;
部署方式也可以用 Publist Over SSH
插件处理;
# nodejs多版本处理
可以安装安装NodeJS Plugin
装NodeJS
Manage Jenkins -> Global Tool Configuration -> NodeJs(点击新增NodeJS按钮) ;
在构建环境配置下安装nodejs
构建环境勾选 Provide Node & npm bin/folder to PATH;
构建
打包命令放到构建中了,在构建过程中会执行该命令进行打包。如下命令:
npm config set registry http://registry.npm.taobao.org/ && npm install && rm -rf dist && npm run build
# Publist Over SSH
# 安装插件
点击 Manage Jenkins -> Manage Plugins -> 可选插件中,搜 Public Over SSH 插件,点击安装,安装完成后,重启Jenkins
# 配置
点击 Manage Jenkins -> Configure System -> 拉倒最下面就有该窗口了,如下所示:
# 脚本触发
cd dist && tar -zcvf dist.tar.gz *
含义是:进入dist文件夹内,把所有的文件打包成一个文件。如下所示:
点击构建后操作,增加构建后操作步骤,选择send build artificial over SSH,然后会弹出一个框,如下图所示:
参数说明:
- Name: 选择一个我们配好的SSH服务器
- Source files: 我们要传输的文件路径
- Remove prefix: 要去掉前缀,不写远程服务器的目录结构,和Source files 写的一致。
- Remote directory: 要写部署在远程服务器的那个目录地址下,如果我们不写的话,就是SSH Servers配置里面的默认远程目录。
- Exec command: 传输完了要执行的命令,我们可以执行解压缩和解压缩完成后删除压缩包的2个命令。
设置
Source files 可以填写:dist/dist.tar.gz; 这样的。 Remove prefix 可以写成: dist/ Exec command可以写成如下命令:
cd testJenkins
tar -zxvf dist.tar.gz
rm -rf dist.tar.gz
2
3
# 可能碰到的问题
# jenkins占据内存过大
解决方式:
编辑 /etc/sysconfig/jenkins
配置文件,找到 JENKINS_JAVA_OPTIONS这项配置;
#JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_JAVA_OPTIONS="-Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"
2
3
service jenkins restart
重启服务生效; top再次查看内存占用;
非全局安装的处理方式,可以参考 (opens new window);
# 参考链接
https://plugins.jenkins.io/docker-plugin/