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

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第1张图片

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自动化部署流程(上)(五)_第2张图片

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

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第3张图片

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地址 节点角色 CPU Memory Hostname
Centos7 192.168.66.100 gitlab 2 2G gitlab
Centos7 192.168.66.101 jenkins 2 2G jenkins
Centos7 192.168.66.102 nexus 2 2G nexus
Centos7 192.168.66.103 tomcat 2 2G tomcat

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

vagrant up

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

su -
# 密码
vagrant
#设置 PasswordAuthentication yes
vi /etc/ssh/sshd_config
sudo systemctl restart sshd

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第4张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第5张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第6张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第7张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第8张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第9张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第10张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第11张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第12张图片

四台机器公共执行命令

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自动化部署流程(上)(五)_第13张图片

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
``` bash 
source /etc/profile
git --version
java -version
mvn -v   

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第14张图片

  • 下载jenkins

    官网:https://jenkins.io/

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第15张图片

下载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自动化部署流程(上)(五)_第16张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第17张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第18张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第19张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第20张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第21张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第22张图片

  • pipline的插件全部安装

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第23张图片

  • 之前我也用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自动化部署流程(上)(五)_第24张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第25张图片

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自动化部署流程(上)(五)_第26张图片

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第27张图片

  • war包放在这里

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)

『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)_第28张图片

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

应用 IP地址 服务 端口 安装应用 安装方式
gitlab 192.168.66.100 gitlab 10080 gitlab docker
jenkins 192.168.66.101 jenkins 8888 jdk8 maven3.2 git2.8 shell
nexus 192.168.66.102 nexus 8081 nexus docker
tomcat 192.168.66.103 tomcat 8080 tomcat docker

PS:下一步将关联这4台服务器,进行本地代码的提交到gitlab,然后由jenkins操作命令的形式进行自动化的部署。