jenkins + gitlab自动部署

一.基础知识

GitLab:是一个基于Git实现的在线代码仓库托管软件,是用来提供代码托管的。我们可以用在企业内部网络搭建私服。

jenkins:基于Java开发的一种持续集成工具,用于监控持续重复的工作。在提供一个开放易用的软件平台,使软件的持续集成变成可能。

maven:项目管理工具,在这里我们可以执行maven命令来帮我们打包

jdk: Java 语言的软件开发工具包

tomcat:轻量级应用服务器

git:版本控制器

二.整合目的

在日常开发中,以前的流程是需要把项目从gitlab上复制到本地,再打成war包,然后部署到tomcat服务器上运行。开发项目的过程中会经常部署测试环境来验证,重复以上操作会显得很繁琐,浪费大量时间,所以使用jenkins来实现持续集成,对整个开发项目的过程有着重要的战略意义。我们开发软件为了什么?对,简化步骤,提高开发效率,节省时间。

三:流程示意图

请叫我灵魂画师~

四:软件安装

前提:这次整合,我是只使用2台机器,服务器A装jenkins,jdk,maven,服务器B装gitlab和tomcat,其实应该是要个服务器C装tomcat,这样思路就更清楚了,具体情况各位根据实际需求来定哈。

1)B服务器上gitLab安装

1. 安装依赖

sudo yum install curl policycoreutils openssh-server openssh-clients policycoreutils-python

sudo systemctl enable sshd

sudo systemctl start sshd

sudo yum install postfix

sudo systemctl enable postfix

sudo systemctl start postfix

注意:sudo systemctl start postfix 如果报错,如下面所示

Job for postfix.service failed because the control process exited with error code. See "systemctl status postfix.service" and "journalctl -xe" for details.

解决办法:修改 vi /etc/postfix/main.cf的设置

inet_protocols = all

inet_interfaces = all

2. yum 配置镜像加速

我推荐清华大学镜像源 : https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce

操作如下:vi /etc/yum.repos.d/gitlab_gitlab-ce.repo

[gitlab-ce]

name=Gitlab CE Repository

baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/

gpgcheck=0

enabled=1

3. 更新本地云缓存`

sudo yum makecache`

