jenkins配置及使用

# 简介

# 安装

# 普通方式安装【推荐】

# yum安装

image-20220119161301352

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
1
2
3

有证书报错问题;可直接复制过去;jenkins.repo

[jenkins]
name=Jenkins-stable
baseurl=http://pkg.jenkins.io/redhat-stable
gpgcheck=1
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
1
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]
1
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_HOMEJENKINS_HOME是Jenkins的主目录,Jenkins工作的目录都放在这里,Jenkins储存文件的地址,Jenkins的插件,生成的文件都在这个目录下。
  • JENKINS_USERJENKINS_USER 是Jenkins的用户,拥有$JENKINS_HOME和/var/log/jenkins的权限。
  • JENKINS_PORTJENKINS_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" #监听端口
1
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
1
2

编辑文件/etc/sysconfig/jenkins

注意:这里不一定就要修改为root用户,可以根据实际情况分配一个可执行相应命令的用户即可。

vim /etc/sysconfig/jenkins
  
JENKINS_USER="root"
#JENKINS_GROUP="root"
1
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
1
2
3
4
5
6
7

重启

service jenkins restart
ps -ef | grep jenkins

#启动 Jenkins 服务
systemctl start jenkins

#别忘了加个开机启动
systemctl enable jenkins
1
2
3
4
5
6
7
8

# 确认 Java 路径

# which java
/usr/java/jdk1.8.0_181/bin/java
1
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
"
1
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
1

# 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
1
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开机启动
1
2
3
4
5
6
7
8
9
10
11

# 解锁jenkins

解锁jenkins的方法就是找到容器内部的initialAdminPassword文件,并把内容复制拷贝到浏览器的jenkins登录页

image-20220119144632312

docker安装的方式

# 第一步: 进入myjenkins容器
docker exec -it wdp-jenkins bash

# 第二步: 查看密码文件内容
tail -f /var/jenkins_home/secrets/initialAdminPassword
# 当你运行结束之后,你会得到一串密码,它像这个样子:73cf23dc900da30fa676c2766786bf6a
# 警告:当你尝试的时候,因为jenkins版本迭代的原因,这个文件名可能会改变,所以请以浏览器jenkins的登录页提示为准哦
# 提示:请使用tail命令哦,因为vi vim 在这个容器中是没有预安装的哦

# 第三步:在浏览器jenkins登陆页填写密码文件的内容 
# 第四部:选择插件,建议新手玩家选择默认插件配置,反正后面可以修改。老玩家就不用我说了,会玩。
# 第五步:配置用户名密码
1
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
1
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
1
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
1
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
1
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
1
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
1
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
1
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
1

# 初始化设置

# 解锁Jenkins

查询root账号默认密码

cat /var/lib/jenkins/secrets/initialAdminPassword
1

# 安装插件

image-20220119152022318

注意添加了:Publish Over SSH,中文汉化包;

image-20220225101734252

# 添加管理员

插件安装完成后会自动进入添加管理员界面;可以先用选择admin继续登录;等进入里面后在设置管理元密码和一个其他管理账户密码;修改密码和时区;

image-20220225103211093

# 配置Jenkins URL

这里的URL指的是默认访问Jenkins的地址。 默认是是http://:8080,如果你通过Nginx配置了域名,那么直接填写配置的域名即可。跟上面修改的配置端口一致;

image-20220225102539646

可在管理中修改;

image-20220225102812210

# 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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 重载Nginx配置
sudo nginx -s reload
1

# 项目配置

# 设置密码和时区

单个用户的定制设置;设置时区,跟下面的定时构建有关;

image-20220119191205595

# 定时构建设置

# 定时构建时间描述

在上述设置定时构建时,输入了一行命令H2/ * * * *来表示每隔 2 分钟构建一次,这是一种crontab的写法,具体描述分五个部分:

分钟 小时 日期 月份 星期几
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 7) (星期天 为 0 或 7)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
1
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 * * * *写法时:

img

可以看到 Jenkins 建议我们使用H来代表通配符,因此在表示每隔多久时建议使用H/的方式。

# 定时构建语法

要提前设置号用户对应系统的时区;

