1 持续集成说明

持续集成流程说明.png

  • Jenkins安装和持续集成环境配置 - 图2首先,开发人员每天进行代码提交,提交到Git仓库。
  • Jenkins安装和持续集成环境配置 - 图3Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到持续集成服务器,再配合JDK,Maven等软件完成代码的编译、测试、审核、打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
  • Jenkins安装和持续集成环境配置 - 图4最后,Jenkins把生成的jar包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用了。

2 服务器列表

  • 虚拟机中统一使用CentOS7。 | 名称 | IP地址 | 安装的软件 | | —- | —- | —- | | 代码托管服务器 | 192.168.18.100 | Gitlab-12.4.2 | | 持续集成服务器 | 192.168.18.101 | Jenkins-2.263,JDK11,Maven3.6.3,Git, SonarQube | | 应用测试服务器 | 192.168.18.102 | JDK11 |

3 JDK的安装

3.1 前提说明

  • 服务器的IP为192.168.18.101和192.168.18.102需要安装JDK。

3.2 卸载默认的JDK

  • 查询系统已安装的JDK:
  1. yum list installed | grep -i java

查询系统已安装的JDK.png

  • 卸载默认的JDK:
  1. # xxx代表yum list installed | grep -i java命令返回的内容,只需要将其他版本的JDK卸载即可
  2. yum remove xxx

3.3 安装JDK11

  • 安装JDK11:
  1. yum -y install java-11-openjdk-devel

4 Gitlab代码托管服务器的安装

4.1 Gitlab简介

  • 官网
  • Gitlab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
  • Gitlab和GitHub一样属于第三方基于Git开发的产品,免费且开源(基于MIT协议),和GitHub类似,可以注册用户,任意提交自己的代码,添加ssh key等等。不同的是,Gitlab是可以部署到自己的服务器上的,数据库等一切信息都掌握在自己手里,适合团队内部协作开发。换言之,Gitlab可以看作个人版的GitHub。

4.2 前提说明

  • 服务器的IP是192.168.18.100。

4.3 Gitlab的安装

  • 安装相关依赖:
  1. yum -y install policycoreutils openssh-server openssh-clients postx
  • 启动ssh服务并设置为开机自启动:
  1. systemctl enable sshd && systemctl start sshd
  • 设置postfix开机自启,并启动,postfix支持gitlab发信功能:
  1. systemctl enable postx && systemctl start postx
  • 关闭防火墙(测试的时候,可以这样做,生产环境不建议):
  1. systemctl stop firewalld
  1. systemctl disable firewalld
  1. wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
  1. rpm -i gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
  • 修改Gitlab配置:
  1. vim /etc/gitlab/gitlab.rb
  1. # 修改Gitlab访问地址和端口,默认为80,我们改为82
  2. external_url 'http://192.168.18.100:82'
  3. nginx['listen_port'] = 82
  • 重载配置以及重新启动Gitlab(需要耐心等待一段时间):
  1. sudo gitlab-ctl reconfigure
  1. sudo gitlab-ctl restart
  • 开机自启动:
  1. systemctl enable gitlab-runsvdir.service
  • 启动成功后,看到以下管理员root密码的页面,修改密码后,重新登录即可。

Gitlab安装.png

4.4 Gitlab创建组、创建用户、创建项目

4.4.1 创建组

  • 使用管理员root创建组,一个组里面可以有多个项目,可以将开发添加组里面进行设置权限,不同的组就是公司不同的开发项目或者服务模块,不同的组添加不同的开发即可实现对开发设置权限的管理。

创建组.png

创建组2.png

4.4.2 创建用户

  • 创建用户的时候,可以选择Regular(普通用户:只能访问属于他的组和项目)或Admin(可以访问所有的组和项目)类型。

创建用户.png

创建用户2.png

  • 创建完用户,立即修改密码:

创建用户3.png

创建用户4.png

4.4.3 将用户添加到组中

将用户添加到组中.png

将用户添加到组中2.png

将用户添加到组中3.png

Gitlab用户在组里面有5种不同的权限。

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

将用户添加到组中4.png

将用户添加到组中5.png

4.4.4 在用户组中添加项目

  • 可以用root管理员在用户组中添加项目,也可以用刚才创建的账户登录到Gitlab中添加项目(需要重设密码,略)。

在用户组中创建项目.png

在用户组中创建项目2.png

在用户组中创建项目3.png

