
Git仓库Jenkins作为持续集成工具,利用webhook插件检测GitLab仓库代码变动,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK、Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。分发到测试服务器或者生产服务器,测试人员或用户就可以访问
 
| 服务器IP | 服务器信息 | 备注 | 
|---|---|---|
| 192.168.1.10 | 4G内存、可联网 | Gitlab、Git、Maven、JDK | 
| 192.168.1.20 | 4G内存、可联网 | Jenkins、Git、Maven、JDK | 
| 192.168.1.30 | 4G内存、可联网 | Tomcat、JDK | 
tar -zxf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201 /usr/local/java
vim /etc/profile
#末尾添加
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
#保存瑞出
source /etc/profile 
java -version #安装成功,jdk版本信息yum -y install gittar -zxf apache-maven-3.6.0-bin.tar.gz
mv apache-maven-3.6.0 /usr/local/maven
vim /etc/profile
#末尾添加
export PATH=$PATH:/usr/local/maven/bin
#保存退出
source /etc/profile
mvn -v #安装成功,maven版本信息find / -type f -name settings.xml
vim /usr/local/maven/conf/settings.xml
157     </mirror>
158      -->
159      <mirror>
160        <id>aliyun maven</id>
161        <name>aliyun</name>
162        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
163        <mirrorOf>central</mirrorOf> # 代表本机去中央仓库的请求拦截,让阿里云来处理
164      </mirror>
165    </mirrors>tar -zxf apache-tomcat-8.5.42.tar.gz 
mv apache-tomcat-8.5.42 /usr/local/tomcat
/usr/local/tomcat/bin/startup.sh
`启动`:/usr/local/tomcat/bin/startup.sh
`停止`:/usr/local/tomcat/bin/shutdown.sh
`查看日志`: tail -f /usr/local/tomcat/logs/catalina.out详细安装步骤链接👈
详细安装步骤链接👈
192.168.1.10 由于刚才已经与gitlab进行sshd密钥部署,就不重新获取了
ssh-copy-id -i 192.168.1.20
ssh-copy-id -i 192.168.1.30192.168.1.20
ssh-keygen
ssh-copy-id -i 192.168.1.10
ssh-copy-id -i 192.168.1.30192.168.1.30
ssh-keygen
ssh-copy-id -i 192.168.1.10
ssh-copy-id -i 192.168.1.20
gitlab服务器获取密钥
ssh-keygen #回车查看公钥

进入gitlab页面进行设置密钥

记得安装maven插件、gitlab webhook插件 没有maven插件不能创建maven项目 没有gitlab webhook插件,不能检测gitlab仓库代码变动实现自动计划
新建maven项目


源码管理 复制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/gameoflife-web/target/*.war root@192.168.1.30:/usr/local/tomcat/webapps/

构建后操作 设置过邮箱的话,这里可以设置构建全部结束后,给你发送邮件

无论最终构建成功/失败/不稳定都将发送邮件


这里的URL和token值就是在Jenkins的任务配置时,构建触发器



gitlab服务器拖入项目包,进行上传代码 上传代码成功后,jenkins自动化任务就会进行执行
[root@localhost ~]# tar -zxf game-of-lift.tar.gz 
[root@localhost ~]# cd game-of-life/
[root@localhost game-of-life]# git init
重新初始化现存的 Git 版本库于 /root/game-of-life/.git/
[root@localhost game-of-life]# git add .
[root@localhost game-of-life]# git config --global user.email "zidingyi@gmail.com"
[root@localhost game-of-life]# git config --global user.name "zidingyi"
[root@localhost game-of-life]# git commit -m "game"
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost game-of-life]# git remote add game git@192.168.1.10:root/game.git
[root@localhost game-of-life]# git push -u game master
Counting objects: 7496, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2292/2292), done.
Writing objects: 100% (7496/7496), 17.34 MiB | 24.45 MiB/s, done.
Total 7496 (delta 4659), reused 7496 (delta 4659)
remote: Resolving deltas: 100% (4659/4659), done.
To git@192.168.1.10:root/game.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 game 的远程分支 master。这个时候Tomcat的webapps目录下已经有了项目的war包并且已经编译解压好了
[root@localhost ~]# ls /usr/local/tomcat/webapps/*.war
/usr/local/tomcat/webapps/gameoflife.war可以直接访问http://192.168.1.30:8080/gameoflife
登录到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
[jenkins@jenkinsroot]$ssh-copy-id -i root@192.168.1.30使用root运行
vim /etc/sysconfig/jenkins
# 修改jenkins用户
JENKINS_USER="jenkins"   # 修改为root在GitLab上模拟代码变化

这个时候就可以scp成功了

这个时候Tomcat的webapps目录下已经有了项目的war包并且已经编译解压好了
[root@localhost ~]# ls /usr/local/tomcat/webapps/*.war
/usr/local/tomcat/webapps/gameoflife.war可以直接访问http://192.168.1.30:8080/gameoflife
Jenkins
vim /tmp/autoscp.sh
# 添加
#!/bin/bash
WARFILE=/var/lib/jenkins/workspace/game/gameoflife-web/target/gameoflife.war
scp $WARFILE root@192.168.1.30:/tmp
ssh root@192.168.1.30 /tmp/deploy.sh
chmod +x /tmp/autoscp.shTomcat
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部分改为执行脚本

这个时候Tomcat的tmp目录下已经有了项目的war包
ls /tmp/*.war
tmp/gameoflife.war并且也已经解压完成根据脚本的操作自动部署到了Tomcat主机
访问http://192.168.1.30:8080/gameoflife