持续集成(CI)简单总结

383 阅读7分钟

安装环境

  • 组件使用:jenkins+nexus+docker+openjdk+maven+git
  • 单阿里云服务器配置如下

CPU&内存:2核8 GiB

操作系统:Alibaba Cloud Linux 2.1903 LTS 64位

安装Docker

在了解了 Docker 的作用后,我们来开始安装 Docker。在开始安装之前,需要安装 device-mapper-persistent-datalvm2 两个依赖。

device-mapper-persistent-dataLinux 下的一个存储驱动, Linux 上的高级存储技术。 Lvm 的作用则是创建逻辑磁盘分区。这里我们使用 CentOSYum 包管理器安装两个依赖:

yum install -y yum-utils device-mapper-persistent-data lvm2

依赖安装完毕后,我们将阿里云的 Docker 镜像源添加进去。可以加速 Docker 的安装。

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y

安装完毕,我们可以先查看一下docker版本

docker -v
systemctl start docker
systemctl enable docker

配置阿里云镜像加速器

image-20220319134157527.png

在使用 systemctl 启动来启动 Docker 了。systemctlLinux 的进程管理服务命令,他可以帮助我们启动 docker

systemctl start docker 
systemctl enable docker

安装OpenJDK

因为jenkins与nexus运行都依赖于java虚拟机所以先安装openjdk环境,这里要强调一下不仅仅java语言编写的项目运行在jdk虚拟机上,只要项目所开发使用的语言满足java虚拟机规范,就可以在其上面运行

yum install -y java

安装git

yum install -y git

安装Jenkins

由于 Yum 源不自带 Jenkins 的安装源,于是我们需要自己导入一份 Jenkins 安装源进行安装。导入后,使用 Yum 命令安装即可

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins

我们直接调用 service jenkins start 启动 Jenkins 即可

service jenkins start
# service jenkins restart restart 重启 Jenkins
# service jenkins restart stop 停止 Jenkins

查看安装目录已经运行状态

[root@master ~]# whereis jenkins
jenkins: /usr/bin/jenkins /usr/share/jenkins
[root@master ~]# systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
   Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-03-19 14:10:46 CST; 5s ago
 Main PID: 7878 (java)
   CGroup: /system.slice/jenkins.service
           └─7878 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war --httpPort=8080

Mar 19 14:10:45 master jenkins[6878]: 2022-03-19 06:10:45.064+0000 [id=26]        INFO        jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.545+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: System config loaded
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.546+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: System config adapted
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.633+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.654+0000 [id=30]        INFO        jenkins.InitReactorRunner$1#onAttained: Configuratio...s updated
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.718+0000 [id=44]        INFO        hudson.model.AsyncPeriodicWork#lambda$doRun$1: Start... metadata
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.723+0000 [id=44]        INFO        hudson.util.Retrier#start: Attempt #1 to do the acti...es server
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.839+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: Completed initialization
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.865+0000 [id=20]        INFO        hudson.lifecycle.Lifecycle#onReady: Jenkins is fully...d running
Mar 19 14:10:46 master systemd[1]: Started Jenkins Continuous Integration Server.
Hint: Some lines were ellipsized, use -l to show in full.

配置Jenkins 启动端口

vim /usr/lib/systemd/system/jenkins.service

jenkins启动端口8080,默认用户为jenkins 用户组为jenkins

image-20220319135737488.png 配置阿里云安全组,将28080端口暴露出去

image-20220319140802450.png

image-20220319140853600.png

# 修改完配置,重启jenkins
[root@master ~]# systemctl restart jenkins
# 再次
[root@master ~]# systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
   Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-03-19 14:10:46 CST; 5s ago
 Main PID: 6878 (java)
   CGroup: /system.slice/jenkins.service
           └─6878 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war --httpPort=28080
# 可以看到,程序启动参数中 httpPort=28080

