用户您好!请先登录!

Jenkins和maven,gitlab 如何实现自动化部署流程

Jenkins和maven,gitlab 如何实现自动化部署流程

几年前没用过jenkins的时候,每次都需要用eclipse打个war包,然后小心翼翼的上传到服务器,给服务器原有的war包改个名字,mv到bak目录中,停止服务,删除原有的webapps的项目,再把新上传的war包放进到tomcat的webapp说的目录下,启动项目。每次改个html的标签的名字都需要重新上传,每次都是这么繁琐的操作。其实小公司还可以容忍,如果是比较大的项目,还持续停留在这个脚本上运维人员都累死了,因为有可能一次部署几十个项目。

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

jenkins

  • 历史

Hudson是在2004年的夏天由Sun公司开发

2005年2月开源并发布了第一个版本。

Hudson发布的时候CruiseControl是CI界的老大哥,但是很快,在大约2007年的时候Hudson已经超越CruiseControl。2008年5月的JavaOne大会上,Hudson获得了开发解决方案类的Duke’s Choice奖项。从此,小弟翻身做大哥,Hudson成为CI的代名词。

2010年9月,乌龟壳公司偷偷把Hudson®™变成了注册商标。2010年11月,Hudson社区的核心开发人员发现并angry了,双方进行了不太友好的会谈,不出意料的谈崩了。圣诞节过后,

2011年的第一场雪,比以往来的要晚一些,几个秃顶的大叔在McDonald‘s的豪华包间里做了一个艰难的决定:

mv -f hudson jenkins

Hudson和Jenkins都拥有代码;

Hudson有Oracle和Sonatype’s corporate的支持和Hudson的注册商标

Jenkins拥有的是大多数的核心开发者,社区,和后续更多的commit。

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

jenkins git 、maven gitlab 、tomcat 构建持续集成环境 流程

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

1> 开发者将新版本push到git server (Gitlab)。

2> Gitlab随后触发jenkins master结点进行一次build。(通过web hook或者定时检测)

3> jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个slave结点根据一个事先设置好的脚本进行build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给jenkins来做。

4> 我们在build中要进行编译,这里使用了分布式编译器distcc来加快编译速度。

jenkins的工作原理是先将源代码从gitlab中拷贝一份到本地,然后根据设置的脚本进行build。我们可以看出,整个系统的关键就是那个build脚本,用来告诉jenkins在一次集成中需要执行的任务。

这次将结合一个比较简单maven聚合项目,结合之前的maven私服,git私服和将要搭建的jenkins完成自动化构建。

  • gitlab,nexus私服,jenkins,tomcat的搭建

通过源码生成4个虚拟机,准备工作。vagrant已经安装了 对应的docker。

用docker安装nexus就是为了避免环境变量,用户赋权等复杂的操作。对于vagrant的如何安装不用的系统不一样可以参看

mac 安装vgarant :https://idig8.com/2018/07/29/docker-zhongji-07/

window安装vgaranthttps://idig8.com/2018/07/29/docker-zhongji-08/

系统类型IP地址节点角色CPUMemoryHostnameCentos7192.168.66.100gitlab22GgitlabCentos7192.168.66.101jenkins22GjenkinsCentos7192.168.66.102nexus22GnexusCentos7192.168.66.103tomcat22Gtomcat

(1). 虚拟机vagrant讲述安装的步骤

vagrant up

(2).机器window/mac开通远程登录root用户下

su -
# 密码
vagrant
#设置 PasswordAuthentication yes
vi /etc/ssh/sshd_config
sudo systemctl restart sshd
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

四台机器公共执行命令

su -
#密码
vagrant
service docker restart
yum install -y lrzsz

注意:下面除了jenkins的机器不是使用docker,其他全部使用docker全装

66.100 gitlab安装

管理员:root

密码:123456789qwe

mkdir gitlab
cd gitlab
vi start.sh
mkdir postgresql redis gitlab
chown -R 200 postgresql
chown -R 200 redis
chown -R 200 gitlab
  • 编写脚本
cur_dir=`pwd`
docker stop gitlab-postgresql
docker rm gitlab-postgresql
docker stop gitlab-redis
docker rm gitlab-redis
docker stop gitlab
docker rm gitlab
docker run --name gitlab-postgresql -d \
--env 'DB_NAME=gitlabhq_production' \
--env 'DB_USER=gitlab' --env 'DB_PASS=password' \
--env 'DB_EXTENSION=pg_trgm' \
--volume ${cur_dir}/postgresql:/var/lib/postgresql \
sameersbn/postgresql:10
docker run --name gitlab-redis -d \
--volume ${cur_dir}/redis:/var/lib/redis \
sameersbn/redis:4.0.9-1
docker run --name gitlab -d \
--link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
--publish 10022:22 --publish 10080:80 \
--env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
--env 'GITLAB_ROOT_PASSWORD=123456789qwe' \
--env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
--env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
--env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
--volume ${cur_dir}/gitlab:/home/git/data \
sameersbn/gitlab[root@gitlab ~]#
  • 启动gitlab

