jenkins 是一个开源软件项目,是基于 java 开发的一种持续集成工具,本文是对 jenkins2.176(目前最新稳定版) 进行安装和配置,实现 gitlab 上获取项目,并进行持续化自动部署。

jenkins从gitlab上拉取的项目在 /var/lib/jenkins/workspace 目录下面 

一、jenkins 安装部署

1. jenkins 下载和安装

到 Jenkins download and deployment 官网下载,jenkins 分为 两种版本 Long-term Support (LTS) 和 Weekly。我们选择第一个版本LTS也就是稳定版。本文采用rpm包进行安装。下载完后将 jenkins-2.176.1-1.1.noarch.rpm 上传到 linux 服务器上,并执行以下命令进行安装:

[root@test ~]# rpm -ivh jenkins-2.176.1-1.1.noarch.rpm 
warning: jenkins-2.176.1-1.1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID d50582e6: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:jenkins-2.176.1-1.1              ################################# [100%]
[root@test ~]# 

若能找到 jenkins.war 包就是成功了,并且可以用这个war 包部署到 tomcat 下进行启动使用。

[root@test ~]# find / -name "jenkins.war"
/usr/lib/jenkins/jenkins.war

2. 配置java

2.1 vim /etc/init.d/jenkins 进入 jenkins 配置文件进行编辑,主要是 将 自己安装jdk的位置配在 candidates 值里面

如果没有安装openjdk,自己安装的 jdk又没配在 candidates 里面,则 jenkins 会启动失败。

2.2 /etc/init.d/jenkins 配置更改后,一定要 systemctl daemon-reload

systemctl daemon-reload

注意:
如果不执行 systemctl daemon-reload ,无论是启动,关闭jenkins还是查看jenkins状态,都会提醒你

3. 启动 jenkins

[root@test ~]# systemctl start jenkins
[root@test ~]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Tue 2019-07-09 10:09:18 CST; 7min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 20492 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/jenkins.service
           └─20513 /usr/local/java/jdk1.8.0_161/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/l...

Jul 09 10:09:17 test systemd[1]: Starting LSB: Jenkins Automation Server...
Jul 09 10:09:17 test runuser[20497]: pam_unix(runuser:session): session opened for user jenkins by (uid=0)
Jul 09 10:09:18 test systemd[1]: Started LSB: Jenkins Automation Server.
Jul 09 10:09:18 test jenkins[20492]: Starting Jenkins [  OK  ]
[root@test ~]#

jenkins 启动、关闭、查看状态相关命令:

systemctl start jenkins.service     启动jenkins
systemctl enable jenkins.service     设置jenkins 开机启动
systemctl stop jenkins.service     关闭jenkins
systemctl status jenkins.service    查看 jenkins 的状态

4. 访问安装

打开浏览器,访问 ip:8080 进行安装,ip为linux机器ip

提示需要输入管理员密码,从它指定的日志中找到密码 8175576cd43e484787faf2f3d507544a,输入进去,点击 “继续” 按钮,会初始化一小段时间

这里我选择 安装推荐的插件

这里就已经开始在安装插件,我们等它安装完就好了。

5. 创建首个管理员用户

上面等插件安装完后,就进入到下面界面,提示要创建第一个admin用户,并设置用户名密码

这里我直接创建用户名为 admin, 密码自定义,如下图:

点击 保存并完成

提示配置 jenkins URL, 这里保持默认即可,继续点击 保存并完成

提示 jenkins 已经就绪,开始使用 jenkins



  • 查看jenkins的配置文件:

/etc/sysconfig/jenkins

(该文件重要性类似于mysql的 /etc/my.cnf, tomcat 的 server.xml, nginx的 nginx.conf)

//查看jenkins的配置文件,定义了home、JAVA_CMD、user、port等基础配置,保持默认即可
[root@test ~]# cat /etc/sysconfig/jenkins  
## Path:        Development/Jenkins
## Description: Jenkins Automation 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"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Java executable to run Jenkins
# When left empty, we'll try to find the suitable Java.
#
JENKINS_JAVA_CMD=""

## Type:        string
## Default:     "jenkins"
## ServiceRestart: jenkins
#
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins.
#
JENKINS_USER="jenkins"

## Type:        string
## Default: "false"
## ServiceRestart: jenkins
#
# Whether to skip potentially long-running chown at the
# $JENKINS_HOME location. Do not enable this, "true", unless
# you know what you're doing. See JENKINS-23273.
#
#JENKINS_INSTALL_SKIP_CHOWN="false"

## Type: string
## Default:     "-Djava.awt.headless=true"
## ServiceRestart: jenkins
#
# Options to pass to java when running Jenkins.
#
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"

