SpringBoot+Jenkins+Maven+GitLab+Docker持续集成实战

535 阅读6分钟

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

本文主要涉及如下内容:

  • 持续集成介绍
  • Git GitLab 安装
  • Jenkins 安装
  • Jenkins 插件安装
  • Docker 及 Docker Harbor 安装
  • Spring Boot 持续集成演示

持续集成介绍

持续集成(Continuous integration)简称 CI,在软件开发过程中指的是频繁的将代码集成到主干版本;持续集成的目的是为了让产品更快的迭代,同时保持比较高的质量。

持续集成的措施:

  • 减少风险
  • 减少重复过程
  • 任何时间、任何地点生成可部署的软件
  • 增强项目的可见性
  • 建立团队对开发产品的信心

持续集成的原则:

  • 统一的代码库
  • 自动构建
  • 自动测试
  • 每个人每天都要向代码库主干提交代码
  • 每次代码递交后都会在持续集成服务器上触发一次构建
  • 保证快速构建
  • 模拟生产环境的自动测试
  • 每个人都可以很容易的获取最新可执行的应用程序
  • 每个人都清楚正在发生的状况
  • 自动化的部署

持续集成的步骤:

  1. 提交代码
  2. 构建
  3. 部署
  4. 测试
  5. 回滚

软件介绍

Jenkins

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

Spring Boot

Spring Boot 作为当前最流行的微服务应用开发软件按,致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

GitLab

GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 Web 服务。

软件安装

JDK 安装:

yum install java-11-openjdk* -y

Git 安装:

yum install git

GitLab 安装

  1. 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
  1. 安装依赖
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
  1. 安装 GitLab
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash

yum install -y gitlab-ee
  1. 修改配置 vi /etc/gitlab/gitlab.rb
external_url 'http://192.168.137.200:82'

nginx['listen_port'] = 82
  1. 重新加载配置并重启
### 重新加载配置时间较长,需耐心等待,5-10 分钟
gitlab-ctl reconfigure
### 重启
gitlab-ctl restart

访问测试 http:192.168.137.200:82,初次访问需要设置密码:

1586131341338

GitLab 用户在组里面有 5 种不同权限:

  • Guest:可以创建 issue、发表评论,不能读写版本库
  • Reporter:可以克隆代码,不能提交,QA、PM 可以赋予这个权限
  • Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限
  • Maintainer:可以创建项目、添加 tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权限
  • Owner:可以设置项目访问权限 Visibility Level、删除项目、迁移项目、管理组成员,开发组组长可以赋予这个权限

Jenkins 安装

  1. 安装 JDK 11
yum install java-11-openjdk* -y
  1. 获取 rpm 安装包及安装
wget https://pkg.jenkins.io/redhat-stable/jenkins-2.204.2-1.1.noarch.rpm
rpm -ivh jenkins-2.204.2-1.1.noarch.rpm

或者

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 jenkins
  1. 修改 Jenkins 配置
vi /etc/sysconfig/jenkins

修改内容如下:

JENKINS_USER=“root”
JENKINS_PORT="8888"
  1. 重启 Jenkins
systemctl start jenkins
  1. 访问测试 http://192.168.137.200:8888,初始密码位于 /var/lib/jenkins/secrets/initialAdminPassword。

注意(重要):插件选择无,不安装,不安装,不安装!等后续配置使用国内镜像,不然网速慢的下载会一直失败。

  1. 修改 Jenkins 插件下载地址为国内镜像(重要)

点击 jenkins-->manage jenkins-->manage plugins-->available 等待插件列表展示,该步一定要做,因为会将列表保存到 /var/lib/jenkins/updates/default.json 下面。

服务器进入 Jenkins 开发目录:

cd /var/lib/jenkins/updates 

替换 default.json 里面的文件内容,修改镜像为清华大学镜像。

cd /var/lib/jenkins/updates

sed -i 's/http://updates.jenkins-ci.org/download/https://mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json

sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json

同时修改 Web 控台的地址 jenkins-->manage jenkins-->manage plugins-->advanced:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

在这里插入图片描述

重启 http://192.168.137.200:8888/restart,或者服务器执行

systemctl restart jenkins
  1. 下载中文插件

jenkins-->manage jenkins-->manage plugins-->available

filter 输入 Chinese,安装重启,即可汉化。

1585928634267

Docker 安装

  1. 更新 yum 源
yum update
  1. 卸载旧版本
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
  1. 安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的。
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 设置 yum 源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum repolist
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装 Docker
yum install docker-ce
  1. 开机自启动
systemctl start docker
systemctl enable docker

7、验证安装

docker --version
  1. 设置国内镜像,需要重启服务