在用户组中创建项目4.png

5 源码上传到Gitlab仓库

5.1 前提说明

  • 本人使用的IDEA是2020.3版本的,在Windows系统上进行代码开发。

5.2 项目代码

项目是以SpringBoot项目为例。

  • pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.7.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>springboot2</artifactId>
  13. <version>1.0</version>
  14. <name>springboot2</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>11</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. <exclusions>
  29. <exclusion>
  30. <groupId>org.junit.vintage</groupId>
  31. <artifactId>junit-vintage-engine</artifactId>
  32. </exclusion>
  33. </exclusions>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>
  • 启动类:
  1. package com.example.springboot2;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Springboot2Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Springboot2Application.class, args);
  8. }
  9. }
  • 业务类:
  1. package com.example.springboot2.web;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. /**
  5. * @author 许大仙
  6. * @version 1.0
  7. * @since 2021-01-12 09:18
  8. */
  9. @RestController
  10. public class HelloController {
  11. @RequestMapping(value = "/hello")
  12. public String hello() {
  13. return "hello";
  14. }
  15. }

5.3 项目结构如下

项目结构.png

5.4 将代码提交到Gitlab仓库中

先add,commit,再push。

项目代码提交到gitlab中.png

项目代码提交到gitlab中2.png

项目代码提交到gitlab中3.png

6 Jenkins安装

6.1 前提说明

  • 服务器的IP是192.168.18.101。
  • 防火墙已经关闭。
  1. systemctl stop firewalld
  1. systemctl disable firewalld

6.2 安装JDK

  • 略(上面已经安装过了)。

6.3 下载Jenkins

  1. wget http://mirrors.jenkins-ci.org/redhat/jenkins-2.263-1.1.noarch.rpm

6.4 安装Jenkins

  • 安装Jenkins:
  1. rpm -ivh jenkins-2.263-1.1.noarch.rpm

安装Jenkins.gif

6.5 修改Jenkins的配置

  • 修改Jenkins的配置:
  1. vim /etc/sysconfig/jenkins
  1. JENKINS_USER="root"
  1. JENKINS_PORT="8888"

6.6 启动Jenkins

  • 启动Jenkins:
  1. systemctl start jenkins
  • 开机自启动:
  1. systemctl enable jenkins

6.7 打开浏览器访问

访问Jenkins.png

6.8 获取并输入密码

  • 获取并输入密码:
  1. cat /var/lib/jenkins/secrets/initialAdminPassword

获取并输入密码.png

获取并输入密码2.png

6.9 跳过插件安装

  • 因为Jenkins插件需要默认连接官网下载,速度巨慢,而且经常会失败,所以可以暂时跳过插件安装。

跳过插件安装.png

跳过插件安装2.png

6.10 添加一个管理员账户,并进入Jenkins后台

创建管理员,并进入Jenkins后台.png

创建管理员,并进入Jenkins后台2.png

创建管理员,并进入Jenkins后台3.png

创建管理员,并进入Jenkins后台4.png

7 Jenkins插件管理

7.1 概述

  • Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用。比如从Gitlab拉取代码,使用Maven构建项目等功能都需要依靠插件完成。

7.2 修改Jenkins插件的下载地址

  • Jenkins国外官方插件地址下载速度非常慢,所以我们需要手动修改为国内插件地址。
  • Jenkins—>Manage Jenkins—>Manage Plugins,点击Available。

修改Jenkins插件的下载地址.png

修改Jenkins插件的下载地址2.png

修改Jenkins插件的下载地址3.png

这么做的目的是为了将Jenkins官方的插件列表下载到本地。

  • 修改地址文件,替换为国内插件地址:
  1. cd /var/lib/jenkins/updates
  1. sed -i 's#http:\/\/updates.jekins-ci.org\/download#https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins#g' default.json && sed -i '#/http:\/\/www.google.com#https:\/\/www.baidu.com#g' default.json
  • 点击Manage Plugins中的Advanced,将Update SIte改为国内插件下载地址:
  1. https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

点击Manage Plugins中的Advanced,将Update SIte改为国内插件下载地址.png

7.3 下载中文汉化插件

  • Jenkins—>Manage Jenkins—>Manage Plugins,点击Available,搜索“Chinese”。

下载中文汉化插件.png

下载中文汉化插件2.png

  • 重启Jenkins后,就看到Jenkins汉化了(但是,可能部分菜单汉化会失败)。