Mar 19 14:10:45 master jenkins[6878]: 2022-03-19 06:10:45.064+0000 [id=26]        INFO        jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.545+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: System config loaded
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.546+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: System config adapted
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.633+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.654+0000 [id=30]        INFO        jenkins.InitReactorRunner$1#onAttained: Configuratio...s updated
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.718+0000 [id=44]        INFO        hudson.model.AsyncPeriodicWork#lambda$doRun$1: Start... metadata
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.723+0000 [id=44]        INFO        hudson.util.Retrier#start: Attempt #1 to do the acti...es server
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.839+0000 [id=29]        INFO        jenkins.InitReactorRunner$1#onAttained: Completed initialization
Mar 19 14:10:46 master jenkins[6878]: 2022-03-19 06:10:46.865+0000 [id=20]        INFO        hudson.lifecycle.Lifecycle#onReady: Jenkins is fully...d running
Mar 19 14:10:46 master systemd[1]: Started Jenkins Continuous Integration Server.
Hint: Some lines were ellipsized, use -l to show in full.
# 查看28080端口是否被jenkins占用
[root@master ~]# lsof -i:28080
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    6878 root  126u  IPv6 4957350      0t0  TCP *:28080 (LISTEN)
[root@master ~]# 

根据服务器的公网ip:28080即可访问

若是不生效 ,关掉jenkins:systemctl stop jenkins

单独执行: /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war --httpPort=28080

然后重启jenkins:systemctl restart jenkins

访问成功后,界面提示获取登录密码方式,将密码复制进输入框即可

cat /var/lib/jenkins/secrets/initialAdminPassword

安装插件,因为 Jenkins 插件服务器在国外,所以速度不太理想。我们需要更换为清华大学的 Jenkins 插件源后,再安装插件,所以先不要点安装插件。

更换方法很简单。进入服务器,将 /var/lib/jenkins/updates/default.json 内的插件源地址替换成清华大学的源地址,将 google 替换为 baidu 即可

sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json

接着点击 安装推荐的插件 即可。安装完毕后出现主页面

image-20220319142234272.png

安装Maven

image-20220319152110030.png

image-20220319152008011.png

安装Nexus

下载nexus

链接: pan.baidu.com/s/1Kb__4UoU… 提取码: 6cbr

开始安装

# 创建软件安装文件夹
[root@master ~]# mkdir /usr/local/soft
[root@master ~]# cd /usr/local/soft/
# 将nexus-3.29.0-02-unix.tar.gz 放入 /usr/local/soft/路径下,并解压
[root@master soft]# tar -zxvf nexus-3.29.0-02-unix.tar.gz 
# 解压完成
[root@master soft]# ls -ll
total 160004
drwxr-xr-x 9 root root      4096 Mar 12 18:34 nexus-3.29.0-02
-rw-r--r-- 1 root root 163835797 Dec 13  2020 nexus-3.29.0-02-unix.tar.gz
drwxr-xr-x 3 root root      4096 Mar 12 18:34 sonatype-work
# 配置nexus启动端口
[root@master etc]# cd /usr/local/soft/nexus-3.29.0-02/etc/
[root@master etc]# ls -ll
total 24
drwxr-xr-x 2 root root 4096 Mar 12 18:34 fabric
drwxr-xr-x 2 root root 4096 Mar 12 18:34 jetty
drwxr-xr-x 3 root root 4096 Mar 12 18:34 karaf
drwxr-xr-x 2 root root 4096 Mar 12 18:34 logback
-rw-r--r-- 1 root root  384 Mar 12 18:35 nexus-default.properties
drwxr-xr-x 2 root root 4096 Mar 12 18:34 ssl
[root@master etc]# vim nexus-default.properties

image-20220319143340343.png

如果你的操作系统内存吃紧,nexus可以配置虚拟机参数启动如下:

[root@master bin]# pwd
/usr/local/soft/nexus-3.29.0-02/bin
[root@master bin]# cat nexus.vmoptions 
-Xms2703m # 这里启动时候要求给虚拟机提供2g的空间,改成1024
-Xmx2703m # 这里启动时候要求给虚拟机提供2g的空间,改成1024
-XX:MaxDirectMemorySize=2703m
-XX:+UnlockDiagnosticVMOptions
-XX:+LogVMOutput
-XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-XX:-OmitStackTraceInFastThrow
-Djava.net.preferIPv4Stack=true
-Dkaraf.home=.
-Dkaraf.base=.
-Dkaraf.etc=etc/karaf
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
-Dkaraf.data=../sonatype-work/nexus3
-Dkaraf.log=../sonatype-work/nexus3/log
-Djava.io.tmpdir=../sonatype-work/nexus3/tmp
-Dkaraf.startLocalConsole=false
#
# additional vmoptions needed for Java9+
#
# --add-reads=java.xml=java.logging
# --add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED
# --patch-module=java.base=lib/endorsed/org.apache.karaf.specs.locator-4.2.9.jar
# --patch-module=java.xml=lib/endorsed/org.apache.karaf.specs.java.xml-4.2.9.jar
# --add-opens=java.base/java.security=ALL-UNNAMED
# --add-opens=java.base/java.net=ALL-UNNAMED
# --add-opens=java.base/java.lang=ALL-UNNAMED
# --add-opens=java.base/java.util=ALL-UNNAMED
# --add-opens=java.naming/javax.naming.spi=ALL-UNNAMED
# --add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED
# --add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED
# --add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED
# --add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED
# --add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED
# --add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED
#
# comment out this vmoption when using Java9+
#
-Djava.endorsed.dirs=lib/endorsed

# 启动nexus
[root@master bin]# cd /usr/local/soft/nexus-3.29.0-02/bin/
[root@master bin]# ./nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus
[root@master bin]# lsof -i:28081
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    7368 root  756u  IPv4 4990435      0t0  TCP *:28081 (LISTEN)
[root@master bin]# 

nexus运行成功,配置阿里云安全组,将28081端口暴露出去(同上配置步骤),根据服务器的公网ip:28081即可访问

将文件中获取到的密码输入进去,登录用户名是 admin

cat /opt/nexus/sonatype-work/nexus3/admin.password

登录成功

image-20220319150808659.png

构建项目

jenkins

创建任务

image-20220319151208164.png

配置凭证你的gitee账号密码,这凭证账号用于去你的gitee仓库拉取项目代码使用

image-20220319152648003.png

配置任务操作如下:

  1. 选择参数化构建
  2. 将当前任务与gitee仓库中的项目进行关联,通过项目https地址与登录gitee的账号密码
  3. 并且指定执行项目内的Jenkinsfile脚本

image-20220319151243651.png

image-20220319151318676.png

image-20220319155000336.png

image-20220319151447664.png

nexus

创建docker私有仓库,其中做用就是jenkins在执行Jenkinsfile脚本的时候,会将拉取gitee项目执行项目中的Jenkinsfile脚本,将项目打成jar并且构建成docker镜像发送到nexus的docker私有仓库

image-20220319153036883.png

docker私有仓库完成后,如果私服对外访问地址为HTTP的话,还需要在服务器配置一下才可以使用(HTTPS不需要配置)。

找到 daemon.json 文件,该文件描述了当前 docker 配置的镜像加速地址,和配置过的私服地址。

vi /etc/docker/daemon.json

找到 insecure-registries 字段,如果不存在就自己添加一个。值是数组类型,将你的制品库地址填写上去。例如:

[root@master bin]# cat /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://xxxxxx.mirror.aliyuncs.com"
],
  "insecure-registries": [
    "121.55.129.213:28082"
 ],
 "exec-opts": [
     "native.cgroupdriver=systemd"
 ]
}
[root@master bin]# docker login 121.55.129.213:28082
# 输入你的nexus登录账号密码即可

springboot

创建springboot项目,并且将其推送到gitee仓库

image-20220319154239230.png

image-20220319155229697.png

image-20220319155333769.png

执行任务

image-20220319154733665.png

查看构建日志

image-20220319154859128.png