4. 安装`

  sudo yum install gitlab-ce

5. 修改配置项

默认是80端口,如果想要修改端口号的话,打开gitlab.rb文件,修改如下:

sudo vim /etc/gitlab/gitlab.rb

#修改配置项

external_url 'http://<你的服务器地址或域名>:<你想要设置的端口号>'

unicorn['port'] = <你想要设置的端口号>

prometheus['listen_address'] = 'localhost:<你想要设置的端口号>'

sudo gitlab-ctl reconfigure # 重新配置服务;

6. 重启gitlab

gitlab-ctl restart

打开http://<你的服务器IP>:<80>,会弹出一个设置初始密码的界面,按照要求输入初始密码,就会跳转到登录页面。gitlab管理员用户名为root。

我这边是自己创建了用户,下图是注册,完成后登陆。

7. 服务器A上配置免密码登录

客户端命令行生成ssh

ssh-keygen -t rsa

它会生成公钥id_rsa.pub和私钥id_rsa,存放在.ssh目录下。复制公钥到Gitlab的用户设置中的SSH Keys中,点击保存。操作如下图所示

有人问这样做的目的是什么?问得好!这样我们就能建立服务器A跟gitLab的安全连接,我们就可以通过git将gitlab仓库里的代码拉下来或者推送到仓库。

2)A服务器上安装jdk

centOS安装jdk有三种,随便选一种都可以,网上一大堆。我选中的是手动解压安装包。

卸载系统自带的jdk(此步骤建立在centOS7自带jdk1.8的情况,可以跳过,也可以自己安装想要的jdk)

查看当前系统jdk的版本:java -version。(如下图的话则代表自带,继续下面步骤)

列举匹配已安装的java的软件包:

yum list installed | grep java

卸载安装的jdk

yum -y remove java-1.7.0-openjdk* 

yum -y remove java-1.8.0-openjdk*

当结果出现了完毕!,就表示卸载成功。

输入java -version 查看,验证是否卸载成功。

2. 下载jdk1.8安装包

jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载 jdk-8u152-linux-x64.tar.gz(根据自己的系统位数选择对应的包)

然后使用Xftp将下载好的jdk-8u152-linux-x64.tar.gz上传到CentOs上去,我选择的是在usr下创建一个文件夹来专门放压缩包。

3. 在user/local目录下新建java文件夹

# cd /usr/local/

# mkdir java

# cd java

4.解压

进到压缩包所在的目录,将jdk-8u152-linux-x64.tar.gz 解压到我所创建的java文件中。

tar -zxvf jdk-8u152-linux-x64.tar.gz -C /usr/local/java

5.配置环境变量

export JAVA_HOME=/usr/local/java/jdk1.8.0_212

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

注释:

JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径,此路径下包括lib,bin,jre等文件夹(tomcat,Eclipse的运行都需要依靠此变量)。

PATH使得系统可以在任何路径下识别java命令

特别注意:环境变量值的结尾没有任何符号,不同值之间用:隔开(windows中用;)

6.使配置文件生效

source /etc/profile

7.测试配置是否成功

java -version

3 )Maven安装

1. 获取安装包:镜像。

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

2. 提前创建好maven文件夹,解压tar包至maven文件夹

tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/maven

3.配置环境变量

修改 profile 文件

vim /etc/profile

export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin

修改完重载这个文件使文件立即生效,否则重启计算机即可生效。

source /etc/profile

4. 验证 版本

mvn  -v

显示如下则代表成功

Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)

Maven home: /usr/local/maven/apache-maven-3.5.4

Java version: 1.8.0_212, vendor: Oracle Corporation, runtime: /usr/local/java/jdk1.8.0_212/jre

Default locale: zh_CN, platform encoding: UTF-8

OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"

4 )安装jenkins

1. 安装

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

yum install -y jenkins

2. 关闭防火墙

systemctl stop firewalld.service

systemctl disable firewalld.service

3. 配置文件

vi /etc/sysconfig/jenkins

#修改下面内容

JENKINS_USER="root"

...

端口设置成为被占用的

JENKINS_PORT="xxxx"

4. 启动jenkins

systemctl daemon-reload

systemctl start jenkins

systemctl status jenkins

5 )安装git

1. 获取源码包

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.18.0.tar.gz

2. git构建时需要的环境

yum groupinstall "Development Tools"

3. 安装各种devel包

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

openssh-clients

4. 编译并安装,同时输出执行路径到环境变量中

make prefix=/usr/local/git all

make prefix=/usr/local/git install

echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc

source /etc/bashrc

5. 验证能否正常运行:

git --version

五:详细步骤

1. 解锁jenkins

按照提示将代码复制到下面,然后点继续。

2. 点击左边的安装推荐的插件

好吧,等了好几分钟才装完,耐心等待吧。

3. 创建管理员用户,实例配置

注意!安装配置jenkins的时候,会出现插件安装失败的情况。

原因:升级站点问题,站点位于国外,访问起来比较吃力。

解决方式:更换为国内的jenkins镜像就可以了。

操作:系统管理>>管理插件>>高级

将 [升级站点] 更换为

http://mirror.xmission.com/jenkins/updates/current/update-center.json

随后提交即可解决,如下图。

如果是告诉你需要升级jenkins才能搞定,那就在线升级jenkins。

yum安装的升级方法

1、service jenkins stop

2、yum update jenkins

3、service jenkins start

升级完就应该没问题了。

4. 配置jdk,maven,git

首先我们要配置jenkins编译所需要的jdk,maven,顺便把git也配置了。最后点击保存。

注意:jdk home和maven home 可以输入vim /etc/profile看到,直接复制粘贴就行。git的话输入whereis git就可以查到了,一般是git/bin/git这个结尾的。

5. 在jenkins上系统设置gitlab和git

安装Gitlab插件,Gitlab Hook插件,Git插件。打开设置,选择插件管理。点击可选插件,然后在搜索框里输入就可以了,搜索到后点击直接安装。没看懂的可以看我第六那个步骤。

安装完之后,点击系统设置。

找到Gitlab这个配置。

这边需要添加凭证,我选用的类型是gitlab API token。

从哪里获取呢?打开gitlab,用户设置里面有个访问令牌选项。

成功后会如下显示。然后复制这个令牌,保存在你自己知道的地方,不保存就以后就看不到了。

接着把刚才复制的访问令牌粘贴到添加的凭证那里去,点击添加,然后前面的下拉框里选择你刚才添加的凭证。

配置完gitlab后要配置git,2个选项一填就可以了,用户名和邮箱。好了,配置结束。

6. 在jenkins上创建一个maven项目

点击新建Item,或者开始创建一个新任务,然后选择新建maven项目。很多人说没有,比如下图。

那是因为没有安装一个Maven插件。在可选插件里输入Maven Integration,点击安装,不好意思我安装的比较快,没来得及截图。已经在我安装列表里了。

返回到主页面,点击新建,任务名字随便起,选择构建一个maven项目,最后点击确定。

7. 配置源码管理

这里我们用来让jenkins连接gitlab仓库的。

首先打开gitlab,新建一个仓库。这里我喜欢叫仓库,但它翻译成项目。用过github的朋友应该喜欢叫仓库吧。随意啦,强迫症。

写仓库名字,设置私有的,描述可写可不写,然后创建。

仓库列表中就有了你新建的仓库,点击它进入仓库。

复制仓库url。

注意:一开始这个仓库是空的,我这边是刚才上传了个helloworld的maven项目,用来测试下git能不能上传代码到这个仓库,大家试下,后面jenkins配置需要这仓库主分支不能为空。

我是自己windows上安装了git,通过配置idea中的git来push代码,当然也需要生成ssh钥匙在gitlab上添加sshkey。(前面步骤一开始我生成的ssh钥匙是在我安装jenkins的那台服务器A上操作的,和这边的是两回事)。不懂的朋友可以百度下window安装git和生成ssh钥匙。

总结下:因为我们平时写代码是在windows下的idea里进行pull和push的,所以这边生成ssh钥匙并配置是为了能让我们在idea上传代码push到服务器B的gitlab里。而前面那个在jenkins服务器上生成ssh钥匙并配置是为了让服务器A能和服务器B的gitlab安全连接,也就是可以pull和push。

切回jenkins,在源码管理里,粘贴url上去,第二个是添加分支,点击添加,类型选择用户名和密码,输入你gitlab用户名和密码。其实类型可以选择ssh秘钥验证,gitlab访问令牌啊什么的,看你喜欢。

添加完证书后选择证书,如果不报红色的字就说明ok,报的话说明错误。

注意:第三步中,jenkins job默认对master分支进行构建,你也可以自定义分支。这要求你的Gitlab代码仓库中要存在这个分支,一般来说,就是要向代码仓库提交一次更改,请 自行完成(Gitlab项目刚创建时是空的,一个分支也没有,这样的话,自动构建时会出错),这也就是上面先试试上传代码到gitlab是否成功的原因啦。

8. 配置构建触发器

如下图所示操作。我选了当一个push到gitlab的时候就会自动构建,使用钩子webhook,构建URL是jenkins上创建的那个maven项目。记住这个url,后面会用到!

点击高级,出现下图所示。

生成的口令其实就是webhook的安全令牌,等会配置gitlab的时候要用到。

打开gitlab,配置钩子。点击设置,然后集成。把上面记下来的jenkins项目url和webhook安全令牌写进去。

取消掉ssl验证,然后点击add webhook。

点击test中的第一个选项push events模拟push,看看是否成功。

下图表示成功,如果报错自己上网查下为何报错,因为局域网的问题,需要在gitlab上登陆管理员账号,配置里面有个选项就是说允许webhook发送本地指令之类的。

9. 配置build命令

使用maven命令来打包。

10. Post Steps

暂时不用写,注意下面提到的模块六检验成果中开头提到的东西就行,再根据实际情况来定。

11. 构建后操作

我使用的是tomcat热部署。首先要安装Deploy to container插件!!!, 该功能是“将成功编译的War/Jar包部署到远程的应用服务器上。

我们先来配置tomcat远程部署账号,在tomcat目录下conf文件内tomcat-users.xml 文件增加以下配置。

<role rolename="manager-gui"/>

<role rolename="manager-script"/>

<role rolename="manager-jmx"/>

<role rolename="manager-status"/>

<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

在conf文件中的context.xml里context标签中改成<Context antiResourceLocking="true">,这个是为了自动删除之前旧版本的war包。

打开tomcat解压目录找到webapps/manager/META-INF里的context.xml ,需要注释掉这个Value节点。

注意:配置完后验证是否生效,启动tomcat后点击Manager App。输入上面配置的用户名密码看看能不能进入。

选择Deploy war/ear to a container,操作如下。因为jenkins从git上拉下来代码并且打了war在jenkins的target目录下,所以如下图所示。

好了 我们可以开始正片了!

## 六:检验成果

注意!!!!!!!!!!!!!!!!!!!:

这边先讲下,我是建立在tomcat已经启动的情况下操作的,所以我没有写那个第10步。

commit push ,自动构建,成功。

成功了。

那么有些人想要在tomcat没有启动的情况下怎么办呢?那肯定是要写脚本来启动tomcat。具体看模块七血泪坑!

## 七:血泪坑

失败的例子1。

我在构建后操作里使用Deploy war/ear to a container,上面的步骤都有显示,也就是tomcat热部署,然后又在Post Steps里写了脚本,就是关闭tomcat和开启tomcat。但是构建会报错。

参考了这篇文章,但是没什么用,依然构建报错。报错跟下面链接里的一样,我就不贴出来了。

https://blog.csdn.net/weixin_33767813/article/details/86028814

后来我看了下,tomcat热部署 用tomcat manager 本来就有很多漏洞,所以我决定舍弃热部署。

失败的例子2。

舍弃热部署,改用Send build artifacts over SSH,构建成功,tomcat启动失败,那种我也不知道怎么解决。我看网上是说在执行的脚本上加一句export BUILD_ID=dontkillme,因为jenkins是会杀掉tomcat进程的。但是还是没用!

成功的例子。

我们需要执行shell脚本,先关闭tomcat,然后启动tomcat。注意,这边tomcat是装在服务器B的,所以先要实现服务器A免登录服务器B。

方法:先在服务器B的/root/.ssh下创建文件authorized_keys,然后把服务器A的生成的ssh公钥(id_rsa.pub)复制到那个文件上。

注意 authorized_keys 文件的权限必须是600,如果权限不对会影响登录。所以最后输入指令:chmod 600 authorized_keys 就可以了。注意空格!

如下图在postSteps中输入shell命令。意思是ssh连接服务器B,执行B服务器(192.168.31.222)上的restart.sh

#!/bin/bash

echo "执行脚本开始"

TOMCAT_HOME="/root/app/tomcat8.5.42"

ssh root@192.168.31.222  > /dev/null 2>&1 << eeooff

${TOMCAT_HOME}/bin/restart.sh

eeooff

echo done!

echo "执行脚本结束"

下图是restart.sh的脚本内容,这个文件是放在tomcat那台服务器上的,也就是服务器B。

#!/bin/bash

# export BUILD_ID=dontkillme

function shutdown_tomcat () {

    #tomcat_id=`jps | grep Bootstrap | awk '{print $1}'`

tomcat_id=`lsof -i:8765 | awk 'NR==2''{print $2}'`

if [ ! $tomcat_id ];then

echo "tomcat process in ${ip} is not exist."

else

echo "shoutdown ${ip} tomcat"

/bin/kill -9 $tomcat_id

fi

}

function start_tomcat () {

echo "start $ip tomcat"

/bin/sh /root/app/tomcat8.5.42/bin/catalina.sh start

/root/app/jdk1.8.0/bin/jps

}

function restart_tomcat () {

shutdown_tomcat

start_tomcat

}

restart_tomcat

echo "脚本执行完毕"

接着需要安装下Publish over SSH这个插件,然后在全局设置里设置Publish over SSH,密码是你jenkins所在的服务器生成ssh钥匙时设置的,没有设置就不填,Key里填的是你的私钥。

这边填的是ssh连接的主机IP,名字随便取,账号名称就写root,路径写/就行,因为这是全局配置,下面每个项目都有路径配置,会重合一起,注意拼接。填完后测试下连接,成功就ok。

接着回到jenkins项目的配置里,找到构建后操作,把前面步骤中配置好的Deploy war/ear to a container 删掉,我们不用tomcat热部署。我们使用Send build artifacts over SSH。配置如下。

这样就可以了,点击保存,然后看下构建效果吧。脚本执行成功了,这样tomcat开启了。

大功告成。其实方法有很多种,热部署肯定是行得通的,但是没做出来。谢谢大家阅读。有什么错误帮我指出来,我们一起讨论

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容