下载中文汉化插件3.png

8 Jenkins用户权限管理

8.1 概述

  • Jenkins本身的授权管理是很粗糙的,我们可以使用“Role-based Authorization Strategy”插件来管理Jenkins的用户权限。

8.2 安装Role-based Authorization Strategy插件

安装Role-based Authorization Strategy插件.png

8.3 开启全局安全策略

  • 开启全局安全策略:

开启全局安全策略.png

  • 授权策略切换为“Role-Based Stragegy”,保存。

授权策略切换.png

8.4 创建角色

  • Manage Jenkins—>Manage and Assign Roles:

创建角色.png

  • 点击“Manage Roles”:

点击管理角色.png

点击管理角色2.png

  • Global roles:全局角色,管理员等高级用户可以创建基于全局的角色。
  • Item roles:项目角色,针对某个或某些项目的角色。
  • Node roles:节点角色,节点相关权限的角色。
  • 添加下面三个角色:
    • baseRole:该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins的访问权限。注意:如果不给后续的用户绑定这个角色,会报错:用户名 is missing the Overall/Read Permission。
    • role1:该角色为项目角色。使用正则表达式绑定“spring.*”,意思是只能操作spring开头的项目。
    • role2:该角色为项目角色。使用正则表达式绑定“springboot.*”,意思是只能操作springboot开头的项目。

添加角色.png

8.5 创建用户

  • Manage Jenkins—>Manage Users—>新建用户:

创建自定义用户.png

创建自定义用户2.png

  • 分别创建两个用户:jack和eric:

分别创建两个用户.png

8.6 给用户分配权限

  • Manage Jenkins—>Manage and Assign Roles—>Assign Roles:

给用户分配权限.png

给用户分配权限2.png

  • 绑定规则如下:
    • jack用户分别绑定baseRole和role2角色。
    • eric用户分别绑定baseRole和role1角色。

给用户分配权限3.png

9 Jenkins的凭证管理

9.1 概述

  • 凭证可以用来存储需要密文保护的数据库密码、GitHub密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方应用进行交互。

9.2 安装Credentials Binding插件

  • 要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件。

安装Credentials Binding插件.png

  • 安装插件后,多了“管理凭证”的菜单,在这里管理所有的凭证信息:

安装Credentials Binding插件后.png

安装Credentials Binding插件后1.png

  • 可以添加的凭证有5种:

凭证类型.png

  • Jenkins安装和持续集成环境配置 - 图60Username with password:用户名和密码。
  • Jenkins安装和持续集成环境配置 - 图61SSH Username with private key:使用SSH用户和密钥。
  • Jenkins安装和持续集成环境配置 - 图62Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
  • Jenkins安装和持续集成环境配置 - 图63Secret text:需要保密的一个加密的文本串,比如钉钉或GitHub的api token。
  • Jenkins安装和持续集成环境配置 - 图64Certificate:通过上传证书文件的方式。

常用的凭证类型有:Username with password(用户名密码)和SSH Username with private key(SSH密钥)。

9.3 安装Git插件和Git工具

  • 为了让Jenkins支持从Gitlab上拉取源码,需要安装Git插件以及在CentOS7上安装Git工具。
  • Git插件的安装:

安装Git插件.png

  • 在CentOS7上安装Git:
  1. yum install -y git
  1. git --version

9.4 用户密码类型

9.4.1 创建凭证

  • Jenkins—>凭证—>系统—>全局凭证—>添加凭证:

用户密码类型之创建凭证.png

用户密码类型之创建凭证2.png

9.4.2 测试凭证是否可用

  • 创建自由项目:

用户密码类型之创建自由项目.png

用户密码类型之创建自由项目2.png

  • 找到“源码管理”—>“Git”,在Repository URL复制Gitlab中的项目URL:

用户密码类型之复制项目的URL.png

用户密码类型之复制项目的URL2.png

  • 此时,会报错说无法连接到仓库,那是因为没有选择刚才添加的凭证。

选择凭证,保存配置.png

  • 点击构建“Build Now”开始构建项目:

用户密码类型之开始构建项目.png

用户密码类型之开始构建项目查看控制台输出.png

用户密码类型之开始构建项目查看控制台输出2.png

  • 查看/var/lib/jenkins/workspace/目录,可用发现已经从Gitlab中成功拉取代码到Jenkins中。

查看Jenkins中的目录,发现代码已经从Gitlab拉取到了Jenkins中.png

