Linux版 jenkins自动化部署

Linux版 jenkins自动化部署目录.png

注意:本片配置:jenkins服务器和应用服务器不在同一台机器上,且应用服务器 负责流执行程 (推荐)。
流程:代码上传->gitlab通知->jenkins服务器执行构建->远程应用服务器git下拉->远程应用服务器maven打包->发送到远程应用服务器的tomcat->发布

以下是配置说明:
需要两台服务器:一台部署jenkins服务器、另一台部署应用服务器。
要求:两台服务器可以互相通信。
部署jenkins服务器(Linux1): jdk、jenkins、tomcat(可选,但不推荐)
部署应用服务器(Linux2): jdk、git、maven、tomcat

说明一下:部署的jenkins服务器可以是内网本地,应用服务器可以是外网环境的云服务器。Jenkins也是可以实现手动或轮询的方式构建到应用服务器的,但,不能使用gitlab通知jenkins自动构建,因,gitlab找不到你的内网地址。

一、部署jenkins服务器(Linux1)

1、安装jdk1.8

yum install java

2、安装jenkins

前提环境:jdk1.8
下载地址:jenkins.war 稳定版

[root@VM_0_11_centos ~]# ls
jdk1.8  jdk-8u221-linux-x64.tar.gz  jenkins.war
[root@VM_0_11_centos ~]# java -jar jenkins.war

访问:ip:8080
http://49.235.71.163:8080
创建用户:admin/admin 用户名:zhengja

2.1jenkins 插件安装(推荐)

Safe Restart 方便重启jenkins,每次配置jenkins需要重启让配置生效
Rebuilder 方便重新构建
Git Parameters 确定构建哪个分支

2.2jenkins 基础配置

  • 安全性配置
    • 系统管理->全局安全配置:


      admin.png

1.去掉 允许用户注册
2.选用 安全矩阵 ->Add user or group... ->输入刚创建的admin,赋予全部权限,保存

二、部署应用服务器(Linux2)

环境: jdk1.8,git,maven,tomcat8

1,开启ssh

[root@VM_0_6_centos ~]# netstat -anp|grep :22
tcp        0      0 0.0.0.0:22              0.0.0.0:*            
tcp        0     36 172.16.0.6:22           211.161.248.60:22447 
[root@VM_0_6_centos ~]# service sshd start
Redirecting to /bin/systemctl start sshd.service

2,关闭防火墙(内网环境相对安全)

安装iptables
如果你要改用iptables的话,需要安装iptables服务:

#安装
sudo yum install iptables-services 
#开启iptables
sudo systemctl enable iptables 
sudo systemctl enable ip6tables 
#启动服务
sudo systemctl start iptables 
sudo systemctl start ip6tables

关闭防火墙:

[root@VM_0_6_centos ~]# service iptables stop
Redirecting to /bin/systemctl stop iptables.service
[root@VM_0_6_centos ~]# service iptables status
Redirecting to /bin/systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Thu 2019-09-26 21:28:33 CST; 6s ago
  Process: 9537 ExecStop=/usr/libexec/iptables/iptables.init stop (code=exited, status=0/SUCCESS)
  Process: 9354 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
 Main PID: 9354 (code=exited, status=0/SUCCESS)

Sep 26 21:27:28 VM_0_6_centos systemd[1]: Starting IPv4 firewall with iptables...
Sep 26 21:27:28 VM_0_6_centos iptables.init[9354]: iptables: Applying firewall rules: [  OK  ]
Sep 26 21:27:28 VM_0_6_centos systemd[1]: Started IPv4 firewall with iptables.
Sep 26 21:28:33 VM_0_6_centos systemd[1]: Stopping IPv4 firewall with iptables...
Sep 26 21:28:33 VM_0_6_centos iptables.init[9537]: iptables: Setting chains to policy ACCEPT: filte...  ]
Sep 26 21:28:33 VM_0_6_centos iptables.init[9537]: iptables: Flushing firewall rules: [  OK  ]
Sep 26 21:28:33 VM_0_6_centos systemd[1]: Stopped IPv4 firewall with iptables.
Hint: Some lines were ellipsized, use -l to show in full.
[root@VM_0_6_centos ~]# 


Stopped IPv4 firewall with iptables 说明防火墙已关闭

2,安装 jdk

2.1 方式一:普通安装方式:(下载慢)

yum install java
java -version

