1、Jenkins 是什么
jenkins是一款流行的开源持续集成工具,广泛应用于项目开发,具有自动化构建、部署等功能:官方文档:https://www.jenkins.io/zh/doc/
2、安装并初始化
(1)安装jenkins
https://www.jenkins.io/zh/download/ 根据自己的服务器操作系统选择安装,比如我是centos就下载该版本的最新包,直接按照官方文档给的命令行安装即可:
//To use this repository, run the following command:
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
//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 fontconfig java-11-openjdk /*如果已经安装了JDK这一步就不需要了,版本号尽量对上否则可能出现一些不知道的问题*/
yum install jenkins
(2)修改用户和端口
如果只是本机学习可以跳过该步骤,但是跳过的话需要注意后面的登录名为admin_users是 jenkins,端口为8080
这一步主要是解决其他用户无法访问本服务器8080端口的问题,一般解决方法包含:
(1)修改交换机或者防火墙配置(当然你也可以关闭防火墙)
(2)修改端口信息(这个简单点)
注:修改用户名主要是使用习惯喜欢修改为root,默认用户是jenkins也可以不改
修改方式:
vim /etc/sysconfig/jenkins
修改 JENKINS_USER = "root"
修改 JENKINS_PORT = "8888" /*端口号看个人喜好修改,不重复即可*/
vim /usr/lib/systemd/system/jenkins.service
修改 Environment="JENKINS_PORT=8888"
# 重新加载配置文件
systemctl daemon-reload
#重启下, 个别情况下「需要关闭防火墙启动」
systemctl restart jenkins
# 配置防火墙:两种方式
(1)直接关闭防火墙
(2)防火墙添加修改后的端口 8888
比如我使用的云服务器安装jenkins,需要在安全组中添加8888端口规则放行该端口。
(3)UI初始化
直接访问localhost:8888 即可,或者本地IP:8888(没有修改端口就是8080),按照提示cat下 /var/lib/jenkins/secrets/initialAdminPassord 查看管理员密码,或者重启后执行 systemctl ststus jenkins 也可以直接看到密码:
由于jenkins自己安装插件比较慢,所以点击「选择插件来安装」,不勾选任何插件点击安装。然后创建用户和启动jenkins即可。
3、安装插件
主要是修改插件下载地址为国内地址,下载会快些。访问 manage jenkins > plugin manager
(1)初始化插件下载地址
点击 avaliable plugins 等页面完成加载后,服务器输入一下命令替换default.json文件中的地址:
#替换插件下载地址
cd /var/lib/jenkins/updates
# 替换下载地址,就是把http://updates.jenkins-ci.rog/download 替换成清华开源的镜像库,谷歌浏览器替换成百度浏览器地址
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
jenkins上点击 advance setting 替换Update Site-URL 为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
然后重启jenkins,直接在你的jenkins地址端口后面添加 /reastart 即可: http://ip:port/restart
(2)安装插件
重启后访问 访问 manage jenkins > plugin manager > Avialable plugins 搜索自己想要的插件,勾选后点击下载并重启即可,比如搜索Chinese 选择 localization: Chinese (Simpleified)下载汉化包。
4、权限管理
安转Role-baseed Authorization Strategy插件做账号权限控制,简单的说就是jenkins权限控制使用该插件,利用该插件功能创建不同访问权限的角色role_*,然后创建不同的账号分配对应的角色就可以了,我用不到所以不介绍了。
5、凭证控制
凭证用来存储密文保护的三方应用密码,如数据库、gitlab等、以便与这些三方应用交互。可以理解为jenkins不支持密码加密,所有用一个插件来保证密码的安全性。
(1)安装 Credentials Binding 插件
插件库里面搜索,点击安装就可以在首页安全下面看到凭证管理菜单,凭证管理类型有好多,账号密码、ssh、秘钥、证书等。
(2)配置git仓库凭证
git仓库可以使用ssh、账号密码都行,建议前者:
生成秘钥:然后到~/.ssh目录下查看相关文件,一般来说ssh 密钥会包含id_rsa和id_rsa.pub两个文件,分别表示生成的私钥和公钥。
ssh-keygen -t rsa -C "your_email"
在git上配置该公钥,jenkins 添加凭证配置私钥,路径如下:
我这里是配置的全局凭证,你也可以在System这个目录中添加不同的domin(领域),如给某个登录账号配置凭证。
Kind选择ssh;Scope作用范围按需选择;ID系统生成不用填写;Desc:描述信息按需填写;Username:随便填用于识别凭证的,选中Enter directly 点击Add 在这里填写私钥,点击Create即可。
6、Jenkins配置安装JDK和Maven
(1)安装和本地配置
服务器部署要安装JDK和Maven,自己百度安装方法,这里提供maven安装:
华为镜像https://repo.huaweicloud.com/apache/maven/maven-3/3.6.3/binaries/下载Maven包上传服务器,这里以tar.gz 包做安装介绍:解压后就可以用了,最好是将解压后的maven文件放在你自己创建的目录中,防止后面找不到:
tar -xzf 你的包名称 #解压
mkdir -p /opt/maven #创建maven目录
mv ${你解压后的包} /opt/maven #将解压的包放在你创建的maven目录中
配置环境变量:
vim /etc/profile
#文件中添加
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk #这里配置的是你安装的jdk地址
export MAVEN_HOME = /opt/maven #你的mavne目录
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin #在PATH后面添加java和maven的bin目录
source /etc/profile #配置生效
mvn -V #执行下命令看配置是否生效,生效会回显maven版本信息,否则估计是路径配置的不对
(2)配置Jenkins全局工具配置
配置Jenkins 全局工具,关联JDK和Maven:下面地址中配置JDK和Maven的地址,因为我们已经安装过了,所以就直接填写地址就行。
Dashboard>Manage Jenkins>Global Tool Configuration
(3)Jenkins配置系统设置
这一步是跟本地配置环境变量一样,在Jenkins上配置环境变量,让jenkins中也能够直接全局执行maven等命令。
配置地址如下,新增环境变量,配置项与之前在本机上配置的方式一致:新增JAVA_HOME,MAVEN_HOME,PATH+EXRRA。
Value值是你本机jdk、maven安装地址,PATH+EXRRA表示的是在jenkins全局变量后面追加变量的意思,固定值,这里在后面追加MAVEN的执行路径,就是$MAVEN_HOME/bin 即我们的maven目录下的bin目录。
7、熟悉项目配置项
jenkins项目风格常见有3种类:
- 自由风格(FreeeStyle)
- Maven项目(Maven)
- 流水线(Pipeline)
三种项目风格对于实现持续集成流程是一样的,只是配置方式不一样罢了:
自由风格是执行shell脚本,Maven文件是执行pom文件(所以需要填写pom地址),流水线与shell脚本类似,不过有自己的脚本语言但是也是最为灵活的。
以自由风格来说明:
(1)新建一个自由风格项目
首页New 一个项目,选择自由风格即可
(2)配置General信息
填写描述信息,下面勾选项非必选,比如第1个表示构建的包要保存多久,最多保存几个;第2个表示参数化构建,就是在构建前你可以从局外传入一些参数…持续集成自动化中使用第一个会多一点,毕竟需要看之前的结果。
(3)配置Source Code Management
选择git仓库,RepositoryURL配置ssh,Credentials选择之前配置的凭证,代码分支为master
(4)配置构建 Triggers
配置构建时机:一般第1种和第3种用的多一些,前者用于开发代码部署,后者用于自动化定时巡检
- Trigger builds remotely:一般用于代码更新自动部署,低版本的jenkins没有这个,需要安装gitHub Hook插件。先在git上配置Hook,即存在代码变更时发送请求给jenkins,请求地址就是下方展示的URL,git发送时机是可配置的(PR还是merge时触发等),这个需要用户自己配置。
- build after…:表示在jenkins其他项目之后构建。
- build periodically:定时构建,配置cron表达式。
- Poll SCM:轮询构建,定时扫描git上代码是否存在变更,存在即构建,比较耗性能不推荐这样,但方便。
(5)Build environment
从来没有用过…
(6)Build Steps
构建步骤,一般使用shell脚本多一些。比如构建(编译打包)
mvn -X clean package #-X是为了查看更多信息
(7)Post-build Actions
配置构建后的操作,比如可以将上一步构建出来的war包部署到tomcat中。比如构建成功后发送邮件给指定邮箱
- 构建后部署
下载插件 Deploy to Container,post-build Actions中选择Deploy war/ear to container配置war包地址:target/*.war配置容器container:这里需要添加凭证,可以用tomcat账号密码认证,然后填写tomcat 地址就可以了。 - 部署后发送邮件
-post-build Actions中选择E-mail Notification,填写收件人邮箱地址就可以了,需要注意发送邮件我们需要在全局配置中配置发件人邮箱 - 配置发件人邮箱:
需要给到邮箱SMTP服务端口,邮箱后缀,是否认证,以及默认的回复信息配置完成后可以勾选Test configuration sending test e-mial验证下配置是否生效。
8、创建项目
实际第7步骤中已经说的差不多了,这里我们在简单的说明下:
(1)部署后端项目
- 配置git 拉取源码
- 构建时机:简单粗暴直接 poll SCM 轮询构建
- 构建:直接采用shell脚本形式执行 mvn clean package就行了
- 部署:个人后端项目也可以直接shell脚本 java -jar *.jar的方式运行,所以就不要安装deploy to contain插件了,当前不推荐这样做,这样说明只是告诉大家,流程就是这样,实现方式有很多种,比如你的脚本编写能力很强,还管什么插件一切都是脚本控制(实际pipeline项目就是这样编写脚本方式实现)
ps aux |grep *.jar |grep -v grep |awk '{print $2}' |xargs kill -9 // 删除之前的java进程
nohup java -jar *.jar >/home/logs/zdz.out 2>&1 & // 运行当前jar包
(2)配置自动化巡检
- 配置git 拉取源码
- 构建时机:定时触发,比如每天每小时触发一次 * */1 * * *
- 构建:自动化不需要构建,直接执行 mvn clean test -Dxml=your_xml_name -Ptest ,不清楚的百度下mvn执行自动化
- 查看结果:这里需要安装TestNg Result插件并配置下就可以在jenkins上查看自动化执行结果了,也可行将结果邮件推送。作者不是很喜欢这种方式,所以直接在自动化代码中新增了一个TestNg的listener收集自动化结果上报,失败了就会直接推送邮箱或者聊天群。毕竟写java比配置jenkins简单,灵活的也很高。
9、Pipeline
简单说下流水线的配置,需要安装Pipeline插件,pipeline语法有两种形式:声明式(pipeline开头,推荐使用),脚本式(node开头),两种形式编写方式一样,这里以声明式实现自动化巡检来说明(持续部署实际是一样的方式,都可以shell脚本形式实现):
jenkins提供了在线的脚本生成器:Jenkins_url/job/test3_pipeline/pipeline-syntax/ 这里还有jenkins的一些全局变量。
#可以定义一些方法
#根据git获取仓库名称
def getRepoName(String repo) {
return repo.substring(repo.lastIndexOf("/") + 1, repo.lastIndexOf(".git"))
}
#按照分支拉取代码,如果已经存在就pull分支最新代码
def git_no_workspace(String repo, String branch) {
def repoName = getRepoName(repo)
sh """
if [[ -d ${repoName} ]];then
cd ${repoName}
git reset --hard
git fetch --all
git checkout ${branch}
git pull origin ${branch}
git log -2
else
git clone ${repo} -b ${branch}
cd ${repoName}
git log -2
git branch
fi
"""
}
#定义你的仓库信息
#测试仓库地址
def test_code_url = "ssh:lalalallalalal"
# 代码分支
def test_code_branch = "master"
def test_mvn_cmd = "mvn clean test -Dxml=testxml -Pprod -Dmaven.test.failure.ignore=true"
#jenkins运行环境的一些配置
pipeline {
agent any
tools {
# 安装一些工具
}
stages {
#stage表示环节,用户可以随意命名,会在执行时用于展示
stage('拉取代码') {
#步骤,该环节中的执行步骤,步骤可以是多个
steps {
#拉取源码
git_no_workspace(test_code_url, test_code_branch)
}
}
stage('执行用例') {
steps {
#获取代码地址
def repoName = getRepoName(test_code_url)
#进入代码目录执行mvn命令
dir("${repoName}") {
try {
sh "pwd;${test_mvn_cmd}"
} finally {
#jenkins存在一些全局变量,比如JOB_URL,currentBuild.currentResult 之类的,其余变量自行百度
if (currentBuild.currentResult != "SUCCESS"){
#比如执行失败后执行一些脚本
#git clone 脚本仓库
#sh " python3 ./脚本地址 '脚本参数'
}
}
}
post {
#If Maven was able to run the tests, even if some of the test
#failed, record the test results and archive the jar file.
success {
junit '**/target/surefire-reports/TEST-*.xml'
archiveArtifacts 'target/*.jar'
}
}
}
}
}
10、执行
配置完成后,项目中点击build Now,即可开始执行,点击下方具体项目可查看执行日志信息。