1.jenkins是一个开源的持续集成工具,由java语言开发
2.jenkins是一个调度平台,拥有众多的插件,绝大部分功能都是由插件来完成的
https://www.jenkins.io/zh/
https://www.jenkins.io/zh/doc/
清华源直接下载rpm包安装即可,下载地址如下:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
安装命令如下:
rpm -ivh jdk-8u181-linux-x64.rpm
rpm -ivh jenkins-2.176.1-1.1.noarch.rpm
[root@jenkins ~]# rpm -ql jenkins
/etc/init.d/jenkins #启动文件
/etc/logrotate.d/jenkins #日志切割脚本
/etc/sysconfig/jenkins #配置文件
/usr/lib/jenkins #安装目录
/usr/lib/jenkins/jenkins.war #安装包
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins #数据目录
/var/log/jenkins #日志目录
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
systemctl start jenkins
清华源地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
配置步骤:
我们可以将插件提前下好,然后只需要解压到jenkins对应的目录即可
tar zxf jenkins_plugins.tar.gz -C /var/lib/jenkins/
ll /var/lib/jenkins/plugins/
重启jenkins:
systemctl restart jenkins
这是一个h5小游戏的项目,项目地址:
https://gitee.com/skips/game.git
使用gitlab直接导入项目:
选择源码管理,然后填写gitlab仓库信息,但是我们发现报错了,因为jenkins没有拉取gitlab项目的权限。
解释
1.如果我们想让jenkins从gitlab上拉取代码,那么需要将jenkins的公钥信息放在gitlab上。
2.gitlab针对这种情况有一个专门的功能,叫做部署部署公钥。
3.部署公钥的作用是不需要创建虚拟用户和组,直接在需要拉取的项目里关联部署公钥即可。
步骤
1.获取jenkins公钥信息
2.将jenkins公钥信息填写到gitlab的部署公钥里
3.由项目管理员操作,在需要jenkins拉取的项目里关联部署公钥
4.jenkins配置私钥凭证,部署项目时关联凭证
[root@jenkins-201 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCg8+DQFOjR+gl1Xw83CIyGJ50vI4DBeTaMRFdu5+5pT/IMnYq1iS7/lRS6JxXLYvVeNMDUfDxA1sOL70okyA3npjASXgJPGE1FsbpqzWjsN0TAGoZkR1VWuP9Yn0CrH7dA4lhZQfUUVjvqzFBZK8N9iZMzIu6KOiSY/aD4Ol59vbDS4kO0rTG1DYQNnjZzMPNlIiJ+0EVkfuYRwABRFA8fmL+6btqZqhjGY29EHuIfzIMTDTysrtCTGxQn2ql1zwjReGiNXzmFncwvyy92DAuMbnOQiE1YNn72wThy2oWSHsCwKdIvcNHqY2xBvFnkZ9Ltga7PgR33kbJ7Gl8tjiZF root@jenkins-201
查看拉取的代码:
[root@jenkins-201 ~]# ll /var/lib/jenkins/workspace/h5game
总用量 16
drwxr-xr-x 4 jenkins jenkins 47 8月 6 09:37 game
-rw-r--r-- 1 jenkins jenkins 9349 8月 6 09:37 LICENSE
-rw-r--r-- 1 jenkins jenkins 937 8月 6 09:37 README.md
#创建目录
mkdir -p /scripts/jenkins/
#编写脚本
cat > /scripts/jenkins/deploy.sh << ‘EOF‘
#!/bin/bash
PATH_CODE=/var/lib/jenkins/workspace/h5game/
PATH_WEB=/usr/share/nginx
TIME=$(date +%Y%m%d-%H%M)
IP=10.0.0.7
#打包代码
cd ${PATH_CODE}
tar zcf /opt/${TIME}-web.tar.gz ./*
#拷贝打包好的代码发送到web服务器代码目录
ssh ${IP} "mkdir ${PATH_WEB}/${TIME}-web -p"
scp /opt/${TIME}-web.tar.gz ${IP}:${PATH_WEB}/${TIME}-web
#web服务器解压代码
ssh ${IP} "cd ${PATH_WEB}/${TIME}-web && tar xf ${TIME}-web.tar.gz && rm -rf ${TIME}-web.tar.gz"
ssh ${IP} "cd ${PATH_WEB} && rm -rf html && ln -s ${TIME}-web html"
EOF
#添加可执行权限
chmod +x /scripts/jenkins/deploy.sh
也可以使用jenkins内置的变量来代替自定义变量,查看jenkins内置变量的地址如下:
http://10.0.0.201:8080/env-vars.html
在构建的位置填写执行shell脚本的命令
然后立即构建,发现报错了,提示权限不足:
报错原因是因为jenkins是以jenkins用户运行的,所以提示权限不足,我们可以修改jenkins为root用户运行。
[root@jenkins-201 ~]# vim /etc/sysconfig/jenkins
[root@jenkins-201 ~]# grep "USER" /etc/sysconfig/jenkins
JENKINS_USER="root"
[root@jenkins-201 ~]# systemctl restart jenkins
重启好之后我们重新构建一下:
查看一下web服务器的代码目录
[root@web-7 ~]# ll /usr/share/nginx/
总用量 0
drwxr-xr-x 3 root root 50 8月 6 10:13 20200806-1013-web
lrwxrwxrwx 1 root root 17 8月 6 10:13 html -> 20200806-1013-web
将刚才jenkins里配置的token和URL地址复制进去
较新版本的gitlab此时点击添加会提示报错:
解决方法:进入admin area区域,然后点击setting-->network进行设置
正常添加成功之后,会在下方出现测试的选项
选择push事件来测试是否可以正常出发,如果可以,会在页面上方显示200状态码
此时我们去查看jenkins项目页面,就会发现以及出发了来自gitlab的构建任务
点击创建之后会生成一串token,注意及时保存,因为刷新就没有了
点击jenkins的系统管理-->系统设置,然后找到gitlab选项
填写gitlab的信息:
点击添加后返回上一层页面,然后选中刚才添加的gitlab凭证
jenkins具有很多内置变量,点击项目-->构建--> 查看 可用的环境变量列表
http://10.0.0.201:8080/env-vars.html/
这里我们使用两个变量,一个是此次提交的commit的hash,另一个是上一次提交成功的commit的hash
我们可以在部署脚本里添加一行判断,如果这两个变量一样,那么就不用再次提交了
这些变量不需要在脚本里定义,直接引用即可
首先我们先给代码打上标签,然后提交2个版本
v1.0版本:修改代码,然后发布v1.0版本
git commit -am ‘v1.0‘
git tag -a v1.0 -m "v1.0 稳定版"
git push -u origin v1.0
git tag
v2.0版本:修改代码,然后发布v2.0版本
git commit -am ‘v2.0‘
git tag -a v2.0 -m "v2.0 稳定版"
git push -u origin v2.0
git tag
此时gitlab上可以看到2个标签
点进去之后可以看到具体标签名称
jenkins上我们新建一个参数化构建项目
然后配置git的标签参数:
最后还需要配置一下git仓库地址,注意需要修改拉取的版本的变量为 $git_version
此时点击项目的build with parameters就会看到对应的版本号:
然后去jenkins工作目录下查看是否拉取了对应版本:
/var/lib/jenkins/workspace/my-deploy-rollback
cat >/scripts/jenkins/deploy_rollback.sh<<‘EOF‘
#!/bin/bash
PATH_CODE=/var/lib/jenkins/workspace/my-deploy-rollback/
PATH_WEB=/usr/share/nginx
IP=10.0.0.7
#打包代码
cd ${PATH_CODE}
tar zcf /opt/web-${git_version}.tar.gz ./*
#拷贝打包好的代码发送到web服务器代码目录
ssh ${IP} "mkdir ${PATH_WEB}/web-${git_version} -p"
scp /opt/web-${git_version}.tar.gz ${IP}:${PATH_WEB}/web-${git_version}
#web服务器解压代码
ssh ${IP} "cd ${PATH_WEB}/web-${git_version} && tar xf web-${git_version}.tar.gz && rm -rf web-${git_version}.tar.gz"
ssh ${IP} "cd ${PATH_WEB} && rm -rf html && ln -s web-${git_version} html"
EOF
然后去web服务器上查看发现已经发布了
[root@web-7 ~]# ll /usr/share/nginx/
总用量 0
lrwxrwxrwx 1 root root 8 8月 6 15:59 html -> web-v2.0
drwxr-xr-x 3 root root 68 8月 6 15:59 web-v2.0
在工程配置里添加选项参数:
在参数化构建里添加2个选项:发布和回滚
此时查看构建页面就会发现多了选项卡:
cat >/scripts/jenkins/deploy_rollback.sh <<‘EOF‘
#!/bin/bash
PATH_CODE=/var/lib/jenkins/workspace/my-deploy-rollback/
PATH_WEB=/usr/share/nginx
IP=10.0.0.7
#打包代码
code_tar(){
cd ${PATH_CODE}
tar zcf /opt/web-${git_version}.tar.gz ./*
}
#拷贝打包好的代码发送到web服务器代码目录
code_scp(){
ssh ${IP} "mkdir ${PATH_WEB}/web-${git_version} -p"
scp /opt/web-${git_version}.tar.gz ${IP}:${PATH_WEB}/web-${git_version}
}
#web服务器解压代码
code_xf(){
ssh ${IP} "cd ${PATH_WEB}/web-${git_version} && tar xf web-${git_version}.tar.gz && rm -rf web-${git_version}.tar.gz"
}
#创建代码软链接
code_ln(){
ssh ${IP} "cd ${PATH_WEB} && rm -rf html && ln -s web-${git_version} html"
}
main(){
code_tar
code_scp
code_xf
code_ln
}
#选择发布还是回滚
if [ "${deploy_env}" == "deploy" ]
then
ssh ${IP} "ls ${PATH_WEB}/web-${git_version}" >/dev/null 2>&1
if [ $? == 0 -a ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ]
then
echo "web-${git_version} 已部署,不允许重复构建"
exit
else
main
fi
elif [ "${deploy_env}" == "rollback" ]
then
code_ln
fi
EOF
部署v1.0版本
部署v2.0版本:
检查web服务器当前的版本
[root@web-7 ~]# ll /usr/share/nginx/
总用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:52 html -> web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
然后我们选择v1.0版本并且选择回滚操作:
查看控制台显示回滚成功:
在web服务器上查看发现已经回滚成功:
[root@web-7 ~]# ll /usr/share/nginx/
总用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:56 html -> web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
修改代码并发布v3.0:
cd h5game/
echo v3.0 >> index.html
git commit -am ‘v3.0‘
git tag -a v3.0 -m ‘v3.0 稳定版‘
git push -u origin v3.0
git tag
jenkins查看并发布3.0版本:

web服务器查看发布情况:
[root@web-7 ~]# ll /usr/share/nginx/
总用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:58 html -> web-v3.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:58 web-v3.0
然后工程选择回滚到v2.0版本:
再次在web服务器上查看:
[root@web-7 ~]# ll /usr/share/nginx/
总用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:59 html -> web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:58 web-v3.0
配置命令:
git tag -a $git_newversion -m "$git_newversion 稳定版"
git push -u origin $git_newversion
echo "v4.0" >> index.html
git add .
git commit -m "v4.0 稳定版"
git push -u origin v4.0
查看控制台输出发现提示没有权限:
我们需要在gitlab上把deploy key设置允许写入
然后重新构建
返回到deploy-rollback工程查看可以发现已经生成了新标签,然后我们开始构建:
在web服务器上查看可以发现新版本已经发布成功了:
[root@web ~]# ll /usr/share/nginx/
总用量 20
lrwxrwxrwx 1 root root 8 5月 13 16:09 html -> web-v4.0
drwxr-xr-x 8 root root 4096 5月 13 16:05 web-
drwxr-xr-x 8 root root 4096 5月 13 15:00 web-v1.0
drwxr-xr-x 8 root root 4096 5月 13 15:00 web-v2.0
drwxr-xr-x 8 root root 4096 5月 13 15:37 web-v3.0
drwxr-xr-x 8 root root 4096 5月 13 16:09 web-v4.0
原文:https://www.cnblogs.com/alaska/p/13547783.html