2.2 方式二:安装指定版本:java1.8(下载慢)

  • 在线下载jdk (下载比较慢)
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm

  • 赋权限
chmod +x jdk-8u131-linux-x64.rpm
  • 进行安装
rpm -ivh jdk-8u131-linux-x64.rpm
  • 查看是否安装成功
java -version

默认安装路径为 /usr/java/jdk1.8.0_131

  • 编辑环境变量
vim /etc/profile

环境变量为

export JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
  • 使得配置立即生效
source /etc/profile
  • 查看是否安装成功
javac
java -version
echo $PATH

2.3 方式三:下载jdk1.8上传linux服务器(安装快-推荐)

下载:jdk-8u221-linux-x64.tar.gz
放到 /usr/local ,解压

tar -zxvf jdk-8u221-linux-x64.tar.gz

改名 jdk1.8

mv jdk1.8.0_221 jdk1.8
[root@VM_0_6_centos local]# ls
bin  etc  games  include  jdk1.8  lib  lib64  libexec  qcloud  sbin  share  src  yd.socket.server

配置jdk1.8环境变量

[root@VM_0_6_centos jdk1.8]# pwd
/usr/local/jdk1.8
[root@VM_0_6_centos jdk1.8]# vi /etc/profile

环境变量为

export JAVA_HOME=/usr/local/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

退出文件,保存
按Esc键 输入:wq 保存并退出
让配置文件生效:

[root@VM_0_6_centos jdk1.8]# source /etc/profile

查看是否配置成功:

[root@VM_0_6_centos jdk1.8]# java -version
java version "1.8.0_221"

若出现jdk版本号,则安装并配置环境变量成功
如果提示命令找不到的话,查看一下jdk的配置路径是否错误。
删除安装包(可选):rm -rf jdk-8u221-linux-x64.tar.gz

3、安装 git

方式一:git安装(旧版本)

[root@VM_0_6_centos local]# yum install git
[root@VM_0_6_centos local]# git --version
git version 1.8.3.1

方式二:gti安装(最新版本—推荐)

1、获取github最新的Git安装包下载链接,下载新版本 git-2.9.5.tar.gz 上传到linux;
2、压缩包解压:

sudo tar -zxvf git-2.9.5.tar.gz

3、进入解压后的文件夹:

cd git-2.9.5

4、执行编译:耐心等待编译即可

make prefix=/usr/local/git all

5、安装Git至/usr/local/git路径,命令为

make prefix=/usr/local/git install

6、打开环境变量配置文件,命令 ,在底部加上Git相关配置信息:

vim /etc/profile

PATH=$PATH:/usr/local/git/bin
export PATH

然后wq保存,退出!
让配置文件生效:

source /etc/profile

7、输入命令 git --version ,查看安装的git版本,校验通过,安装成功。
8、删除安装包(可选):rm -rf git-2.9.5.tar.gz
9、查看git安装路径:
Linux-如果不清楚自己的Git安装在哪个路径下,终端执行

whereis git

配置:/usr/local/git/bin/git

生成ssh密钥 配置git

ssh公钥可以配置gitlab、github等,
ssh私钥可配置jenkins凭证等。
用户和邮箱不要求真实

[root@VM_0_6_centos ~]# git config --global user.name "zhengja"
[root@VM_0_6_centos ~]# git config --global user.email "zhengja@dist.com"
[root@VM_0_6_centos ~]# ssh-keygen -t rsa -C "zhengja@dist.com"
Enter file in which to save the key (/root/.ssh/id_rsa):
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:EqKVJUBpxVYpswJifGiXyplLTUcBYFNaMxaODZQPUmc zhengja@dist.com
The key's randomart image is:
+---[RSA 2048]----+
|oOO&E++.         |
|=B%BB=.          |
|*=@+=+.          |
| *.=.. .         |
|. o.  . S        |
| .     .         |
|                 |
|                 |
|                 |
+----[SHA256]-----+

拿到公钥配置gitlab

