docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

GitLab介绍

GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。

GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装文档

GitLab安装

1、拉取镜像

此处本人拉取的是中文版镜像,也可以拉取非中文版的,任选

shell 复制代码
 docker pull twang2218/gitlab-ce-zh

2、运行镜像

shell 复制代码
docker run -d \
--name gitlab \
--restart always \
-p 8083:443 -p 8089:80 -p 8082:22 \
-v /etc/localtime:/etc/localtime:ro \
-v /home/gitlab/config:/etc/gitlab \
-v /home/gitlab/logs:/var/log/gitlab \
-v /home/gitlab/data:/var/opt/gitlab \
--privileged=true \
18da462b5ff5

命令解释:

docker run

-d #后台运行

--name gitlab #设置容器名称为gitlab

--restart always #容器自启动

-p 8083:443 #将容器内部端口向外映射

-p 8089:80 #将容器内80端口映射至宿主机8089端口,这是访问gitlab的端口

-p 8082:22 #将容器内22端口映射至宿主机8022端口,这是访问ssh的端口

--v /home/gitlab/config:/etc/gitlab #用于存储极狐GitLab 配置文件。

-v /home/gitlab/logs:/var/log/gitlab #用于存储日志

-v /home/gitlab/data:/var/opt/gitlab #用于存储应用程序数据

--privileged=true #让容器获取宿主机root权限

gitlab/gitlab-ce #镜像的名称,这里也可以写镜像ID

3、修改配置

  • 进入容器内部
shell 复制代码
docker exec -it gitlab bash
  • 修改gitlab.rb文件
shell 复制代码
//先进入到gitlab目录
cd /etc/gitlab   
//编辑gitlab.rb文件  
vim gitlab.rb
  • 修改gitlab.rb文件中的IP与端口号

在gitlab创建项目时候http地址的host(不用添加端口),这里的ip我指定的是我服务器的公网ip

external_url 'http://xx.xx.xx.xx'

shell 复制代码
//配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '194.xxx.xx.xx' //和上一个IP输入的一样
gitlab_rails['gitlab_shell_ssh_port'] = 8022 // 此端口是run时22端口映射的8082端口
:wq //保存配置文件并退出
  • 配置gitlab.yml文件
shell 复制代码
// 文件路径 /opt/gitlab/embedded/service/gitlab-rails/config
//先进入到config目录下
cd /opt/gitlab/embedded/service/gitlab-rails/config
//打开编辑gitlab.yml文件
vim gitlab.yml
//修改host 与上面.rb文件修改的一致
//修改port 为8090 这个是对应的我们访问gitlab的ip
  • 在容器内,重启gitlab
shell 复制代码
gitlab-ctl restart

4、登录

此处注意一定要打开对应的端口,否则无法访问,此处本人,直接是开启了一个区间的端口,就不再一个一个打开了

地址为:ip:访问端口

第一次访问默认是root账户,会需要修改密码(密码至少8位数)设置好之后确定就行

5、添加成员


6、提交代码到远程仓库

  • 此处为了模拟操作,因为本人此处已经提交过一次了,这里可以先将远程仓库移出,重新push



  • 此处就是复制你的gitlab的提交地址(如果你未登录此时会提示您需要登录,输入您的账号密码即可)
  • push完之后,您就可以在您的gitlab仓库中看到您提交的代码了

7、给项目添加成员

此处gitlab成员,已经在上述操作4中已经添加过了,此时我们只需要给该项目添加,我们在操作4中添加的成员即可

此处我将此成员的角色设置为开发人员,下图有具体的成员权限讲解




Jenkins搭建

1、Jenkins简介

Jenkins是一个开源软件项目,起源于Hudson(Hudson是商用的),是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成;Jenkins软件使开发人员能够快速找到并解决代码库中的缺陷,并自动进行构建测试。Jenkins中文官网

什么是CI/CD?

  • 当多个开发人员一起开发一个软件项目时,持续集成(CI)的目标是让他们的代码能够快速、平滑地合并在一起。这通过自动化的构建和测试过程来实现,以确保新代码与现有代码的兼容性,并及早发现和解决问题。
  • 持续交付(CD)则是在持续集成的基础上更进一步,强调将软件交付到生产环境的自动化。它的目标是确保每个代码更改都经过自动化的构建、测试和部署流程,使得软件的交付变得更加高效、可靠。这样可以更快地向用户提供更新的软件版本和功能。
  • 简而言之,持续集成就是为了保证团队成员的代码能够顺利地合并在一起,而持续交付则是为了确保这些代码能够快速、可靠地发布到用户手中。通过这两个方法,开发团队能够更高效地合作,减少错误,并且更快地推出新功能和更新版本。

