实验环境
主机 | 服务 | 备注 |
---|---|---|
192.168.1.1 | Git、GitLab、Maven | 内存4G,可联网 |
192.168.1.4 | Git、Jenkins、Maven | 内存4G,可联网 |
192.168.1.6 | Tomcat |
实验目的
当在GitLab主机将准备好的项目代码解压,并上传到GitLab项目中,会触发Jenkins来对项目代码进行构建,完成后自动部署到Tomcat中,要求在每次将项目的war包传到Tomcat的目录中时,需要自动将之前的Tomcat数据备份,这里需要些脚本
实验步骤
环境搭建
192.168.1.1/192.168.1.4两台的环境搭建请参考这里
搭建Tomcat
准备Java环境
拖入jdk包
[root@tomcat ~]# tar zxf jdk-8u201-linux-x64.tar.gz
[root@tomcat ~]# mv jdk1.8.0_201/ /usr/local/java
[root@tomcat ~]# vim /etc/profile
[root@tomcat ~]# rm -rf /usr/bin/java
[root@tomcat ~]# source /etc/profile
[root@tomcat ~]# java -version
安装Tomcat并启动
tar zxf apache-tomcat-8.5.35.tar.gz
mv apache-tomcat-8.5.35 /usr/local/tomcat
/usr/local/tomcat/bin/startup.sh
firewall-cmd --add-port=8080/tcp
准备项目
192.168.1.1(GitLab)
登录web页面,创建新项目
http://192.168.1.1
192.168.1.4(Jenkins)
登录web页面,创建新任务,为Maven项目
http://192.168.1.4:8080
描述信息
源码管理
复制GitLab中game-of-life
项目的SSH地址
添加凭证
将GitLab中的私钥复制到下图中位置
密钥对是之前项目做过的,所以不用重复做
构建触发器
选择当GitLab的项目中代码变化时,Jenkins进行构建任务
图中的URL是在GitLab的设置中需要使用的
点击触发器中的“高级”,生成一串token值,用于GitLab与Jenkins集成使用
Build
执行构建时,对项目进行打包
Post Steps
当构建运行成功后,将jar包传送到tomcat主机的tomcat网页根目录下自动部署
scp /var/lib/jenkins/workspace/game-of-life/gameoflife-web/target/*.war root@192.168.1.6:/usr/local/tomcat/webapps/
构建后操作
设置过邮箱的话,这里可以设置构建全部结束后,给你发送邮件
无论最终构建成功/失败/不稳定都将发送邮件
192.168.1.1(GitLab)
进入项目中,进行与Jenkins的集成
这里的URL和token值就是在Jenkins的任务配置时,构建触发器
免密登录
因为Jenkins要往Tomcat主机传送jar包,所以需要免密登录
192.168.1.4(Jenkins)
[root@jenkins ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:AFdLwOhDCSkbK4FoiMI07CgFrRLQJmOBwomZAvpsMHM root@jenkins
The key's randomart image is:
+---[RSA 2048]----+
|^X+o.+ooo |
|^BB +o.. . |
|&&Eo . . |
|OO o . |
|+ + . S |
| . |
| |
| |
| |
+----[SHA256]-----+
[root@jenkins ~]# ssh-copy-id -i root@192.168.1.6
自动部署脚本的编写
192.168.1.4(Jenkins)
vim /tmp/autoscp.sh
# 添加
#!/bin/bash
WARFILE=/var/lib/jenkins/workspace/game-of-life/gameoflife-web/target/gameoflife.war
scp $WARFILE root@192.168.1.6:/tmp
ssh root@192.168.1.6 /tmp/deploy.sh
chmod +x /tmp/autoscp.sh
192.168.1.6(Tomcat)
vim /tmp/deploy.sh
# 添加
#!/bin/bash
DAY=/backup/$(date +%Y%m%d)
HOUR=$DAY/$(date +%H%M%S)
APPBASE=/usr/local/tomcat/webapps/gameoflife
WAR=/tmp/gameoflife.war
[ -d /backup ] || mkdir /backup
[ -d $DAY ] || mkdir $DAY
if [ -d $APPBASE ]
then
mkdir $HOUR
mv $APPBASE/* $HOUR
fi
unzip $WAR -d $APPBASE
chmod +x /tmp/deploy.sh
将Jenkins中项目的构建时执行的shell部分改为执行脚本
生成测试项目
在1.1操作终端拖入game-of-life的项目包
tar zxf game-of-life.tar.gz
cd game-of-life/
git init
git add .
git config --global user.email "mupeifeiyi@gmail.com"
git config --global user.name "feiyi"
git commit -m "game"
git remote add game git@192.168.1.1:root/game-of-life.git
git push -u game master
Jenkins的scp报错
方法一
登录到Jenkins查看终端输出是否成功
报错:主机密钥验证失败,使用scp命令也执行失败,这是因为Jenkins页面执行的命令是通过jenkins用户来执行的,所以免密登录应该给jenkins来做
解决Jenkins的scp问题,安装Jenkins会默认创建jenkins用户,现在切换到jenkins用户
[root@jenkins ~]# su jenkins
[root@jenkins ~]#
发现用户并没有变,也没有报错
查看jenkins的运行环境,cat /etc/passwd | grep jenkins
,它的运行环境默认是/bin/false
jenkins:x:988:982:Jenkins Automation Server:/var/lib/jenkins:/bin/false
将环境改为bash
现在切换jenkins
[root@jenkins ~]# su jenkins
bash-4.2$
出现bash-4.2$
因为这个用户没有home目录
vim /root/.bash_profile
# 最后一行添加
export PS1='[\u@\h \W]\$ '
# 这个就是普通用户登录后的命令行提示符[root@jenkins~]#
source /root/.bash_profile
设置jenkins不使用密码
visudo
# 在最后一行添加
jenkins ALL=(ALL)NOPASSWD: ALL
生成jenkins的密钥对
[root@jenkins~]#su jenkins
[jenkins@jenkinsroot]$ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa.
Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tfpPCEZOQbKxyidsmTREEqO2A1fw83XjXoK73P+OKag jenkins@jenkins
The key's randomart image is:
+---[RSA 2048]----+
| =++ o.o |
| . * = . |
|o.. = o + + |
|o..+ B = = o |
| o O o S + . |
| .. o . = + |
| o.o . |
| ..+.. o |
| E.o o+=oo |
+----[SHA256]-----+
[jenkins@jenkinsroot]$ssh-copy-id -i root@192.168.1.6
方法二
使用root运行
vim /etc/sysconfig/jenkins
# 修改jenkins用户
JENKINS_USER="jenkins" # 修改为root
验证
在GitLab上模拟代码变化
这个时候就可以scp成功了
这个时候Tomcat的tmp
目录下已经有了项目的war包
ls /tmp/*.war
tmp/gameoflife.war
并且也已经解压完成根据脚本的操作自动部署到了Tomcat主机
访问http://192.168.1.6:8080/gameoflife