9.5 SSH密钥类型

9.5.1 SSH免登录示意图

SSH免登录示意图.png

9.5.2 使用root用户生成公钥和私钥

  • 使用root用户生成公钥和私钥:
  1. ssh-keygen -t rsa

使用root用户生成公钥和私钥.png

  • 默认生成的公钥和私钥在/root/.ssh目录中,其中id_rsa是私钥文件,id_rsa.pub是公钥文件:
  1. ll /root/.ssh

默认生成的公钥和私钥路径.png

9.5.3 把生成的公钥放到Gitlab中

  • 以root账户登录—>点击头像—>Settings—>SSH Keys。
  • 复制刚才生成的id_rsa.pub文件的内容,点击“Add Key”:

把生成的公钥放到Gitlab中.png

9.5.4 在Jenkins中添加凭证,配置私钥

  • 在Jenkins中添加凭证,类型为“SSH Username with private key”,把刚才生成的私钥文件的内容复制进去。

在Jenkins中添加凭证,配置私钥.png

添加SSH凭证.png

9.5.5 测试凭证是否可用

  • 新建“test02”项目—>源码管理—>Git,这里要使用Gitlab的SSH连接,并且选择SSH凭证:

SSH密钥类型之创建项目.png
SSH密钥类型之创建项目2.png

  • 同样尝试构建项目,如果代码可以正常拉取,则代表凭证配置成功。

10 Maven的安装和配置

10.1 前提说明

  • 服务器的IP是192.168.18.101。
  • 防火墙已经关闭。

10.2 下载、安装和配置Maven

  • 下载Maven:
  1. wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
  • 解压Maven:
  1. unzip -d /usr/local apache-maven-3.6.3-bin.zip
  • 配置环境变量:
  1. vim /etc/profile
  1. # 增加到文件的末尾
  2. export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.9.11-2.el7_9.x86_64
  3. export MAVEN_HOME=/usr/local/apache-maven-3.6.3
  4. export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
  1. source /etc/profile
  • 查看是否安装成功:
  1. mvn -v
  • 修改Maven的本地仓库,并配置阿里云镜像:
  1. cd /usr/local/apache-maven-3.6.3
  1. mkdir repository
  1. vim conf/settings.xml
  1. <!-- 修改内容 -->
  2. <localRepository>/usr/local/apache-maven-3.6.3/repository</localRepository>

修改Maven的本地仓库.png

  1. <mirrors>
  2. <!-- 修改内容 -->
  3. <mirror>
  4. <id>aliyunmaven</id>
  5. <mirrorOf>*</mirrorOf>
  6. <name>阿里云公共仓库</name>
  7. <url>https://maven.aliyun.com/repository/public</url>
  8. </mirror>
  9. </mirrors>

修改Maven镜像为阿里云镜像.png

10.3 全局工具关联JDK和Maven

  • Jenkins—>Manage Jenkins—>Global Tool Configuration—>JDK—>新增JDK:

全局工具关联JDK.png

全局工具关联JDK2.png

全局工具关联JDK3.png

JDK11 /usr/lib/jvm/java-11-openjdk-11.0.9.11-2.el7_9.x86_64

  • Jenkins—>Manage Jenkins—>Global Tool Configuration—>Maven->新增Maven:

全局工具关联Maven.png

全局工具关联Maven2.png

apache-maven-3.6.3 /usr/local/apache-maven-3.6.3

10.4 添加Jenkins全局变量

  • Jenkins—>Manage Jenkins—>Configure System—>Global Properties,添加三个全局变量:JAVA_HOME、M2_HOME和PATH+EXTRA。

添加Jenkins全局变量.png

添加Jenkins全部变量2.png

JAVA_HOME /usr/lib/jvm/java-11-openjdk-11.0.9.11-2.el7_9.x86_64

M2_HOME /usr/local/apache-maven-3.6.3

PATH+EXTRA $M2_HOME/bin

10.5 测试Maven是否配置成功

  • 使用之前的gitlab密码测试项目,修改配置:

测试Maven是否配置成功.png

  • 构建—>增加构建步骤—>Execute Shell。

测试Maven是否配置成功2.png

  • 输入如下的构建命令:
  1. mvn clean install

测试Maven是否配置成功3.png

  • 再次构建,如果将项目打成jar包,代表Maven环境配置成功。

测试Maven是否配置成功4.png