重点说下 不要用rz来上传我提供的start.sh脚本sh start.sh的时候会报错。sh start.sh需要执行两遍,不要问我为啥,我也不知道,第一遍执行玩容器自己就挂掉了,在启动一遍就好了

sh start.sh
sh start.sh
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

66.101 jenkins安装

这个不使用容器,相对来说安装比较复杂些。这个机器不光需要安装jenkins,还需要安装maven,git,jdk1.8

  • 为了让各位老铁安装jdk1.8 git 和maven美滋滋,写了个脚本
# @Author: liming
# @Date: 2018-11-26 23:14:59
# @Last Modified by: liming
# @Last Modified time: 23:15:05
# @urlblog idig8.com
# 个人公众号 编程坑太多
#!/bin/bash
SOFT_PATH=/opt/soft
if [ ! -d $SOFT_PATH ];then
mkdir $SOFT_PATH
else
echo "文件夹已经存在"
fi
yum install -y wget
#install jdk1.8
cd $SOFT_PATH
wget wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"
tar -zxvf jdk* -C $SOFT_PATH
cd jdk*
JAVA_HOME=`pwd`
#install maven3.2.3
cd $SOFT_PATH
wget https://archive.apache.org/dist/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.tar.gz
tar -zxvf apache-maven-3.2.3-bin.tar.gz -C $SOFT_PATH
mv apache-maven-3.2.3 maven-3.2.3
cd maven*
MAVEN_HOME=`pwd`
#install git 2.8.0
cd $SOFT_PATH
yum -y install zlib-devel openssl-devel cpio expat-devel gettext-devel curl-devel perl-ExtUtils-CBuilder perl-ExtUtils- MakeMaker
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.0.tar.gz
tar -zxvf git-2.8.0.tar.gz -C $SOFT_PATH
cd git*
./configure
make install
ln -s /usr/local/bin/git /usr/bin/git
#追加环境变量
echo "export JAVA_HOME=${JAVA_HOME}" >> /etc/profile
echo "export PATH=$""JAVA_HOME/bin:$""PATH" >> /etc/profile
echo "export MAVEN_HOME=${MAVEN_HOME}" >> /etc/profile
echo "export PATH=$""MAVEN_HOME/bin:$""PATH" >> /etc/profile
source /etc/profile
#输出信息
echo "-----source update-----"
echo "java version"
java -version
echo "maven version"
mvn -v
echo "-----path-----"
echo "JAVA_HOME:"$JAVA_HOME
echo "MAVEN_HOME:"$MAVEN_HOME
source /etc/profile
  • 查看环境变量

如果环境变量不生效请执行:source /etc/profile

source /etc/profile
git --version
java -version
mvn -v
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
  • 下载jenkins

官网:https://jenkins.io/

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

下载jenkins

wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.138.3/jenkins.war
# 先这样启动目的是直接可以看到秘钥因为第一次安装需要秘钥
java -jar jenkins.war --ajp13Port=-1 --httpPort=8888
#这是后台启动
nohup java -jar jenkins.war --ajp13Port=-1 --httpPort=8888 &
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
  • pipline的插件全部安装
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
  • 之前我也用docker安装过jenkins插件老安装失败各种错误。这次我不用docker插件全部安装成功

66.102 nexus安装

管理员:admin

密码:admin123

mkdir nexus
cd nexus
vi start.sh
mkdir data && chown -R 200 data
  • start.sh
#!/bin/bash
cur_dir=`pwd`
docker stop nexus
docker rm nexus
docker run -d -p 8081:8081 --name nexus -v ${cur_dir}/data:/sonatype-work sonatype/nexus
  • 启动脚本
sh start.sh
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

66.103 tomcat安装

tomcat 还讲什么?不懂?干就完了 兄弟!

mkdir tomcat
cd tomcat
vi start.sh
  • 脚本
#!/bin/bash
cur_dir=`pwd`
docker stop tomcat
docker rm tomcat
docker run --name tomcat -p 8080:8080 -v ${cur_dir}/tomcat-persistence:/bitnami bitnami/tomcat:latest
  • 启动脚本
sh start.sh
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
  • war包放在这里
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

以上所有的程序安装已经完毕,开始进行自动化的部署流程

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

环境回顾

应用IP地址服务端口安装应用安装方式

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

本地项目部署到100上gitlab

  • 本地代码

代码比较简单为的是流程

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
  • 本地提交到gitlab上