[root@VM_0_6_centos local]# cd /root/.ssh/
[root@VM_0_6_centos .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@VM_0_6_centos .ssh]# vim id_rsa.pub 

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcArp9fBpi7CWJ50dQQTHbLfRkMyhVuox7bFEeYu3kaFYO3ECInfiBEK8PdYAKPjGWRirYQGCBQlsSzGd4F3sVTQH4ePk0bk/iAwnZsgOBgMgyZW6c00u+afJ/h8PNRK2xr60kB3n4no4UDov4hsuGdCKhavrHRzs3s6H+b7WKxILdSwZ7BpduGZGCOug8JtcnwF1mmMKi0YH0KrIxnrOR9GHT+wHAyJ5WjYU4Xzr+ZIGN6MfrM7X99y/uyMsrv8nzliMxWpFxduYAkKkfrqf46Y18oZfn5VdXhfnvyd+FqWTPdtJF2EZtKdhwGnouuyTdESQP3PPacFM1ZeW58R/T zhengja@dist.com

gitlab 配置公钥.png

测试:


gitlab 配置公钥测试.png

测试:git命令克隆sshUrl到本地

git clone sshURL

4、安装 maven

下载 apache-maven-3.6.2-bin.zip ,上传到linux系统并解压

[root@VM_0_6_centos local]# ls
apache-maven-3.6.2-bin.zip  etc    include  lib    libexec  sbin   src
bin                         games  jdk1.8   lib64  qcloud   share  yd.socket.server
[root@VM_0_6_centos local]# unzip apache-maven-3.6.2-bin.zip 
[root@VM_0_6_centos local]# ls
apache-maven-3.6.2          bin  games    jdk1.8  lib64    qcloud  share  yd.socket.server
apache-maven-3.6.2-bin.zip  etc  include  lib     libexec  sbin    src

配置maven环境变量

[root@VM_0_6_centos apache-maven-3.6.2]# pwd
/usr/local/apache-maven-3.6.2
[root@VM_0_6_centos apache-maven-3.6.2]# vim /etc/profile

末尾添加(路径要正确)

export MAVEN_HOME=/usr/local/apache-maven-3.6.2
export PATH=$MAVEN_HOME/bin:$PATH

重新加载配置-->测试maven是否配置成功

[root@VM_0_6_centos apache-maven-3.6.2]# . /etc/profile
[root@VM_0_6_centos apache-maven-3.6.2]# mvn -version
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-27T23:06:16+08:00)
Maven home: /usr/local/apache-maven-3.6.2
Java version: 1.8.0_221, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8/jre

删除安装包(可选):rm -rf apache-maven-3.6.2-bin.zip

5、安装 tomcat

下载 tomcat8 ,上传到linux,并解压

[root@VM_0_6_centos local]# unzip apache-tomcat-8.5.46.zip 
[root@VM_0_6_centos local]# ls
apache-maven-3.6.2        bin    include  lib64    sbin   yd.socket.server
apache-tomcat-8.5.46      etc    jdk1.8   libexec  share
apache-tomcat-8.5.46.zip  games  lib      qcloud   src

配置tomcat
给tomcat下的所有文件授给任何人都可执行的权限

[root@VM_0_6_centos local]# cd apache-tomcat-8.5.46/
[root@VM_0_6_centos apache-tomcat-8.5.46]# chmod a+x -R *

修改tomcat端口为8090

[root@VM_0_6_centos apache-tomcat-8.5.46]# vim conf/server.xml

<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

启动tomcat:

[root@VM_0_6_centos apache-tomcat-8.5.46]# bin/startup.sh

查看tomcat是否启动成功

[root@VM_0_6_centos apache-tomcat-8.5.46]# ps -ef|grep tomcat

root 22857 1 29 19:12 pts/0 00:00:02 /usr/local/jdk1.8/bin/java -Dcatalina.base=/usr/local/apache-tomcat-8.5.46 -Dcatalina.home=/usr/local/apache-tomcat-8.5.46 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.5.46/temp org.apache.catalina.startup.Bootstrap start
root 27474 19080 0 10:10 pts/0 00:00:00 grep --color=auto tomcat

启动成功标识!

关闭tomcat:
首先,进入Tomcat下的bin目录

cd /usr/local/tomcat/bin
使用./shutdown.sh或者是sh shutdown.sh关闭Tomcat

想直接直接杀死Tomcat进程(进程号: 22857),使用kill命令

kill -9 22857

三、jenkins节点Slave配置

jenkins主机环境:java、jenkins

1、Linux 的 Slave机器设置

作为slave的Linux机器为centos系统.
ip: 129.204.207.127
环境:java1.8、maven、git、tomcat:8090
路径:

java : /usr/local/jdk1.8
maven : /usr/local/apache-maven-3.6.2
git : /usr/local/git
tomcat: /usr/local/apache-tomcat-8.5.46