2、Jenkins安装

下面是安装Jenkins的最低的要求:

因为下面我们部署的是java应用所以需要了解jenkins目前版本适配的jdk版本;官方版本对照

1、安装jdk

因为此处我们项目是java项目,使用的是jdk1.8,所以我们需要先安装jdk,下载地址,此处我们下载的为azul版本

RPM包和tag包的区别:



  • 将该rpm安装包上传到服务器上
  • 先检查我们宿主机上是否安装过jdk
shell 复制代码
java -version
  • 查看操作系统的版本
shell 复制代码
uname -m
  • 安装jdk
shell 复制代码
yum install zulu8.74.0.17-ca-jdk8.0.392-linux.x86_64.rpm
  • 检查jdk是否安装成功
  • 配置环境变量

yum 命令安装默认安装路径为 /usr/lib/jvm

vim /etc/profile 编辑配置文件 在配置文件下方插入

shell 复制代码
#jdk的安装位置,此处默认为/use/lib/jvm
export JAVA_HOME=/usr/lib/jvm/java-8-zulu-openjdk-jdk

export JRE_HOME=${JAVA_HOME}/jre
 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
 
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
 
export PATH=$PATH:${JAVA_PATH}
  • 刷新配置文件,使配置文件生效
shell 复制代码
source /etc/profile 
  • 检查编译环境
shell 复制代码
javac -version
2、安装maven

maven官方下载地址

此处下载的版本为3.8.8

  • 将下载好的tar包上传到linux服务器中
  • 解压改tar文件
shell 复制代码
tar -zxvf apache-maven-3.8.8-bin.tar.gz
  • 创建本地仓库
  • 配置setting.xml文件,修改配置

本地依赖保存地址

xml 复制代码
<localRepository>/home/maven/local_repository/</localRepository>

阿里云镜像

xml 复制代码
<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>
</mirror>
  • 配置maven环境变量
shell 复制代码
vi /etc/profile

export MAVEN_HOME=/home/maven/apache-maven-3.8.8
export PATH=$PATH:$MAVEN_HOME/bin
  • 重新加载配置
shell 复制代码
source /etc/profile

:::success

此处有一个坑,就是在上文中安装jdk的时候指定JAVA_HOME目录时,地址错误,导致报错,我们此处只需要将对应的JAVA_HOME改成正确的安装目录即可

:::

  • 验证
shell 复制代码
 mvn -v
3、安装git
  • 使用yum的方式安装git
shell 复制代码
 yum -y install git
  • 查看git是否安装成功
shell 复制代码
git --version

安装目录默认是在/usr/libexec/git-core

4、安装
  • 拉取镜像

此处安装的版本为2.361.1,因为此处版本为TSL(长期支持版)版本,并且低版本无法安装插件,此处虽然,2.346是最后一个支持jdk1.8的版本,但是我们可以指定我们宿主机安装的jdk目录,来编译jdk版本为1.8的项目;下面会有具体操作

shell 复制代码
docker pull jenkins/jenkins:2.361.1
  • 运行jenkins
shell 复制代码
docker run -d  --restart=always -m2G -u root -p 8088:8080 -p 50000:50000   \
-v /home/jenkins/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/docker:/etc/docker \
-v /usr/bin/docker:/usr/bin/docker \
-v /home/maven/apache-maven-3.8.8:/usr/local/maven \
--group-add=998 \
--name jenkins  \
729c87ece8d0

命令解释

docker run: 运行一个新的容器

-d: 在后台以守护进程方式运行容器

--restart=always: 容器停止后自动重启

-m2G: 限制容器内存为2GB

-u root: 以root用户身份运行容器

-p 8088:8080: 将容器的8080端口映射到主机的8088端口,用于访问Jenkins Web界面

-p 50000:50000: 将容器的50000端口映射到主机的50000端口,用于Jenkins的Agent连接

-v /home/jenkins/jenkins_home:/var/jenkins_home: 将主机的/var/jenkins_home目录挂载到容器的/var/jenkins_home目录,用于持久化保存Jenkins的数据(此处只需要修改这一段的宿主机目录即可,其他可以不用修改)

-v /etc/localtime:/etc/localtime:ro: 将主机的当前时区配置文件挂载到容器,使容器与主机使用相同的时区