修改配置,可以非本地化提交代码

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

可以新建用户建立仓库,或者用root建立仓库。

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

提示没有上传ssh 秘钥

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

查看本地的ssh秘钥,window环境直接使用git bash

ssh-keygen -t rsa -C "394498036@qq.com"
cat /c/Users/Administrator/.ssh/id_rsa.pub
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

查看jenkins的ssh秘钥,101环境直接使

ssh-keygen -t rsa -C "394498036@qq.com"
cat /root/.ssh/id_rsa.pub
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

本地windows 和 101的jenkins添加完毕

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

本地windows 代码提交

git init
git add .
git commit -m "注释语句"
git remote add origin ssh://git@192.168.66.100:10022/root/idig8.git
git push -u origin master
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

本地项目部署到101上 jenkins

  • 全局安全性配置
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
  • 创建任务
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

口令随意写,等下要在gitlab做触发设置

Use the following URL to trigger build remotely: JENKINS_URL/job/idig8/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

100 gitlab触发器的设置

http://192.168.66.101:8888/job/idig8/build?token=123456

token的值就是jenkins上设置的。

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

等下有专门的对pipeline的编写

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

保存

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

101的配置私服nexus

cd .m2

pwd

vi settings.xml

settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus-releases</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.66.102:8081/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>nexus-snapshots</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.66.102:8081/nexus/content/repositories/snapshots</url>
</mirror>
</mirrors>

<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus-releases</id>
<url>http://nexus-releases</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>http://nexus-snapshots</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-releases</id>
<url>http://nexus-releases</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-snapshots</id>
<url>http://nexus-snapshots</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>

</settings>
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

安装sshpass,ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码。

 yum -y install sshpass
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

测试gitlab和jenkins

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

正式编写

  • pipeline
#!groovy
pipeline {
agent any
//环境变量,
environment {
REPOSITORY="ssh://git@192.168.66.100:10022/root/idig8.git"
MODULE="idig8"
SCRIPT_PATH="/root/"
remoteHost_tomcat= '192.168.66.103'

}
//流水线是如何提前,都是通过很多个stages下面的stage
stages {
stage('获取代码'){
steps{
echo " start fetch code from git ssh://git@192.168.66.100:10022/root/idig8.git"
deleteDir()
git "${REPOSITORY}"
}
}
stage('代码静态检查') {
steps{
echo " start code check"
}
}
stage('编译+单元测试') {
steps{
echo " start compile"
sh"""
cd $workspace/idig8/common-parent/
mvn -U clean install -Dmvn.test.skip=true -Ptest
"""
}
}

stage('jar包上传到nexus上') {
steps{
echo " start maven update jar"
sh"""
cd $workspace/idig8/common-parent/common-utils
mvn clean deploy
cd $workspace/idig8/common-parent/common-dao
mvn clean deploy
cd $workspace/idig8/common-parent/common-service
mvn clean deploy
"""
}
}

stage('移动目录到用户目录下') {
steps{
echo "mv idig8.war"
sh"""
mv -f $workspace/idig8/common-parent/common-web/target/common-web.war ${SCRIPT_PATH}${MODULE}.war
"""
}
}
stage('拷贝文件到tomcat指定目录下') {

steps{
echo "scp 目标文件"
sh"""
sshpass -p 'vagrant' ssh -p 22 -o stricthostkeychecking=no root@${remoteHost_tomcat} 'rm -rf /root/tomcat/tomcat-persistence/tomcat/data/${MODULE}*';
sshpass -p 'vagrant' scp -P 22 -o stricthostkeychecking=no ${SCRIPT_PATH}${MODULE}.war root@${remoteHost_tomcat}:/root/tomcat/tomcat-persistence/tomcat/data/${MODULE}.war;
"""
echo "打包完毕美滋滋 刷新tomcat查看吧"
}
}

}
}
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

只要push代码流水线自动开启工作,真是美滋滋啊

结果20轮的pipeline的编写终于成功了

删除docker挂载的idig所有的目录,然后替换新的jar包放进去

一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程
一切从实操出发!jenkins和maven,gitlab如何实现自动化部署流程

PS:完成自动化部署,终于完成了 ,在自己的虚拟机环境下搞了3天,感觉好有成就感,首选shell脚本部署学习,pipeline并不是那么麻烦。里面多半是用shell的方式搞定了,多亏自己搞了2年shell的开发。没忘记,必须前2年了解的东西确定对自己的以后的路起关键作用。ssh的公钥也在里面起到了很重要的作用,希望老铁按照我的思路可以轻松的完成部署。感谢老铁的支持,

乞力马扎罗的鱼
乞力马扎罗的鱼

不积跬步,无以至千里

要发表评论,您必须先登录