* * * * *
1
  • 第一个*号表示分钟,取值范围是0~59。
  • 第二个*号表示小时,取值范围是0~23。
  • 第三个*号表示是一个月中的第几天,取值范围是1~31。
  • 第四个*号表示的第几个月,取值范围是1~12。
  • 第五个*号表示一周中的第几天,取值范围是0~7,其中0和7都是代表周日。

./image-20201204103135614

下面是一些常用定时方式的参考示例:

  1. 每 30 分钟构建一次:H/30 * * * *
  2. 每 2 小时构建一次:H H/2 * * *
  3. 每天早上 9 点构建一次:H 9 * * *
  4. 每天 8 点、12 点、21 点各构建一次:H 8,12,21 * * *
  5. 周一至周五,每天 22 点到 23 点之间每隔 3 分钟构建一次:H/3 22-23 * * 1-5
H 8,12,17 * * *
1

# 时间不一致

# 现象原因

运行完毕后,会发现一个问题,构建的时间与我们实际的时间不一致:

  • Jenkins 显示时间

img

img

  • 系统实际时间

img

因为我们是用 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
1
2
3
4
5
6

再进入"系统管理"->"系统信息"->"user.timezone"查看:

img

综上所述可以确定因为 Jenkins 容器使用的是 UTC 时间,和我们的北京时间差了正好 8 个小时,针对我们是 Docker 部署的,解决方法如下 (其他直接在系统部署的可以另行百度~)。

# 解决方法

在 Jenkins 容器启动的时候添加参数

$ docker run ... -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai
1

启动后再次查看"系统管理"->"系统信息"->"user.timezone",发现时区已修改为上海:

img 查看构建历史,发现时间已于系统时间保持一致,修改完成:

img

# Docker集群配置

image-20220121144054716

# 设置主机上的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 
1

image-20220119185158809

另外一种方式用ssh连接运行命令:

  • SSH 密钥(基于唯一的 Jenkins 主实例标识)可以在启动时注入容器中,只要使用标准的 openssl sshd,就不需要设置任何凭据。为了向后兼容或打包在 Docker 映像中的非标准 sshd,您还可以选择提供手动配置的 ssh 凭据 image-20220121161745865
  • **注意:**如果 Jenkins 不信任 Docker 容器的主机 SSH 密钥(通常为这种情况),则需要将 SSH 主机密钥验证方法设置为"非验证"。

image-20220121173031150

上图中,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
1
2
3
4
5

# 全局配置

# 相关插件
  • Docker commons Plugin为其他与Docker相关的插件提供了APIs;
  • Docker build step plugin都依赖了Docker commons Plugin;
  • Kubernetes Plugin依赖了Docker Plugin;
# 位置
# 位置:系统配置===> Cloud ===>配置集群

配置之后记得测试连接下;

image-20220119185529461

设置成功后,可以在Dashboard/docker查看到宿主机中容器及镜像相关信息;

image-20220119192800564

# 项目中构建设置

安装docker相关插件

image-20220119185801628

设置

image-20220119180716837

# 权限设置

image-20220331104620617

设置匿名模式可以读取后,可把jks资源变成了ftp文件服务器了;

wget http://10.45.xx.xx:8877/job/autorun-web-dev/lastSuccessfulBuild/artifact/AAWeb.tar.gz
1

# 设置归档

image-20220331105448826

**/*Web.tar.gz
1

对应真实目录:

image-20220331105534559

访问直接下载获取:

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
1
2
3
4
5

# 常用插件

  • publish over ssh

  • Maven Integration

  • Git Parameter

    image-20220304165709824

    image-20220307110308721

    BUILD_ID

    image-20220304172627848

    具体的内容安装上图填写,其中 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
1

# Publist Over SSH

# 安装插件

点击 Manage Jenkins -> Manage Plugins -> 可选插件中,搜 Public Over SSH 插件,点击安装,安装完成后,重启Jenkins

# 配置

点击 Manage Jenkins -> Configure System -> 拉倒最下面就有该窗口了,如下所示:

# 脚本触发
cd dist && tar -zcvf dist.tar.gz *
1

含义是:进入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
1
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"
1
2
3

service jenkins restart 重启服务生效; top再次查看内存占用;

非全局安装的处理方式,可以参考 (opens new window)

# 参考链接

https://plugins.jenkins.io/docker-plugin/

上次更新: 2022/04/15, 05:41:30
×