-v /var/run/docker.sock:/var/run/docker.sock: 将主机的Docker守护进程的Unix Socket挂载到容器,使容器能够与宿主机上的Docker进行交互

-v /etc/docker:/etc/docker: 将主机的Docker配置文件挂载到容器,用于共享Docker配置

-v /usr/bin/docker:/usr/bin/docker: 将主机的Docker可执行文件挂载到容器,使容器能够使用宿主机上的Docker命令

-v /home/maven/apache-maven-3.8.8:/usr/local/maven: 将宿主机的maven安装目录进行指定

--group-add=998: 将容器内的gid 998添加到容器中的附加组列表中

--name jenkins: 将容器命名为"jenkins"

729c87ece8d0: 使用jenkins/jenkins镜像的2.346.1版本作为容器的基础镜像

  • 打开端口

4、访问jenkins页面

  • 设置密码
    访问地址 :ip:访问端口(此处我设置的为8088)
    此处密码会在启动后在控制台输出,可以使用命令docker logs jenkins查看,然后再将这一串密码复制到下面的管理员密码处,即可登录

登录成功后显示,一般选择安装推荐插件即可

下面是本人在安装中,发现安装插件很慢

  • 如果等太久可以直接刷新页面,跳过下载
  • 此处默认就是服务器的ip:jenkins访问端口,可以不用修改
  • 通过下面方法解决插件安装慢的问题


更新为:http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

  • 安装maven插件

安装完之后会在下面显示下面内容

5、新建项目并运行

点击新建item->构建一个maven项目

:::success

  • 此处gitlab中存在一个测试项目,我们将此连接,复制到jenkins中

    :::

  • 在jenkins中添加当前gitlab的登录的账号名密码(设置管理凭据)

    路径:manage Jenkins->Manage Credentials

    此处就是我添加的gitlab的全局凭据,里面的内容就是gitlab的登录账号名和密码

  • 配置全局变量(jdk和maven)

    路径:manage Jenkins->Global Tool Configuration

  • 指定pom


  • 配置jdk目录

因为此处我们项目是使用的jdk1.8,此处jenkins版本默认是jdk11,那么我们采取下列方式进行修改编译时的jdk版本

进入到容器内部

shell 复制代码
 docker exec -it jenkins bash

将宿主机的jdk,复制到容器中的一个固定目录(此处及是将我们宿主机安装的jdk,复制到容器内部)

shell 复制代码
docker cp /usr/lib/jvm/java-8-zulu-openjdk-jdk(宿主机目录) jenkins(容器名):/usr/local/zulujdk8(容器中目录)

切换成我们配置的jdk1.8


因为此处我们将容器中的文件已经挂载出来了,可以看到编译后项目生成在此处

此插件可以将打包好的jar包传到对应其他的服务器中

添加远程服务器配置,此步骤是将打包好的jar,发送到目标服务器,并运行




在运行项目中配置上文中配置的ssh地址;这个Post Steps代表bulid后执行的操作


此配置是Exec命令执行时的超时设置;此处其实可以不必担心,本人在下面命令中已经设置了对应的处理方式(以日志追加的方式,去运行,并不会程序报错直接卡死,导致超时)

shell 复制代码
#运行命令
nohup /source/java/jdk1.8.0_261/bin/java -jar /data/pm/test_jenkins/test_jenkins-0.0.1-SNAPSHOT.jar >/data/pm/test_jenkins/log.log 2>&1 &
  • 点击运行

点击运行之后,日志输出

目标服务器对应目录下

6、其他设置介绍
1、设置per steps

此处设置为构建前运行的命令,此处一般存在的"需求"为,当我们需要重新构建时,我们一般会kill正在运行的java程序,清理一些内容

  • 新建脚本文件

将此脚本放到,目标jar包执行的服务器下(尽量放在同一目录,好维护)

shell 复制代码
vi test_jenkins.sh

#赋于执行权限
chmod +x 文件名
  • 编写脚本
shell 复制代码
#删除历史数据
#删除该目录下的所有文件rm -f /data/pm/test_jenkins/* 
#删除该目录下的指定几个文件rm -f /data/pm/test_jenkins/log.log ...
rm -f /data/pm/test_jenkins/log.log

#获取传入的参数(运行命令传入进来的第一个参数,并赋值给appname,这个参数为项目名称)
appname=$1

#输出这个第一个参数内容
echo "arg:$1"