## Type:        integer(0:65535)
## Default:     8080
## ServiceRestart: jenkins
#
# Port Jenkins is listening on.
# Set to -1 to disable
#
JENKINS_PORT="8080"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTP requests.
# Default is all interfaces (0.0.0.0).
#
JENKINS_LISTEN_ADDRESS=""

## Type:        integer(0:65535)
## Default:     ""
## ServiceRestart: jenkins
#
# HTTPS port Jenkins is listening on.
# Default is disabled.
#
JENKINS_HTTPS_PORT=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Path to the keystore in JKS format (as created by the JDK 'keytool').
# Default is disabled.
#
JENKINS_HTTPS_KEYSTORE=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Password to access the keystore defined in JENKINS_HTTPS_KEYSTORE.
# Default is disabled.
#
JENKINS_HTTPS_KEYSTORE_PASSWORD=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTPS requests.
# Default is disabled.
#
JENKINS_HTTPS_LISTEN_ADDRESS=""


## Type:        integer(1:9)
## Default:     5
## ServiceRestart: jenkins
#
# Debug level for logs -- the higher the value, the more verbose.
# 5 is INFO.
#
JENKINS_DEBUG_LEVEL="5"

## Type:        yesno
## Default:     no
## ServiceRestart: jenkins
#
# Whether to enable access logging or not.
#
JENKINS_ENABLE_ACCESS_LOG="no"

## Type:        integer
## Default:     100
## ServiceRestart: jenkins
#
# Maximum number of HTTP worker threads.
#
JENKINS_HANDLER_MAX="100"

## Type:        integer
## Default:     20
## ServiceRestart: jenkins
#
# Maximum number of idle HTTP worker threads.
#
JENKINS_HANDLER_IDLE="20"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Pass arbitrary arguments to Jenkins.
# Full option list: java -jar jenkins.war --help
#
JENKINS_ARGS=""
  • 查看程序主目录

 /var/lib/jenkins

该目录作用类似于mysql my.cnf中配置的datadir

jobs  浏览器上面创建的任务都会存放在这里。包含jenkins管理的构建作业的配置细节、构建产物和数据。查看jobs目录内容,如下:
    目录下存放该项目的所有的构建历史;
    文件存储了该 build job 的所有配置细节;
    文件记录了这个构建任务在下一次构建时的数字序号和分别时最近稳定构建和最近成功的构建的符号链接;
    job 目录下存放的项目的构建历史会随着时间而不断增多,从而使得jobs目录不断变大。
logs  存放jenkins相关的日志
nodes  多节点时用到
plugins  插件所在目录
secrets  密码密钥所在目录
workspace 存放jenkins项目的默认工作空间。也可以在创建每个项目时勾选“Use custom workspace”,指定具体某个项目的自定义工作空间。
users 存放着jenkins登录账号信息

其中,jobs 和 plugins 目录比较重要



二、jenkins 与 gitlab结合

1. 查看插件:

系统管理 --> 插件管理

“可选插件” 是未安装的插件。“已安装”是已经安装的插件,其中勾选为灰色的为不可卸载的插件。

2. 安装相应插件

2.1 安装 Maven Integration 插件

安装了该插件后,在新建任务时,任务类型中才会有“构建一个maven项目”,如图:

2.2 安装 “Publish Over SSH” 插件

如果需要将打好的包分发到远程的服务器,那么就需要安装一个 Publish Over SSH 插件。这样的话,我们就可以在jenkins配置中直接使用远程拷贝了,把包直接拷贝到远程服务器。

2.3 安装 git 插件

如果在 “可选插件” 里没有搜到,可能默认已经安装了,可以在 “已安装” 里查询

2.4 安装 GitLab 插件

2.5 安装 Version Number 插件

 安装了Version Number插件后,可以在配自动部署时构建环境中配置自定义版本号

详情配置:

Version Number Format String详情:

${JOB_NAME}_${BUILD_DATE_FORMATTED, "yyyyMMdd"}.${BUILDS_TODAY}

BUILD_VERSION 效果如下:

yanshi-springboot_20210915.3

2.6 安装pipline插件(打算采用pipline方式自动部署的话)

 

2.7 安装完插件后,直接在linux机器上重启 jenkins 服务,而不是勾选空闲时重启

systemctl restart jenkins

3 获取 jenkins 连接 gitlab 所需的 access token

jenkins 连接 gitlab 需要配置access token ,所以先在 gitlab 上生成 access token,后将该token配置在jenkins上。(access token只需配置一次,后续每个工程直接使用即可)