vi /etc/docker/daemon.json(没有就新建)
{
      "registry-mirrors": ["https://zydio188.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
  1. docker-compose 安装
curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

Docker harbor 安装

  1. 下载安装文件并解压
wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.0.tgz

tar -zxvf harbor-offline-installer-v1.9.0.tgz
  1. 修改配置 harbor.yml
hostname:192.168.137.200
http:
    port: 85

#注释掉 https
https:
    #port: 443
    #certificate: /root/harbor/ssl/reg.chenjf.com.crt
    #private_key: /root/harbor/ssl/reg.chenjf.com.key

1585953789861

  1. 执行命令下载镜像及安装
./prepare 
./install

docker harbor 启动停止命令:

docker-compose up -d #启动
docker-compose stop #停止
docker-compose restart #重新启动
  1. 访问测试 http://192.168.137.200:85

默认用户名密码:admin/Harbor12345。

在这里插入图片描述

新建用户:

1585955667041

新建项目:

1585955709202

新建 base 项目用于存放基础的镜像,如 JDK。

1586132166255

  1. 如果没有配置 HTTPS,Docker 需要添加信任。
vi /etc/docker/daemon.json
{
    "insecure-registries": ["192.168.137.200:85"]
}

重启 Docker:

systemctl daemon-reload

systemctl restart docker

Maven 安装

tar -zxvf apache-maven-3.6.3-bin.tar.gz
mkdir -p /opt/maven
mv apache-maven-3.6.3/* /opt/maven
# 配置
vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
source /etc/profile
mvn -v

Jenkins 凭证管理

Jenkins 凭证管理主要用于保存 Jenkins 连接 GitLab、Docker 等的凭证数据库。

1. 安装

点击 jenkins-->manage jenkins-->available,搜索 Credentials binding,安装完成后会多个凭据的菜单。

1585928838766

1585928856480

2. 凭据的类型

  • Username with password:用户名和密码。
  • SSH Username with private key: 使用 SSH 用户和密钥。
  • Secret fifile:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的 Secret fifile 就会被删除。
  • Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 API token。
  • Certifificate:通过上传证书文件的方式。

演示用户名密码连接 GitLab 用户

安装 Git 插件,点击 jenkins-->manage jenkins-->available,搜索 Git 安装:

1585928940367

服务器上安装 Git:

yum install git

添加凭据 GitLab 的用户名密码凭证:

1585929077841

构建一个项目,源码管理选择相应的凭证:

1585929384025

如果凭证有问题会报错。

立即编译,控制台输出:

1585929420139

Jenkins 服务器上面可以看到代码已经下载下来:

1585929493510

Jenkins 插件管理

Maven 插件安装

jenkins-->manage jenkins-->manage plugins-->available 搜索 Maven Integration 安装重启:

1586135196432

Git 插件安装

jenkins-->manage jenkins-->manage plugins-->available 搜索 Git 安装重启:

1586135252342

Jenkins 全局工具配置 JDK、Maven

jenkins-->manage jenkins-->Global Tool Confifiguration,配置如下:

1586132956996

1586132970173

Jenkins 全局变量设置 JAVA_HOME、MAVEN_HOME。

jenkins-->Manage Jenkins->Configure System->Global Properties:

1586133034333

修改 Maven 的仓库地址:

vi /opt/maven/conf/settings.xml
 <mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
 <mirrors>

Jenkins + Docker + Spring-Boot + Jib 持续集成

Jib 介绍:Google 开源的 Java 容器化工具,有了这个工具,Java 开发人员可以使用他们熟悉的 Java 工具来构建容器。它不需要你编写 Dockerfile 或本地安装 Docker,而且可以直接集成到 Maven 和 Gradle 中——只需要将插件添加到构建中,就可以立即将 Java 应用程序容器化。有了 Jib,再也不用担心不会写 Dockerfile 了!

持续集成流程说明:

  1. 创建 spring-boot-demo 工程用于演示应用部署
  2. 代码上传到 Git
  3. 创建 Jenkins 任务、编写构建脚本
  4. 编译、打包、镜像构建
  5. 镜像拉取
  6. 远程部署

在这里插入图片描述

  1. Docker 拉取 JDK 并上传到 Docker harbor,JDK 是构建镜像的基础软件:
docker pull openjdk

### 打 tag
docker tag openjdk:latest 192.168.137.200:85/base/openjdk11

# 登录到 docker harbor
docker login 192.168.137.200:85 输入用户名密码

# 上传到 docker harbor
docker push 192.168.137.200:85/base/openjdk11

1586133992400

  1. 准备一个 Spring Boot 工程,里面就简单的一个接口:

1586133323927

1586134390841

引用 Jib 插件:

1586134157472

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>2.1.0</version>
    <configuration>
        <from>
            <!--基础镜像 jdk,刚才上传到 harbor 的 jdk-->
            <image>192.168.137.200:85/base/openjdk11</image>
            <!-- docker harbor 用户名密码-->
            <auth>
                <username>chenjf</username>
                <password>Harbor12345</password>
            </auth>
        </from>
        <to>
            <image>192.168.137.200:85/spring-boot/spring-boot-demo:v1</image>
            <!-- docker harbor 用户名密码-->
            <auth>
                <username>chenjf</username>
                <password>Harbor12345</password>
            </auth>
        </to>
        <allowInsecureRegistries>true</allowInsecureRegistries>
    </configuration>
</plugin>

将代码上传到 GitLab 服务器:

1586133259077

  1. 新建 Jenkins 任务:

1585955858405

1585957759492

构建脚本:

clean install -DskipTests jib:build -DsendCredentialsOverHttp=true

1585957768254

执行构建后脚本:

1586134344922

dockerstart.sh 内容如下:

#! /bin/sh
# 停止容器运行并删除
CID=$(docker ps | grep "spring-boot-demo" | awk '{print $1}')
IID=$(docker images | grep "spring-boot-demo" | awk '{print $3}')
if [ -n "$CID" ]; then
        echo "停止容器:$CID"
        docker stop $CID
        echo "删除容器:$CID"
        docker rm -f $CID
fi
# 删除旧镜像
if [ -n "$IID" ]; then
        echo "删除容器:$IID"
        docker rmi -f $IID
fi
# 拉取最新镜像
docker pull 192.168.137.200:85/spring-boot/spring-boot-demo:v1
# 启动
docker run -i -d -p 10080:10080 192.168.137.200:85/spring-boot/spring-boot-demo:v1

服务器上看镜像已经拉取,并启动:

1586134773370

1586134796265

总结

Jenkins 作为目前最流行的 CI&CD 工具软件领导者,提供了超过 1000 个插件来支持构建、部署、自动化,满足任何项目的需要,从而简化运维的成本。