Jenkins 是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
本文主要涉及如下内容:
- 持续集成介绍
- Git GitLab 安装
- Jenkins 安装
- Jenkins 插件安装
- Docker 及 Docker Harbor 安装
- Spring Boot 持续集成演示
持续集成介绍
持续集成(Continuous integration)简称 CI,在软件开发过程中指的是频繁的将代码集成到主干版本;持续集成的目的是为了让产品更快的迭代,同时保持比较高的质量。
持续集成的措施:
- 减少风险
- 减少重复过程
- 任何时间、任何地点生成可部署的软件
- 增强项目的可见性
- 建立团队对开发产品的信心
持续集成的原则:
- 统一的代码库
- 自动构建
- 自动测试
- 每个人每天都要向代码库主干提交代码
- 每次代码递交后都会在持续集成服务器上触发一次构建
- 保证快速构建
- 模拟生产环境的自动测试
- 每个人都可以很容易的获取最新可执行的应用程序
- 每个人都清楚正在发生的状况
- 自动化的部署
持续集成的步骤:
- 提交代码
- 构建
- 部署
- 测试
- 回滚
软件介绍
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 安装
- 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
- 安装依赖
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
- 安装 GitLab
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
yum install -y gitlab-ee
- 修改配置
vi /etc/gitlab/gitlab.rb
external_url 'http://192.168.137.200:82'
nginx['listen_port'] = 82
- 重新加载配置并重启
### 重新加载配置时间较长,需耐心等待,5-10 分钟
gitlab-ctl reconfigure
### 重启
gitlab-ctl restart
访问测试 http:192.168.137.200:82,初次访问需要设置密码:
GitLab 用户在组里面有 5 种不同权限:
- Guest:可以创建 issue、发表评论,不能读写版本库
- Reporter:可以克隆代码,不能提交,QA、PM 可以赋予这个权限
- Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限
- Maintainer:可以创建项目、添加 tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权限
- Owner:可以设置项目访问权限 Visibility Level、删除项目、迁移项目、管理组成员,开发组组长可以赋予这个权限
Jenkins 安装
- 安装 JDK 11
yum install java-11-openjdk* -y
- 获取 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
- 修改 Jenkins 配置
vi /etc/sysconfig/jenkins
修改内容如下:
JENKINS_USER=“root”
JENKINS_PORT="8888"
- 重启 Jenkins
systemctl start jenkins
- 访问测试 http://192.168.137.200:8888,初始密码位于 /var/lib/jenkins/secrets/initialAdminPassword。
注意(重要):插件选择无,不安装,不安装,不安装!等后续配置使用国内镜像,不然网速慢的下载会一直失败。
- 修改 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
- 下载中文插件
jenkins-->manage jenkins-->manage plugins-->available
filter 输入 Chinese,安装重启,即可汉化。
Docker 安装
- 更新 yum 源
yum update
- 卸载旧版本
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
- 安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的。
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置 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
- 安装 Docker
yum install docker-ce
- 开机自启动
systemctl start docker
systemctl enable docker
7、验证安装
docker --version
- 设置国内镜像,需要重启服务
vi /etc/docker/daemon.json(没有就新建)
{
"registry-mirrors": ["https://zydio188.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
- 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 安装
- 下载安装文件并解压
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
- 修改配置 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
- 执行命令下载镜像及安装
./prepare
./install
docker harbor 启动停止命令:
docker-compose up -d #启动
docker-compose stop #停止
docker-compose restart #重新启动
默认用户名密码:admin/Harbor12345。
新建用户:
新建项目:
新建 base 项目用于存放基础的镜像,如 JDK。
- 如果没有配置 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,安装完成后会多个凭据的菜单。
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 安装:
服务器上安装 Git:
yum install git
添加凭据 GitLab 的用户名密码凭证:
构建一个项目,源码管理选择相应的凭证:
如果凭证有问题会报错。
立即编译,控制台输出:
Jenkins 服务器上面可以看到代码已经下载下来:
Jenkins 插件管理
Maven 插件安装
jenkins-->manage jenkins-->manage plugins-->available 搜索 Maven Integration 安装重启:
Git 插件安装
jenkins-->manage jenkins-->manage plugins-->available 搜索 Git 安装重启:
Jenkins 全局工具配置 JDK、Maven
jenkins-->manage jenkins-->Global Tool Confifiguration,配置如下:
Jenkins 全局变量设置 JAVA_HOME、MAVEN_HOME。
jenkins-->Manage Jenkins->Configure System->Global Properties:
修改 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 了!
持续集成流程说明:
- 创建 spring-boot-demo 工程用于演示应用部署
- 代码上传到 Git
- 创建 Jenkins 任务、编写构建脚本
- 编译、打包、镜像构建
- 镜像拉取
- 远程部署
- 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
- 准备一个 Spring Boot 工程,里面就简单的一个接口:
引用 Jib 插件:
<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 服务器:
- 新建 Jenkins 任务:
构建脚本:
clean install -DskipTests jib:build -DsendCredentialsOverHttp=true
执行构建后脚本:
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
服务器上看镜像已经拉取,并启动:
总结
Jenkins 作为目前最流行的 CI&CD 工具软件领导者,提供了超过 1000 个插件来支持构建、部署、自动化,满足任何项目的需要,从而简化运维的成本。