3.1 获取连接token

1) 登录gitlab,点击用户头像下拉图标,选择 “Setting”

2)点击“Access Tokens”,输入 "Name" 和 "Expires at",勾选 "api":

3) 点击 “Create personal access token”,生成 access token,记录下来。

4 在jenkins上配置 gitlab

浏览器登录Jenkins web前端界面,点击 系统管理 ---> 系统设置 ---> Gitlab

a) Connection name 随便填;
b) Gitlab host URL   填Gitlab 的域名地址,例如 http://gitlab.yourdomain.com/;
c) Credentials 配置

点击 “添加” 下来框,点击 “jenkins” ;

d) 弹出框里,kind 选择 “GitLab API token”, 将之前复制备用的Private token 粘贴到 API token 输入框中,然后点击 “添加”

e) 选择刚刚新建的 Credentials: GitLab API token, 点击 “Test Connection” 按钮,测试一下能否连接成功,正常情况下因该返回 Success

f) 完成后点击页面底部的 “应用” 按钮,再点击 “保存” 按钮。

注意:如果测试连接不成功,通常是当前节点不能解析 gitlab.yourdomain.com 域名导致的,设置正确的DNS或者 hosts即可。

注意:(2020.02.10 补充笔记)

4 在jenkins上配置 gitlab  的补充说明:

Jenkins > Manage Jenkins > Configure System > Gitlab   可不配置

直接配置凭据即可。

配置凭据方法: 

Jenkins > 凭据

点击全局凭据,进入全局凭据页面 (详细路径即:Jenkins > 凭据 > 系统 > 全局凭据),左侧边栏会出现 “添加凭据” 选项

点击“添加凭据” , Add Credentials , 具体内容如下,最后点击 OK,保存。(Kind选择 Username with password)

结束。

三、 jenkins全局工具配置(maven,jdk,git)

系统管理 ---> 全局工具配置

1 jdk 配置

新增jdk,如下

2 Git 配置

2.1 安装git

yum -y install git

安装完后,不再有红色告警提示:

3. Maven配置

新增maven,如图

(提示:maven也可以通过命令 yum -y install maven  进行安装,yum安装的maven其 settings.xml文件在/etc/maven/目录下,其MAVEN_HOME为 /usr/share/maven)

四 创建任务从gitlab上拉取maven项目自动打包并发布到远程服务器

这里我们发布到 远程192.168.158.129 服务器

1 在jenkins服务器上生成一对密钥

ssh-keygen -t rsa

[root@test ~]# cd .ssh    //系统默认不带 .ssh文件
bash: cd: .ssh: No such file or directory
// 生成密钥对
[root@test ~]# ssh-keygen -t rsa        // 如果之前生成过密钥对,那可以直接用,不需要再生成
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.         // 自动生成 /root/.ssh 文件夹
Enter passphrase (empty for no passphrase):   // 直接回车,也可以设置密码
Enter same passphrase again:                  // 直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:uYpPQZBJkXb5uRw5Ugxs4GFG/qGuVALRZyecHqmwxJc root@test
The key's randomart image is:
+---[RSA 2048]----+
|o. +@X.+         |
|.+.E&o* o        |
|oo.*o*oo o       |
|... .+..*.       |
|  . o ooS+       |
|   +   .o.       |
|  . . . .        |
| . . o .         |
|  . ..o          |
+----[SHA256]-----+
[root@test ~]# 

生成的密钥对如下:

[root@test ~]# ls /root/.ssh/
id_rsa  id_rsa.pub

其中id_rsa 是私钥,id_rsa.pub是公钥

2 将jenkins服务器的公钥加到远程服务 192.168.158.129 上

mkdir -p /root/.ssh

cd /root/.ssh && touch authorized_keys

将jenkins服务器的公钥复制到 authorized_keys中

3 系统管理-->系统设置,找到“Publish over SSH”,进行配置

“Passphrase” 填写之前生成密钥时设置的密码,没有则留空,“Path to key” 留空,“Key” 粘贴 私钥文件 /root/.ssh/jenkins文件内容 。

然后新增 “SSH Servers”, 填入对应的hostname,这就是要发布到的目标服务器

此时,可以点击 “Test Configuration” 按钮,测试一下,正常情况,会显示 Success.

如果有多台 web server, 可以继续新增,重复以上操作,最后点击保存。

4 新建任务

回到首页,点击“新建任务”,自定义任务名称,选择“构建一个maven项目”

点击 “确定”按钮。

源码管理选择 git , Repository URL 填写 git 仓库的地址:

点击,添加 ---> Jenkins,创建 Jenkins凭据 Credentials