环境变量:vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8
export PATH=JAVA_HOME/bin:PATH
export CLASSPATH=.:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
PATH=PATH:/usr/local/git/bin export PATH export MAVEN_HOME=/usr/local/apache-maven-3.6.2 export PATH=MAVEN_HOME/bin:$PATH

用户:root/123
生成ssh:私钥、公钥 [Linux生成SSH密钥方式](其它/SSH 证书生成(Linux、windows).md)
节点Slave生成:authorized_keys 并授权

[root@VM_0_6_centos ~]# cd .ssh
[root@VM_0_6_centos .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[root@VM_0_6_centos .ssh]# cat id_rsa.pub > authorized_keys
[root@VM_0_6_centos .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@VM_0_6_centos .ssh]# chmod 700 authorized_keys

2、jenkins配置节点slave凭证

获取节点Slave私钥:id_rsa

[root@VM_0_6_centos ~]# cd /root/.ssh
[root@VM_0_6_centos .ssh]# vim id_rsa

创建节点凭证:root/私钥


节点配置5.png

3、创建节点slave
系统管理->节点管理->新建节点:
节点名称:Linux_127 、 选着固定节点 -->确定


节点配置6.png

查看节点列表:显示节点磁盘大小说明配置成功


节点配置7.png

测试节点:
新建任务:任务名称:springboot-test-gitlab、选择:构建一个自由风格的软件项目

节点配置8.png

节点配置9.png

执行立即构建

控制台输出:

成功控制台输出
Started by user zhengja
Running as SYSTEM
Building remotely on Linux_127 in workspace /root/.jenkins/workspace/springboot-test-gitlab
[springboot-test-gitlab] $ /bin/sh -xe /tmp/jenkins1901112003247678190.sh
+ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:edff:fe35:28c8  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ed:35:28:c8  txqueuelen 0  (Ethernet)
        RX packets 510  bytes 75763 (73.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 489  bytes 56366 (55.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
group default 
    link/ether c2:51:e9:ca:47:56 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::c051:e9ff:feca:4756/64 scope link 
       valid_lft forever preferred_lft forever
Finished: SUCCESS

中文解释:

成功控制台输出
由用户zhengja发起
作为系统运行
上远程构建Linux_127在工作区/root/.jenkins/workspace/springboot-test-gitlab
[springboot-test-gitlab] $ / bin / sh -xe /tmp/jenkins1901112003247678190.sh
+ ifconfig
docker0:标志= 4163 <UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        inet 172.17.0.1网络掩码255.255.0.0广播172.17.255.255
        inet6 fe80 :: 42:edff:fe35:28c8 prefixlen 64 scopeid 0x20 <link>
        以太网02:42:ed:35:28:c8 txqueuelen 0(以太网)
        RX数据包510字节75763(73.9 KiB)
        接收错误0掉线0超限0帧0
        TX数据包489字节56366(55.0 KiB)
        TX错误0掉线0超限0载波0冲突0
组默认 
    链接/以太c2:51:e9:ca:47:56 brd ff:ff:ff:ff:ff:ff:ff链接netnsid 0
    inet6 fe80 :: c051:e9ff:feca:4756/64作用域链接 
       永久有效_lft永久首选_lft
已完成:成功

配置节点成功!

四、创建一个任务(使用节点环境)

目的:代码上传->gitlab通知->jenkins服务器执行构建->远程应用服务器git下拉->远程应用服务器maven打包->发送到远程应用服务器的tomcat->发布

deploy.sh脚本在springboot-test-gitlab/deploy.sh 项目根目录下
其中项目中的脚本:deploy.sh

#!/usr/bin/env bash
#编译+部署项目站点

#需要配置如下参数
# 项目路径, 在Execute Shell中配置项目路径, pwd 就可以获得该项目路径
# export PROJ_PATH=这个jenkins任务在部署机器上的路径
# export PROJ_PATH=/root/.jenkins

# 输入你的环境上tomcat的全路径
# export TOMCAT_APP_PATH=tomcat在部署机器上的路径
# export TOMCAT_APP_PATH=/usr/local/apache-tomcat-8.5.46

### base 函数
killTomcat()
{
    pid=`ps -ef|grep tomcat|grep java|awk '{print $2}'`
    echo "tomcat Id list :$pid"
    if [ "$pid" = "" ]
    then
      echo "no tomcat pid alive"
    else
      kill -9 $pid
    fi
    #上面注释的或者下面的
    #cd $TOMCAT_APP_PATH/bin
    #sh shutdown.sh
}
cd $PROJ_PATH/workspace/springboot-test-gitlab2/springboot
mvn clean install

# 停tomcat
killTomcat

# 删除原有工程
#rm -rf $TOMCAT_APP_PATH/webapps/ROOT
#rm -f $TOMCAT_APP_PATH/webapps/ROOT.war
rm -f $TOMCAT_APP_PATH/webapps/springboot-test-gitlab.war

# 复制新的工程到tomcat上
cp $PROJ_PATH/workspace/springboot-test-gitlab2/springboot/target/springboot-test-gitlab-0.0.1-SNAPSHOT.war $TOMCAT_APP_PATH/webapps/

cd $TOMCAT_APP_PATH/webapps/
mv springboot-test-gitlab-0.0.1-SNAPSHOT.war springboot-test-gitlab.war

# 启动Tomcat
cd $TOMCAT_APP_PATH/
sh bin/startup.sh

创建一个任务
名称:springboot-test-gitlab2
类型: 一个自由风格的任务

gitlab2_2.png

源码管理:
gitlab配置节点的ssh公钥,配置参考:[SSH 证书生成(Linux、windows).md](其它/SSH 证书生成(Linux、windows).md) 中的 “二、Linux生成证书-->3.证书使用-例如:配置gitlab”。


gitlab2_1.png

构建触发器配置:
请参考:jenkins构建触发器配置中的_代码提交—>gitlab通知jenkins构建.

gitlab2_5.png

构建配置:


gitlab2_3.png

BUILD_ID=DONTKILLME
. /etc/profile
export PROJ_PATH=/root/.jenkins
export TOMCAT_APP_PATH=/usr/local/apache-tomcat-8.5.46
sh $PROJ_PATH/workspace/springboot-test-gitlab2/springboot/deploy.sh

保存->执行构建
执行构建结果:

Started by GitLab push by zhengja
Started by user zhengja
Rebuilds build #7
Running as SYSTEM
Building remotely on Linux_127 in workspace /root/.jenkins/workspace/springboot-test-gitlab2
No credentials specified
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url ssh://git@elbgit-1200450932.cn-northwest-1.elb.amazonaws.com.cn:5337/zhengja/springboot-test-gitlab.git # timeout=10
Fetching upstream changes from ssh://git@elbgit-1200450932.cn-northwest-1.elb.amazonaws.com.cn:5337/zhengja/springboot-test-gitlab.git
 > git --version # timeout=10
 > git fetch --tags --progress ssh://git@elbgit-1200450932.cn-northwest-1.elb.amazonaws.com.cn:5337/zhengja/springboot-test-gitlab.git +refs/heads/*:refs/remotes/origin/*
...........
.........
..........
09:28:22.884 [main] DEBUG org.springframework.test.context.support.TestPropertySourceUtils - Adding inlined properties to environment: {spring.jmx.enabled=false, org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=-1}

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.8.RELEASE)

2019-09-30 09:28:23.541  INFO 29490 --- [           main] d.s.SpringbootTestGithubApplicationTests : Starting SpringbootTestGithubApplicationTests on VM_0_6_centos with PID 29490 (started by root in /root/.jenkins/workspace/springboot-test-gitlab2/springboot)
................
............
........
[INFO] Installing /root/.jenkins/workspace/springboot-test-gitlab2/springboot/pom.xml to /root/.m2/repository/com/dist/springboot-test-gitlab/0.0.1-SNAPSHOT/springboot-test-gitlab-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  16.105 s
[INFO] Finished at: 2019-09-30T09:28:31+08:00
[INFO] ------------------------------------------------------------------------
tomcat Id list :29272
Tomcat started.
Finished: SUCCESS

访问:http://129.204.207.127:8090/springboot-test-gitlab/

html页面显示:

进入首页
测试自动构建是否成功
测试gitlab-->通知jenkins自动构建

到此,项目的自动部署及发布完成!

五、配置邮箱通知

目的:代码上传->gitlab通知->jenkins服务器执行构建->远程应用服务器git下拉->远程应用服务器maven打包->发送到远程应用服务器的tomcat->发布->邮箱通知

参考 :jenkins 邮箱通知配置