#获取正在运行进程,其中包含参数$1 并且  包含java -jar的   并且把ps -ef中的第二个列字符内容输出出来赋值给pid
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`

echo $pid

#如果pid为空,提示一下,否则,执行kill命令
if [ -z $pid ];
#使用-z 做空值判断

        #如果为空执行
        then
                echo "$appname not started"
        #如果不为空执行       
        else

               #杀死该进程
               kill -9 $pid
               #输出
               echo "$appname stoping...."

#结束if判断
fi

#判断是否杀死了这个进程   -w 精准匹配这个pid  筛选为appname的
check=`ps -ef | grep -w $pid | grep "$appname" `

if [ -z $check ];
        then
                echo "$appname pid:$pid is stop"
        else
                echo "$appname stop failed"

#结束if判断
fi
  • 执行脚本

配置bulid前执行内容

shell 复制代码
bash /data/pm/test_jenkins/test_jenkins.sh test_jenkins
2、自动触发

例如:当提交代码后,自动触发构建;这种一般不常用,正常都是手动点击,或者手动部署,了解即可

shell 复制代码
http://jenkins访问ip+端口/job/test_jenkins/build?token=shenlbang123456

但是此处会存在一个问题,如果退出了jenkins,或者去其他页面访问,此时就无法触发执行,所以需要依赖下面插件(Build Authorization Token RootVersion)

需要将指定执行的链接替换成;http://jenkins访问ip+端口/buildByToken/build?job=需要指定的任务名称\&token=shenlbang123456

在gitlab里配置对应的参数


此处可以配置完之后点击测试一下,你会发现,在jenkins上会执行对应的内容

3、其他几种构建方式

下面几种方式了解即可

  • cron表达式定时构建介绍

此处的cron表达式,并不支持秒级的单位,所以和开发中常用的cron表达式,有所区别

markdown 复制代码
*号代表任意
/号代表间隔
-号代表范围区间

第一个 * 表示每个小时的第几分钟,取值0~59
H * * * *
H:每小时执行一次
*/5 每隔五分钟执行一次

第二颗 * 表示小时,取值0~23(24小时制)
* 15 * * * 表示每天下午3点
* 1 * * *  表示每天凌晨1点


第三颗 * 表示一个月的第几天,取值1~31
* 1 5 * *  表示每月5日凌晨1点
   

第四颗 * 表示第几月,取值1~12
* 15 5 1 *  表示每年几月执行
  

第五颗 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日
1-6 表示周1到周6
  • 轮询SCM

    也是通过时间表达式的方式,但是和上面的cron表达式略有差别;是通过配置时间,去比对,远程分支上代码的是否发生改变;会根据配置的时间,定时的去比对,远程代码分支上的内容是否发生过改变,如果改变了,则会触发构建。需要由五个参数构成;


第一个号代表:分钟,一个小时内的分钟数
第二个
号代表:小时,一个天内的小时数

第三个号代表:天,一个月内的某一天
第四个
号代表:月,一个年内的某一月

第五个*号代表:周,一个星期内的某一天

4、邮件通知
  • 新增凭据

此处配置的为QQ邮箱的凭据

  • 配置通知



  • 设置全局的邮件通知设置

此处主要要记得先设置,jenkins登录人的邮件地址,否则可能会出现下面报错


QQ邮箱参考文档

可以测试一下是否可以发送

  • 在对应项目中设置邮件通知




相关推荐
不务专业的程序员--阿飞6 分钟前
【SQL 如何解锁递归】
java·数据库·sql
嘵奇13 分钟前
Spring Boot拦截器详解:原理、实现与应用场景
java·spring boot·后端
八股文领域大手子13 分钟前
Java死锁排查:线上救火实战指南
java·开发语言·面试
jackson凌20 分钟前
【Java学习笔记】finalize方法
java·笔记·学习
fanTuanye23 分钟前
redis 缓存穿透,缓存击穿,缓存雪崩
java·redis·缓存
神秘的t40 分钟前
Spring Web MVC————入门(2)
java·spring·mvc
开开心心就好1 小时前
高效全能PDF工具,支持OCR识别
java·前端·python·pdf·ocr·maven·jetty
冷心笑看丽美人1 小时前
Spring MVC数据绑定和响应 你了解多少?
java·spring·mvc
XQ丶YTY1 小时前
大二java第一面小厂(挂)
java·开发语言·笔记·学习·面试
一零贰肆1 小时前
深入理解SpringBoot中的SpringCache缓存技术
java·springboot·springcache·缓存技术