实验环境

主机 服务 备注
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

create_game-of-life

192.168.1.4(Jenkins)

登录web页面,创建新任务,为Maven项目

http://192.168.1.4:8080

描述信息

project_game-of-life

源码管理

复制GitLab中game-of-life项目的SSH地址

copy_game-of-life_ssh

添加凭证

将GitLab中的私钥复制到下图中位置

密钥对是之前项目做过的,所以不用重复做

game-of-life_si

choose_game

构建触发器

选择当GitLab的项目中代码变化时,Jenkins进行构建任务

图中的URL是在GitLab的设置中需要使用的

game_chufa

点击触发器中的“高级”,生成一串token值,用于GitLab与Jenkins集成使用

game_token

Build

执行构建时,对项目进行打包

game_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/

game_shell

构建后操作

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

game_list

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

game_end

192.168.1.1(GitLab)

进入项目中,进行与Jenkins的集成

game_integrations

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

game_url_token

add_game_webhook

免密登录

因为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部分改为执行脚本

update_game_script

生成测试项目

在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查看终端输出是否成功

host_key

报错:主机密钥验证失败,使用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上模拟代码变化

game_bianhua

这个时候就可以scp成功了

game_scp_success

这个时候Tomcat的tmp目录下已经有了项目的war包

ls /tmp/*.war
tmp/gameoflife.war

并且也已经解压完成根据脚本的操作自动部署到了Tomcat主机

访问http://192.168.1.6:8080/gameoflife

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0