jenkins 构建任务触发器:

构建方式解释:

Build periodically (定时构建):周期进行项目构建(它不care源码是否发生变化)

Poll SCM (轮询 SCM):定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。

Build whenever a SNAPSHOT dependency is built:意思是依赖于快照的构建,应该是当gitlab或svn等有修改时就构建项目。

默认会勾选 “Build whenever a SNAPSHOT dependency is built”

定时器构建语法
* * * * *
星号中间用空格隔开

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

用法举例:

每30分钟构建一次:H代表形参
H/30 * * * *

每2个小时构建一次:
H H/2 * * *

每天中午下班前定时构建一次
0 12 * * *

每天下午下班前定时构建一次
0 18 * * *

每天的8点,12点,22点,一天构建3次: (多个时间点中间用逗号隔开)
0 8,12,22 * * *

每天早上8点到晚上6点每三小时检查一次
H 8-18/3 * * *

每两小时的45分,从上午9:45开始,每天下午3:45结束
45 9-16/2 * * 1-5

每两小时一次,每个工作日上午九点到下午5点(也许时上午10:37,下午12:37,下午2:37,下午4:38)
H H(9-16)/2 * * 1-5

选择“构建触发器”,勾选“Pull SCM”,这个选项会每隔一段时间检查一下GitLab仓库中代码是否有更新,有的话就执行构建操作。日程表如何设置,在这个输入框下面有说明。

构建环境:

Pre Steps:

构建(Build):

使用maven.test.skip,不但跳过单元测试的运行,也跳过测试代码的编译。举例,如下图:

Post Steps:

我这里要求构建成功后把war文件复制到指定的目录,然后停运tomcat,删除项目web目录,启动tomcat。

特别说明:

我在 “系统管理” ---> "系统设置" 里面,配置 “Publish Over SSH“ 时,其中 SSH Servers中, 对于 server192.168.158.129我配置的文件存放远程根目录为:/app/jenkins,如下图。所以 我实际把打包好的war包发布到了远程服务器192.168.158.129的 /app/jenkins/pro1 目录下

在 192.168.158.129 的 /app/jenkins/pro1 目录下查看远程发布过来的war包:

注意事项:

/app/jenkins 目录必须要手动创建

mkdir -p /app/jenkins

/app/jenkins/下的pro1目录会自动生成,不需要手动创建

使用脚本举例:

构建设置: --- 可选设置

设置邮件通知。

构建后操作(和Post Steps功能类似)

(Post Steps,可选设置 ),

5 构建项目

在工作区域的左边菜单上点击“立即构建”,开始构建项目

如果构建成功,则项目状态的S为蓝色,如果失败为红色。

参考:

如果jenkins制定完任务后,点击立即构建,jenkins 在构建项目时无法在maven仓库生成jar包父目录,导致无法下载jar包

控制台报错:
Failed to create parent directories for tracking file /usr/local/maven/repository/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom

解决方案可参看:
jenkins 在构建项目时无法在maven仓库生成jar包父目录,导致无法下载jar包_wudinaniya的博客-CSDN博客
 



打包后处理操作命令优化:

优化命令:
关闭tomcat, 删除 老的war数据 ,备份旧war追加日期时间后缀;把新打好的包移过来,最后重启tomcat

export PATH="/usr/local/java/bin:$PATH"
cd /home/work/apache-tomcat-7.0.94
#关闭tomcat
bin/shutdown.sh
#备份
rm -rf  webapps/testdemo-1.0.0
mv webapps/testdemo-1.0.0.war webapps/testdemo-1.0.0.war.bak`date +%Y%m%d_%H%M`
#移动项目
mv /app/jenkins/pro1/*.war  /home/work/apache-tomcat-7.0.94/webapps
#重启tomcat
bin/startup.sh

(未完,待续)

打包后处理操作命令优化方式2:---使用脚本

deploy.sh 内容如下:

#!/bin/bash
export PATH="/usr/local/java/bin:$PATH"
war=/app/jenkins/pro1/testdemo-1.0.0.war
if [ -f $war ]
then
    cd /home/work/apache-tomcat-7.0.94/webapps
    #关闭
    ps aux | grep tomcat |grep -v grep|cut -c 9-15|xargs kill -9
    sleep 10
    echo "服务已停!"
    #备份
    mv testdemo-1.0.0.war testdemo-1.0.0.war.bak`date +%Y%m%d_%H%M`
    rm -rf testdemo-1.0.0
    sleep 10
    #移动项目
    mv $war .
    #重启
    ../bin/startup.sh
    echo "服务已重启!"
else
    echo "war包不存在!"
fi

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