Docker、CICD持续集成部署、Gitlab使用、Jenkins介绍

2023-09-04,,

目录
1.Docker的基本操作
1.1镜像拉取
1.2镜像的操作
1.3容器的操作
运行容器
查看正在运行的容器
查看容器运行日志
进入到容器内部
停止容器运行
删除容器
启动容器
2.Docker应用
2.1准备MySQL容器
2.2准备Tomcat容器
2.3数据卷
创建数据卷
查看数据卷的详细信息
查看全部数据卷信息
删除数据卷
应用数据卷
3.Docker自定义镜像
4.Docker-Compose
4.1 下载Docker-Compose
4.2 Docker-Compose管理MySQL和Tomcat容器
4.3 使用docker-compose命令管理容器
4.4 docker-compose配合Dockerfile使用
5.Docker CI/CD
5.1 引言
5.2 CI介绍
5.3 实现持续集成
5.3.1 搭建Gitlab服务器
5.3.2 安装Gitlab Runner
5.3.3 整合项目入门测试
创建maven工程,编写html页面
将maven工程推送到Gitlab中
编写.gitlab-ci.yml文件
解决运行CI流水线作业时出现Job failed (system failure): prepare environment: exit status 1.错误
5.3.4 编写.gitlab-ci.yml文件,实现持续集成
编写.gitlab-ci.yml测试命令使用
编写关于dockerfile以及docker-compose.yml文件的具体内容
删除名称为none的image
CI集成测试
5.4 CD介绍
5.5 实现持续交付和持续部署
5.5.1 安装Jenkins
5.5.2 配置目标服务器
Jenkins连接目标部署服务器
5.5.3 配置Jenkins免密码登录Gitlab
7.5.4 配置JDK和Maven
5.5.5 手动拉取Gitlab项目

1.Docker的基本操作

1.1镜像拉取

使用下面Docker命令拉取镜像,默认从中央仓库中拉取。

docker pull 镜像名(:tag,默认为latest)
#或者
docker pull 镜像链接地址

可以从以下3个地方拉取Docker镜像:

    Docker官方的中央仓库,这个镜像是最全的,但是下载速度是最慢的;

    https://hub.docker.com/

    国内的镜像网站:网易风潮,,daoCloud

    https://c.163yun.com/hub#/home

    http://hub.daocloud.io (推荐使用)

    在公司内部会采用私服的方式拉取镜像。(添加配置)

1.2镜像的操作

查看全部本地的镜像

docker images
#或者
docker image ls
#使用下面的命令可以查看全部的镜像,包括名称为none,或者其他版本的不同镜像
docker image ls -a

删除本地镜像命令如下:

#如果命令正在运行则需要先停止镜像才可删除,否则将会报错
docker rmi 镜像的标识 #镜像的标识为镜像的唯一ID,在删除时可以不写全,只要唯一即可

镜像的导入导出(不规范)

#将本地的镜像到处
docker save -o 导出的路径 镜像ID
#示例
docker save -o ./tomcat.image b8 #.表示当前路径,b8为image ID,此处可以不用写全 #加载本地的镜像文件
docker load -i 镜像文件
#示例
docker load -i tomcat.image
#使用此命令加载完image后,其名字和tag均为none
#可以使用下面命令修改或者设置其image对应的tag
docker tag 镜像ID tomcat:8.5 #tomcat:8.5为修改后的镜像名称和标签,冒号前面为镜像名称,冒号后面为镜像版本

1.3容器的操作

容器就是运行起来之后的镜像。

运行容器

运行容器命令如下,运行时可以使用镜像ID、或者镜像名称+版本号方式指定所运行的镜像。如果使用镜像ID需要提前通过docker images命令查看本机的镜像列表,然后可以查看 对应的镜像ID;如果使用镜像名称+版本号方式指定运行镜像,当本机image仓库中没有对应镜像时,默认会从网络的镜像仓库中拉取镜像到本地并运行,如果不指定版本号则默认为latest版本的镜像。

# 运行容器
# 简单操作,下面命令时比较简单的运行方式,这种方式运行的镜像是无法通过外网进行访问
docker run 镜像标识ID[镜像名称[:tag]]
# 常用命令
docker run -d --name 容器名称 -p 宿主机端口:容器端口 镜像标识ID[镜像名称[:tag]]
# 参数说明:
# -d:代表后台运行命令
# -p 宿主机端口:容器端口:为了映射当前服务器的端口和容器端口,如8080:5001代表外部端口为8080,使用该端口访问,5001为容器内应用开放的端口
# --name 容器名称:指定容器运行起来的名称,即容器运行起来之后的container名称

查看正在运行的容器

查看目前docker正在运行的容器可以使用下面的命令:

docker ps [-qa]
# -a:查看全部的容器,包括没有运行的容器
# -q:之查看符合条件的容器标识,如果加上参数a查看全部容器的标识,如果不加上参数a查看正在运行的容器ID

查看容器运行日志

docker logs -f 容器ID
# -f:标识可以滚动查看日志的最后几行

进入到容器内部

docker exec -it 容器ID bash

停止容器运行

#停止指定ID的容器
docker stop 容器ID
#停止多个容器
docker stop $(docker ps -qa)

删除容器

删除容器前需停止容器,即仅可删除已经停止的容器。

#删除指定ID的容器
docker rm 容器ID
#删除多个容器
docker rm $(docker ps -qa)

启动容器

docker start 容器ID

2.Docker应用

2.1准备MySQL容器

# 运行MySQL容器
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=zhang12345 daocloud.io/library/mysql:5.7.4
# -e:可以设置MySQL容器的参数,此处设置的是对应的密码

可以使用Navicat客户端连接MySQL,默认端口号为3306,登录名为root,密码为在启动Docker时设置的登录密码。

2.2准备Tomcat容器

# 使用命令docker image pull拉取对应tomcat镜像
docker image pull daocloud.io/library/tomcat:8.5.15-jre8 # 使用docker run命令运行tomcat容器
docker run -d --name tomcat -p 8080:8080 b8dfe9ade316
# b8dfe9ade316:代表tomcat对应的镜像ID,也可以使用镜像名称和版本名称代替 # 可以通过命令将宿主机的内容复制到运行的容器内部
docker cp 文件名称 容器ID:容器内部路径
#举个例子
docker cp ssm.war fe://usr/local/tomcat/webapps/

2.3数据卷

为了部署项目SSM的工程,需要使用到cp命令将宿主机内的ssm.war文件复制到容器内部。

数据卷:将宿主机的一个目录映射到容器的一个目录中。

可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变。

创建数据卷

docker volume create 数据卷名称
# 示例
docker volume create tomcat
# 在宿主机上面创建数据卷之后,在宿主机上面会默认存储在一个目录下
# 目录为:/var/lib/docker/volume/数据卷名称/_data
# 在上面目录下会存储宿主机和容器中目录的映射关系

查看数据卷的详细信息

docker volume inspect 数据卷名称
# 示例
docker volume inspect tomcat

显示结果如下:

[
{
"CreatedAt": "2020-07-10T17:39:03+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/tomcat/_data",
"Name": "tomcat",
"Options": {},
"Scope": "local"
}
]

查看全部数据卷信息

docker volume ls

删除数据卷

docker volume rm 数据卷名称
# 示例
docker volume rm tomcat

删除数据卷之后,会对应删除/var/lib/docker/volumes/下对应数据卷的目录文件。

应用数据卷

数据卷的使用时在使用镜像创建容器时候使用的,因此是在使用docker run命令时设置的参数。

# 当使用之前创建的数据卷映射时,如果数据卷不存在,Docker会自动创建对应的数据卷
docker run -v 数据卷名称:容器内部的路径 镜像ID
# 示例
docker run -d --name ssm_tomcat -p 8080:8080 -v volume_ssm_tomcat:/usr/local/tomcat/webapps b8dfe9ade316
# valume_ssm_tomcat:为已经创建好的数据卷的名称
# /usr/local/tomcat/webapps:容器内部的文件路径
# b8dfe9ade316:tomcat镜像ID
# 说明:
# 我们可以跳转到创建数据卷的宿主机目录/var/lib/docker/volumes/volume_ssm_tomcat/_data查看对应文件信息如下
root@ubuntu:/var/lib/docker/volumes/volume_ssm_tomcat/_data# ll
total 28
drwxr-x--- 7 root root 4096 Jul 10 20:10 ./
drwxr-xr-x 3 root root 4096 Jul 10 20:07 ../
drwxr-x--- 14 root root 4096 Jul 10 20:10 docs/
drwxr-x--- 6 root root 4096 Jul 10 20:10 examples/
drwxr-x--- 5 root root 4096 Jul 10 20:10 host-manager/
drwxr-x--- 5 root root 4096 Jul 10 20:10 manager/
drwxr-x--- 3 root root 4096 Jul 10 20:10 ROOT/
# 此时,目录内文件为容器内设置目录下对应的文件,后期更新时,更新此文件夹下文件即可
# 创建完数据卷映射之后,默认会把容器内映射目录下的文件复制到宿主机中
# 直接指定一个宿主机的路径作为数据卷的存放位置,【推荐使用这种方式使用】
docker run -v 宿主机路径:容器内部的路径 镜像ID
# 示例
docker run -d --name ssm_tomcat -p 8080:8080 -v /opt/volume_ssm_tomcat:/usr/local/tomcat/webapps b8
# 说明:
# 我们在宿主机的数据卷映射目录内没有发现对应文件,使用8080端口访问站点时不能访问
# 使用此种方式创建的数据卷映射,不会把容器内映射目录下的文件复制到宿主机中
# 我们可以将需要发布的文件更新至宿主机对应的挂在目录中即可同步至容器的映射目录,此时使用端口可访问对应文件

3.Docker自定义镜像

中央仓库上的镜像,也是Docker的用户自己上传 过去的。

# 1.创建一个Dockerfile文件,并且指定自定义镜像信息,该文件没有后缀名
# Dockerfile文件中常用的内容
from: 指定当前自定义镜像依赖的环境
copy: 将相对路径下的内容复制到自定义镜像中
workdir: 声明镜像的默认工作目录
cmd: 需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准) 示例,自定义一个tomcat中:
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# workdir:启动后自动为当前目录
# cmd:镜像将会自动启动tomcat,因此不需要执行相关命令
# 2.将准备好的Dockerfile和相应的文件拖拽到Linux操作系统中,通过Docker命令制作自定义镜像
docker build -t 镜像名称:[版本] .

4.Docker-Compose

之前运行一个镜像,需要添加大量的参数。

可以通过Docker-Compose编写这些参数。

Docker-Compose可以帮助我们批量的管理容器。

只需要通过一个docker-compose.yml文件去维护即可。

4.1 下载Docker-Compose

在GitHub中下载对应的文件,下载地址:https://github.com/docker/compose/releases/tag/1.24.1

我们使用的是Ubuntu操作系统,因此下载的文件名为docker-compose-Linux-x86_64

统一使用DockerCompose的版本为1.24.1

# 使用下面命令移动至目标文件夹
mv docker-compose-Linux-x86_64 /home/zgs/data/software/ # 为了更方便使用安装文件,将DockerCompose安装包文件名字修改一下
mv docker-compose-Linux-x86_64 docker-compose # 给予DockerCompose安装包以执行的权限
chmod 777 docker-compose
# 执行结果如下:
total 15800
drwxrwxr-x 2 zgs zgs 4096 Jul 15 19:16 ./
drwxrwxr-x 5 zgs zgs 4096 Jul 15 19:10 ../
-rwxrwxrwx 1 zgs zgs 16168192 Jul 15 19:06 docker-compose*

为方便后期操作,我们将文件存放至/usr/local/bin目录下:

sudo cp docker-compose /usr/local/bin/

将DockerCompose文件所在的文件夹/usr/local/bin添加到系统环境变量。

修改/etc/profile文件,在最下面添加该目录。

sudo vim /etc/profile

# 编辑后文件:
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...). if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi export PATH=/usr/local/bin:$PATH

使用source命令重新加载配置后的profile文件:

source /etc/profile
# 在实际操作时可以不使用该命令 # 数据docker-compose命令验证是否成功
docker-compose # 如果输出下面结果,则证明安装成功:
zgs@ubuntu:~$ docker-compose
Define and run multi-container applications with Docker. Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert keys
in v3 files to their non-Swarm equivalent Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information

4.2 Docker-Compose管理MySQL和Tomcat容器

使用yml文件对docke容器进行批量化管理。

yml文件以key: value方式来指定配置信息,这里使用键值方式配置参数,冒号为英文格式,冒号后面紧跟空格,空格后面为对应的参数值。

多个配置信息以换行+缩进的方式来区分,yml文件的缩进是两个空格。

在docker-compose的yml文件中,不要使用制表符,即Tab键。

下面为yml文件示例:

version: '3.1' # docker-compose版本为1.24.1,因此这里为3.1,此属性值根据docker-compose版本不同其对应值不同
services: # 所要负责的服务
mysql: # 服务名称,用户自定义
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: daocloud.io/library/mysql:latest # 指定镜像路径
container_name: mysql # 镜像运行之后容器的名称
ports: #指定内外映射的端口号,如果有多个映射关系依次往下写即可
- 3306:3306 # 注意比ports向后缩进两个空格,-后面有空格
environment: #指定docker image运行时的参数,和docker run命令中指定参数的-e类似
MYSQL_ROOT_PASSWORD: root12345 # 指定mysql的root用户登录密码
TZ: Asia/Shanghai # 设置docker容器的时区为东8区
volumes: # 设置数据卷映射关系
- /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql # 映射宿主机和容器内的文件路径
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.0.15-jre8
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai # TimeZone
volumes:
- /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
- /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

我们可以在hub.daocloud.io中对应镜像的介绍中查看对应文件存放的路径,比如Mysql、Tomcat对应的数据文件路径。

4.3 使用docker-compose命令管理容器

在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件。

# 1.基于docker-compose.yml启动管理的容器,使用该命令之后容器将自动启动
docker-compose up -d

# 2.关闭并删除容器
docker-compose down

# 3.开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart

# 4.查看由docker-compose管理的容器
docker-compose ps

# 5.查看日志
docker-compose logs -f

4.4 docker-compose配合Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器。

要注意文件的路径。

# yml文件
version: '3.1'
srevices:
ssm:
restart: always
build: # 构建自定义镜像配置
context: ../ #指定Dockerfile文件的所在路径
dockerfile: Dockerfile # 指定Dockerfile文件名称
image: ssm:1.0.1 # 指定build镜像的名称
container_name: ssm
ports:
- 8081:8080
environment:
TZ: Asia/Shanghai

# Dockerfile文件
from daocloud.io/library/tomcat:8.0.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
docker-compose up -d
# 如果自定义镜像不存在,会帮助我们构建自定义镜像
# 如果自定义镜像已经存在,会直接运行这个自定义镜像 # 重新构建自定义镜像
docker-compose build
# 运行前,重新构建
docker-compose -d -build

5.Docker CI/CD

5.1 引言

目前的项目部署:

    将项目进行编译打包,生成发布文件;
    将文件上传到指定的服务器中;
    将发布文件放到IIS或者Tomcat目录中;
    通过Dockerfile将其转换成一个镜像,由DockerCompose运行和管理容器。

如果项目更新了,则需要将上面的流程化操作再次的从头到尾执行一次。

5.2 CI介绍

CI(Continuous Integration)持续集成。

持续集成:编写代码时,完成了一个功能后,立即提交代码到Git仓库中,将项目重新的构建并且测试。

快速发现错误
防止代码偏离主分支

5.3 实现持续集成

5.3.1 搭建Gitlab服务器

    创建一个全新的虚拟机,并且至少指定4G的运行内存;
    安装docker以及docker-compose;
    docker-compose.yml文件去安装Gitlab;

在/opt目录下创建docker_gitlab目录,将下面的docker-compose.yml文件放在该目录下。

安装Gitlab的yml文件代码如下,注意里面的IP地址需要根据对应机器进行修改。

version: '3.1'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:11.1.4'
container_name: 'gitlab'
restart: always
privileged: true
hostname: 'gitlab'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.254.129'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['smtp_enable'] = true
gitlab_rails['gitlab_shell_ssh_port'] = 22
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- /opt/docker_gitlab/config:/etc/gitlab
- /opt/docker_gitlab/data:/var/opt/gitlab
- /opt/docker_gitlab/logs:/var/log/gitlab

上面文件中,Gitlab服务器需要使用22端口号,但是该端口号被我们的ssh终端连接端口占用,因此我们需要修改ssh的22端口号为60022,保证Gitlab服务正常使用。

修改/etc/ssh/sshd_config文件中ssh的端口号配置,默认为22并且注释,我们将其取消注释并且修改为60022即可,然后使用sudo systemctl restart sshd命令重启ssh服务即可。

使用下面命令运行docker-compose,构建Gitlab服务器。

docker-compose up -d

执行结果如下:

Pulling gitlab (twang2218/gitlab-ce-zh:11.1.4)...
11.1.4: Pulling from twang2218/gitlab-ce-zh
8ee29e426c26: Already exists
6e83b260b73b: Already exists
e26b65fd1143: Already exists
40dca07f8222: Already exists
b420ae9e10b3: Pull complete
a218309dd589: Pull complete
5c60fd7ba0ce: Pull complete
659c2144b5a3: Pull complete
8289bbac0d0e: Pull complete
31bbd150e8a7: Pull complete
9114e78243fa: Pull complete
0b97fa2153bc: Pull complete
308c7e15be6a: Pull complete
b7f31b8e487d: Pull complete
cbbb6dec5000: Pull complete
0241c9ad6a16: Pull complete
7fa6f0b53edd: Pull complete
1c2861e152b2: Pull complete
0536f3466f66: Pull complete
Digest: sha256:3c2372e3285e6d6933ddebb5ee3ae0c4bbf7cb235084e54d33d7f0ddf4813c4a
Status: Downloaded newer image for twang2218/gitlab-ce-zh:11.1.4
Creating gitlab ... done # 表示创建成功

安装成功之后可以使用下面地址访问Gitlab,第一次访问时需要输入初始密码,由于我们在创建Gitlab服务器时开启了smtp服务,因此可以使用邮件发送功能。

http://192.168.254.129[IP地址]:80

登录的用户名默认为root,密码默认为初始我们自己设置的密码,登陆后主页如下所示:

5.3.2 安装Gitlab Runner

我们这里使用Docker镜像的方式安装、运行Gitlab Runner,使用下面命令从仓库中获取Gitlab Runner对应的镜像,镜像获取时时间较长,可能需要多次重试或者等待。

docker pull gitlab/gitlab-runner:latest

由于镜像速度比较慢,因此采用直接在服务器安装的方式使用,这里以Ubuntu Server为例介绍Gitlab Runner的安装、与Gitlab服务器中项目的关联。

使用下面的命令添加Gitlab的官方仓库地址。

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

执行结果如下:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload Upload Total Spent Left Speed
100 5945 100 5945 0 0 7563 0 --:--:-- --:--:-- --:--:-- 7554
Detected operating system as Ubuntu/focal.
Checking for curl...
Detected curl...
Checking for gpg...
Detected gpg...
Running apt-get update... done.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/runner_gitlab-runner.list...done.
Importing packagecloud gpg key... done.
Running apt-get update... done. The repository is setup! You can now install packages.

使用下面命令安装Gitlab Runner最新版本。

sudo apt-get install gitlab-runner

执行结果如下:

Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
docker-engine
The following NEW packages will be installed:
gitlab-runner
0 upgraded, 1 newly installed, 0 to remove and 61 not upgraded.
Need to get 58.2 MB of archives.
After this operation, 82.9 MB of additional disk space will be used.
Get:1 https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal/main amd64 gitlab-runner amd64 13.2.0 [58.2 MB]
Fetched 58.2 MB in 18s (3,212 kB/s)
Selecting previously unselected package gitlab-runner.
(Reading database ... 71223 files and directories currently installed.)
Preparing to unpack .../gitlab-runner_13.2.0_amd64.deb ...
Unpacking gitlab-runner (13.2.0) ...
Setting up gitlab-runner (13.2.0) ...
GitLab Runner: creating gitlab-runner...
Runtime platform arch=amd64 os=linux pid=25037 revision=353dd94e version=13.2.0
gitlab-runner: Service is not running.
Runtime platform arch=amd64 os=linux pid=25044 revision=353dd94e version=13.2.0
gitlab-ci-multi-runner: Service is not running.
Runtime platform arch=amd64 os=linux pid=25065 revision=353dd94e version=13.2.0
Runtime platform arch=amd64 os=linux pid=25153 revision=353dd94e version=13.2.0
Clearing docker cache...

安装完成,下面我们进行注册,与Gitlab中的指定项目绑定。

在Gitlab中创建一个名为test-ci的项目,参考文档地址https://docs.gitlab.com/runner/register/index.html。

安装时,最好将Gitlab与Gitlab Runner安装在不同的服务器上面。

使用下面的命令启动Gitlab Runner的注册流程。

sudo gitlab-runner register

注册时需要使用在Gitlab中对应项目的url、token等相关信息,在Gitlab的项目管理页面可以查看对应的配置信息,如下图所示:

下面时对应的配置流程:

zgs@zgs:/opt/docker_gitlab/logs$ sudo gitlab-runner register
[sudo] password for zgs:
Runtime platform arch=amd64 os=linux pid=30123 revision=353dd94e version=13.2.0
Running in system-mode. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.254.129/
Please enter the gitlab-ci token for this runner:
ZXqsgq8rsx_o_Vq1sEVc
Please enter the gitlab-ci description for this runner:
[zgs]: this is for test ci process demo.^H^H^H^H^H^H
Please enter the gitlab-ci tags for this runner (comma separated):
test
Registering runner... succeeded runner=ZXqsgq8r
Please enter the executor: docker, docker-ssh, ssh, docker+machine, kubernetes, custom, parallels, shell, virtualbox, docker-ssh+machine:
shell # 此处需填写shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

此时,Gitlab Runner已经配置完毕,与Gitlab中的项目进行绑定。

刷新Gitlab中项目的设置-CI/CD页面,展开Runner对应的模块,可以查看对应的Runner已经与其绑定。

编辑当前的信息,选中【运行没有标签的作业】属性,然后保存更改,此属性表示此Runner可以运行没有任何标签的作业。

至此,Gitlab Runner已经安装完成,并且与Gitlab中的一个项目进行绑定。

5.3.3 整合项目入门测试

创建maven工程,编写html页面

使用Idea创建maven项目,搭建一个包含简单静态页面的Web站点。

将该站点打包为war文件,并在本地测试通过。

将maven工程推送到Gitlab中

在Gitlab中复制创建的test-ci项目的代码仓库路径。

在Idea中,选在VCS -> Import into Version Conteol -> Create Git Repository菜单,在弹出的窗口中选择当前项目对应的路径。

我们可以添加提交Git仓库时忽略的文件类型,这里使用idea IDE的.ignore插件实现。如果没有安装此插件可以按照下面的方法安装,选择File -> Settings -> Plugins菜单,搜索[.ignore]组件安装即可。

在项目根节点右键,选择New -> .ignore file -> .getignore file(Git)文件,在文件中输入需要忽略的目录如下:

# Created by .ignore support plugin (hsz.mobi)
.idea
target
*.iml

将目前项目中的文件添加至Git缓冲区中,在项目根节点右键 Git -> Add即可。

提交至本地Git仓库,在项目根节点右键 Git -> Commit Directory,在弹出的窗口中确认提交的文件及注释,点击提交。

将本地Git仓库内的代码推送至远程的Gitlab服务器,选择项目根目录右键 Git -> Repository -> Push,在弹出的窗口中配置远程服务器的仓库地址为http://192.168.254.129/root/test-ci.git,然后点击[Push]按钮,点击后如果是第一次推送则需要输入对应Git的用户名和密码,我们这里使用登录Gitlab的用户名密码即可。

在Gitlab的项目仓库页面刷新,即可查看我们推送的项目代码已经提交至服务器,如下图:

编写.gitlab-ci.yml文件

在项目中添加持续集成使用的yml文件,在项目根节点文件夹右键 New -> File,添加文件名为[.gitlab-ci.yml],一定要注意文件名以[.]开始。

在[.gitlab-ci.yml]文件中添加下面代码:

stages:
- test test:
stage: test
script:
- echo First test CI

将该文件添加至本地Git缓冲区,并提交至远程Gitlab仓库。

此时在Gitlab项目的CI-CD -> [流水线] 功能下将会出现一个流水线执行情况,之后的每一次Git提交将会触发此自动执行命令,执行的脚本为我们之前编写的[.gitlab-ci.yml]文件中的代码,但是我们在执行时发现执行失败,如下图所示:

失败原因如下:

Running with gitlab-runner 13.2.0 (353dd94e)
on this is for test ci process demo. 0269f504
Preparing the "shell" executor
Using Shell executor...
Preparing environment
Running on zgs...
ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information

经过排查,发现安装Gitlab-Runner的服务器上面没有对应的Java运行环境,即JDK。

解决运行CI流水线作业时出现Job failed (system failure): prepare environment: exit status 1.错误

错误截图如下:

错误原因:

当Gitlan-Runner执行Job时,会使用Gitlab-Runner安装时自动创建的账号gitlan-runner执行,此账号下的.bash_logout文件中使用了clear命令,在该账号退出时将会清除命令,但是在Gitlab-Runner执行时不允许清除命令,因此造成了此错误。

解决过程:

使用下面命令查看Gitlab-Runner的执行日志。

journalctl -u gitlab-runner

下面是执行命令的最后一部分日志内容:

Jul 23 00:32:47 zgs gitlab-runner[867]: ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading>
Jul 23 00:32:47 zgs gitlab-runner[867]: ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading>
Jul 23 00:32:48 zgs gitlab-runner[867]: WARNING: Failed to process runner builds=0 error=prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/i>
Jul 23 00:32:48 zgs gitlab-runner[867]: WARNING: Failed to process runner builds=0 error=prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/i>

使用下面命令跳转至gitlab-runner用户的目录下,修改.bash_logout文件中内容。

cd /home/gitlab-runner/

查看.bash_logout文件中的内容如下:

# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

可以看到上面文件中使用了clear_console命令,将文件中代码注释保存即可,修改后文件代码如下:

# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

#if [ "$SHLVL" = 1 ]; then
# [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
#fi

使用下面命令使该配置文件生效。

sudo vi .bash_logout

重新执行失败的任务即可执行成功,如下图:

5.3.4 编写.gitlab-ci.yml文件,实现持续集成

编写.gitlab-ci.yml测试命令使用

使用Gitlab Runner进行自动化编译时,实在Gitlab Runner服务器对应gitlab-runner用户下的builds目录下对应的文件夹内执行的命令,下面为从用户根目录至与Gitlab关联项目执行命令的全部目录:

zgs@zgs:/home/gitlab-runner$ ls
builds
zgs@zgs:/home/gitlab-runner$ cd builds/
zgs@zgs:/home/gitlab-runner/builds$ ls
0269f504
zgs@zgs:/home/gitlab-runner/builds$ cd 0269f504/
zgs@zgs:/home/gitlab-runner/builds/0269f504$ ls
0
zgs@zgs:/home/gitlab-runner/builds/0269f504$ cd 0/
zgs@zgs:/home/gitlab-runner/builds/0269f504/0$ ls
root
zgs@zgs:/home/gitlab-runner/builds/0269f504/0$ cd root/
zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root$ ls
test-ci test-ci.tmp
zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root$ cd test-ci
zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root/test-ci$ ls
pom.xml web

在该目录下,我们可以使用 mvn -v 查看对应maven的版本号相关内容,如下所示:

zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root/test-ci$ mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 1.8.0_252, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-42-generic", arch: "amd64", family: "unix"

但是我们执行命令时实在Gitlab服务器中执行的,因此需要复制maven命令的全路径进行执行,安装maven时的路径如下:

/usr/share/maven/bin

修改.gitlab-ci.yml文件,修改后内容如下:

stages:
- test test:
script:
- echo first test ci
- /usr/share/maven/bin/mvn package

修改项目目录的pom.xml文件,添加web.xml项目文件路径,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.zgs</groupId>
<artifactId>testci</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webXml>src/main/web/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
</plugins>
</build> </project>

项目代码结构如下所示:

将此改动推送至Gitlab仓库,查看CI的流水线执行情况如下:

编写关于dockerfile以及docker-compose.yml文件的具体内容

我们可以在下面路径查找到打包后的文件,即war文件。

/home/gitlab-runner/builds/0269f504/0/root/test-ci/target

在项目根目录下创建docker文件夹,在该文件夹内创建Dockerfile文件,项目结构如下图所示:

修改.gitlab-ci.yml文件中内容,添加将编译后文件复制到docker目录下代码,修改后文件内容如下:

stages:
- test test:
script:
- echo first test ci
- /usr/share/maven/bin/mvn package
- cp target/testci-1.0-SNAPSHOT.war docker/testci.war

编写Dockerfile文件内容如下,这里从DAO站点下拉取tomcat的docker镜像,并将该目录下的testci.war文件复制到docker镜像内的tomcat文件夹内。

FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps

在项目根目录下创建docker-compose.yml文件,用于管理Docker镜像和容器,代码如下:

version: '3.1'
services:
testci:
build: docker #编译的镜像目录
restart: always
container_name: testci
ports:
- 8080:8080

再次修改.gitlab-ci.yml文件,添加docker-compose相关命令,用于使用docker-compose命令管理容器,修改后代码如下:

stages:
- test test:
script:
- echo first test ci
- /usr/share/maven/bin/mvn package
- cp target/testci-1.0-SNAPSHOT.war docker/testci.war
- docker-compose down
- docker-compose up -d --build

提交至代码仓库,在Gitlab中查看流水线作业已经执行成功。

可以使用docker ps命令在宿主机上查看testci对应的容器,Gitlab Runner使用的是对应宿主机的docker。

我们使用http://192.168.254.129:8080/testci/连接访问我们的站点发现不能正常访问,其中192.168.254.129是Gitlab Runner的宿主机服务器,自动集成之后将会在该服务器创建一个testci的Docker容器运行我们的站点。

使用 docker exec -it 容器ID bash命令进入到tomcat容器的/usr/local/tomcat/webapps/testci目录,发现该目录可以正常访问但是只有META-INF、WEB-INF两个文件夹,并没有index.html文件,因此我们无法正常访问。

这是由于在执行.gitlab-co.yml文件中有一个mvn package命令执行打包操作时出现了问题,并没有将我们的项目文件完全装载进war包中,我们可以修改项目的pom.xml配置文件,将我们项目的页面文件包含进war中,修改后pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.zgs</groupId>
<artifactId>testci</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webXml>src/main/web/WEB-INF/web.xml</webXml>
<warSourceDirectory>src/main/web</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build> </project>

重新提交至Gitlab代码仓库,执行CI流程,我们再次进入部署后的tomcat容器中的/usr/local/tomcat/webapps/testci目录,发现index.html文件已经包含在对应的文件夹中,如下所示:

zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root/test-ci/target/testci-1.0-SNAPSHOT$ docker exec -it 90 bash
root@90859d3021d8:/usr/local/tomcat# ls
LICENSE NOTICE RELEASE-NOTES RUNNING.txt bin conf include lib logs native-jni-lib temp webapps work
root@90859d3021d8:/usr/local/tomcat# cd webapps/
root@90859d3021d8:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager testci testci.war
root@90859d3021d8:/usr/local/tomcat/webapps# cd testci
root@90859d3021d8:/usr/local/tomcat/webapps/testci# ls
META-INF WEB-INF index.html

使用http://192.168.254.129:8080/testci/域名可以正常访问站点,截图如下:

删除名称为none的image

使用docker images 命令查看宿主机的所有镜像发现有很多名称为none的镜像,是因为我们在执行docker-compose命令时,会将旧的镜像置为none,然后生成新的镜像。

zgs@zgs:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test-ci_testci latest ec0a969b7e6c 4 minutes ago 334MB
<none> <none> 4f1d7e31d372 19 minutes ago 334MB
<none> <none> 9a70c4a0343d 28 minutes ago 334MB
<none> <none> 8854aa023fb9 About an hour ago 334MB
<none> <none> ed797bef8a6b About an hour ago 334MB
<none> <none> dfd27b782909 2 hours ago 334MB
twang2218/gitlab-ce-zh 11.1.4 1935cc9f8798 24 months ago 1.61GB
daocloud.io/library/tomcat 8.5.15-jre8 b8dfe9ade316 3 years ago 334MB

在我们之后越来越多的提交就会进行多次构建,也就会产生多个名称为none的镜像,这样将会产生硬盘空间的极大浪费,我们可以使用下面的命令将这些名称为none的镜像删除,命令如下:

docker rmi $(docker images -qf dangling=true)

执行结果如下:

zgs@zgs:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test-ci_testci latest ec0a969b7e6c 9 minutes ago 334MB
twang2218/gitlab-ce-zh 11.1.4 1935cc9f8798 24 months ago 1.61GB
daocloud.io/library/tomcat 8.5.15-jre8 b8dfe9ade316 3 years ago 334MB

我们可以将该命令写入.gitlab-ci.yml文件中,每次将会把之前名称为none的镜像删除,完善后的.gitlab-ci.yml文件如下:

stages:
- test test:
script:
- echo first test ci
- /usr/share/maven/bin/mvn package
- cp target/testci-1.0-SNAPSHOT.war docker/testci.war
- docker-compose down
- docker-compose up -d --build
- docker rmi $(docker images -qf dangling=true)

CI集成测试

修改index.html中的代码,提交至代码仓库,然后刷新页面发现可以自动更新,相关截图如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test-CI</title>
</head>
<body>
hello,this is a demo for test CI process.
<br/>
你好,张冠胜!
</body>
</html>


5.4 CD介绍

CD(Continuous Deploy),包含持续交付、持续部署,可以使用Jenkins实现。

持续交付:将代码交付给专业的测试团队进行测试。

持续部署:将测试通过的代码,发布到生产环境。

5.5 实现持续交付和持续部署

5.5.1 安装Jenkins

官网:https://www.jenkins.io/

使用Docker方式安装Jenkins:https://www.jenkins.io/zh/blog/2018/12/10/the-official-Docker-image/

可以使用Docker-Compose安装Jenkins软件,对应的yml文件如下:

version: '3.1'
services:
jenkins:
image: jenkins/jenkins
restart: always
container_name: jenkins
ports:
- 8888:8080 # Web管理使用
- 50000:50000 # Jenkins内部通讯使用端口
volumes:
- ./data:/var/jenkins_home

在/opt目录下创建docker_jenkins目录,并将上面的yml文件放在该目录下。

zgs@zgs:/opt/docker_jenkins$ pwd
/opt/docker_jenkins
zgs@zgs:/opt/docker_jenkins$ ls
docker-compose.yml
zgs@zgs:/opt/docker_jenkins$ cat docker-compose.yml
version: '3.1'
services:
jenkins:
image: jenkins/jenkins
restart: always
container_name: jenkins
ports:
- 8888:8080 # Web管理使用
- 50000:50000 # Jenkins内部通讯使用端口
volumes:
- ./data:/var/jenkins_home

执行下面命令使用docker-compose获取Jenkins镜像。

docker-compose up -d

执行完毕后,可以使用docker ps命令查看当前运行的容器,Jenkins容器已经正常运行。

zgs@zgs:/opt/docker_jenkins$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e1d33e74317 jenkins/jenkins "/sbin/tini -- /usr/…" 51 seconds ago Restarting (1) 15 seconds ago jenkins
027f38b36a87 test-ci_testci "catalina.sh run" 16 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp testci
f174354636b5 twang2218/gitlab-ce-zh:11.1.4 "/assets/wrapper" 3 days ago Up 3 hours (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp gitlab

但是我们使用docker-compose的日志查看命令查看Jenkins的启动情况时,发现存在权限问题,具体日志如下:

zgs@zgs:/opt/docker_jenkins$ docker-compose logs -f
Attaching to jenkins
jenkins | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
jenkins | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
jenkins | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
jenkins | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
jenkins | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

这是因为/opt/docker_jenkins/data目录Jenkins是没有操作权限的,那么我们要给Jenkins赋予对应的操作权限,对应代码如下:

zgs@zgs:/opt/docker_jenkins$ pwd
/opt/docker_jenkins
zgs@zgs:/opt/docker_jenkins$ ls
data docker-compose.yml
zgs@zgs:/opt/docker_jenkins$ sudo chmod 777 data/
[sudo] password for zgs:
zgs@zgs:/opt/docker_jenkins$ ll
total 16
drwxr-xr-x 3 root root 4096 Jul 25 02:00 ./
drwxr-xr-x 5 root root 4096 Jul 25 01:51 ../
drwxrwxrwx 2 root root 4096 Jul 25 02:00 data/
-rw-r--r-- 1 root root 267 Jul 25 01:53 docker-compose.yml
zgs@zgs:/opt/docker_jenkins$ docker-compose restart
Restarting jenkins ... done

查看对应的日志,如果出现下面的内容则说明启动成功:

jenkins    | *************************************************************
jenkins | *************************************************************
jenkins | *************************************************************
jenkins |
jenkins | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins | Please use the following password to proceed to installation:
jenkins |
jenkins | 891836a4b38447219f937e599dd415b9
jenkins |
jenkins | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
jenkins |
jenkins | *************************************************************
jenkins | *************************************************************
jenkins | *************************************************************
jenkins |
jenkins | 2020-07-25 12:22:53.442+0000 [id=25] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
jenkins | 2020-07-25 12:22:53.486+0000 [id=19] INFO hudson.WebAppMain$3#run: Jenkins is fully up and running
jenkins | 2020-07-25 12:22:54.241+0000 [id=39] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
jenkins | 2020-07-25 12:22:54.246+0000 [id=39] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
jenkins | 2020-07-25 12:22:54.282+0000 [id=39] INFO hudson.model.AsyncPeriodicWork#lambda$doRun$0: Finished Download metadata. 51,356 ms

访问下面地址可以访问Jenkins站点:

http://192.168.254.129:8888/login?from=%2F

按照页面提示,将下面的位置的文件中获取初始密码填入页面中。

/var/jenkins_home/secrets/initialAdminPassword

上面的目录为docker容器内的路径,这里我们映射到了宿主机的data文件夹中,具体路径如下:

/opt/docker_jenkins/data/secrets/initialAdminPassword

其实,在刚在查看Jenkins启动日志时已经将对应的密钥显示在了日志中。

输入完密码后,需要等待一段时间,Jenkins进行初始化启动。

点击【选择插件来安装】,除默认选择的插件外需选择自定义的插件安装,选择安装的插件如下列表:

Git Parameter
Publish Over SSH

然后点击安装按钮。



然后系统执行安装操作,需要等待一段时间,快则1-2个小时,慢则1-2天,安装期间可以使用docker-compose logs -f查看安装日志,前提为进入到Jenkins对应的docker compose文件夹内执行。

插件安装完成后,创建第一个管理员用户。


配置实例,可以使用默认的URL地址。



点击【重启】按钮,等待一段时间后,Jenkins已完成并且配置完成。

使用我们刚才设置的管理员账号、密码登录。



看到上面的界面则证明Jenkins已安装成功。

5.5.2 配置目标服务器

程序代码 -> Gitlab -> Jenkins -> 目标部署服务器

Jenkins连接目标部署服务器

在这里我们配置将生成的目标文件部署至对应服务器中,配置步骤如下。

在Jenkins页面中选在 系统管理 -> 系统配置,如下图所示:


在【系统配置】功能页面向下查找到【Publish over SSH】部分,如下图所示:


在【SSH Servers】点击【新增】按钮,添加Gitlab服务器的SSH登录信息,点击【高级】按钮可以配置更多的登录信息,我们这里配置的是密码和端口号,配置完成后可以点击【Test Configuration】按钮对配置的登录信息进行测试。


测试配置时出现了一个错误信息,是因为配置的目标路径在服务器上面不存在。

使用下面命令在目标服务器上面创建对应目录后,再次进行测试,可以测试成功。

zgs@zgs:/opt/docker_gitlab$ cd /usr/local/
zgs@zgs:/usr/local$ ls
bin etc games include lib man sbin share src
zgs@zgs:/usr/local$ sudo mkdir jenkins
[sudo] password for zgs:
zgs@zgs:/usr/local$ ls
bin etc games include jenkins lib man sbin share src

点击【保存】按钮即完成了目标服务器的配置。

5.5.3 配置Jenkins免密码登录Gitlab

原理是将Jenkins容器内部的SSH密码配置到Gitlab服务器的SSH中,这样就可以实现免登录功能。

首先,通过下面命令进入到Jenkins容器内部。

zgs@zgs:/usr/local$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e1d33e74317 jenkins/jenkins "/sbin/tini -- /usr/…" 8 days ago Up 41 minutes 0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp jenkins
027f38b36a87 test-ci_testci "catalina.sh run" 8 days ago Up 41 minutes 0.0.0.0:8080->8080/tcp testci
f174354636b5 twang2218/gitlab-ce-zh:11.1.4 "/assets/wrapper" 11 days ago Up 41 minutes (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp gitlab
zgs@zgs:/usr/local$ docker exec -it 8e1d bash

登录Jenkins容器内部后,在任意目录下执行命令即可生成对应的SSH密码,执行命令后如果使用默认配置需要连续按3次回车,命令如下:

zgs@zgs:/usr/local$ docker exec -it 8e1d bash
jenkins@8e1d33e74317:/$ ssh-keygen -t rsa -C "502558513@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:L5H35D4FF5gUI4ZLybfbjJbIxIn2kNwNp3QKanKYUhI 502558513@qq.com
The key's randomart image is:
+---[RSA 2048]----+
|E. . oo.++ |
|. . . B.+.o.. |
| o o o O @ . . |
|. + + * O.o . . |
| . + . =S..*.o |
| ++=+o . |
| ... o. |
| . .. |
| .. |
+----[SHA256]-----+

通过上面命令可以发现,生成的SSH密钥文件路径为:/var/jenkins_home/.ssh/id_rsa.pub.我们在配置Jenkins容器时,已经将该目录在我们的宿主机上面进行了映射,可以在宿主机上查看此文件。

由于.ssh目录为隐藏目录,需要使用ls -a命令才能查看此目录。

zgs@zgs:/opt/docker_jenkins/data$ pwd
/opt/docker_jenkins/data
zgs@zgs:/opt/docker_jenkins/data$ ls -a
. jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml
.. jenkins.security.ResourceDomainConfiguration.xml
.bash_history jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
.cache jenkins.telemetry.Correlator.xml
com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml jobs
config.xml .lastStarted
copy_reference_file.log logs
github-plugin-configuration.xml net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
.groovy nodeMonitors.xml
hudson.model.UpdateCenter.xml nodes
hudson.plugins.build_timeout.operations.BuildStepOperation.xml org.jenkinsci.plugins.github_branch_source.GitHubConfiguration.xml
hudson.plugins.emailext.ExtendedEmailPublisher.xml org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
hudson.plugins.git.GitSCM.xml org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
hudson.plugins.git.GitTool.xml org.jenkins.plugins.lockableresources.LockableResourcesManager.xml
hudson.plugins.timestamper.TimestamperConfig.xml .owner
hudson.tasks.Mailer.xml plugins
hudson.tasks.Shell.xml queue.xml.bak
hudson.triggers.SCMTrigger.xml scriptApproval.xml
identity.key.enc secret.key
.java secret.key.not-so-secret
jenkins.fingerprints.GlobalFingerprintConfiguration.xml secrets
jenkins.install.InstallUtil.installingPlugins .ssh
jenkins.install.InstallUtil.lastExecVersion updates
jenkins.install.UpgradeWizard.state userContent
jenkins.model.ArtifactManagerConfiguration.xml users
jenkins.model.GlobalBuildDiscarderConfiguration.xml war
jenkins.model.JenkinsLocationConfiguration.xml workflow-libs

跳转至.ssh目录下即可查看生成的SSH公钥信息,具体命令如下:

zgs@zgs:/opt/docker_jenkins/data$ cd .ssh/
zgs@zgs:/opt/docker_jenkins/data/.ssh$ ls
id_rsa id_rsa.pub
zgs@zgs:/opt/docker_jenkins/data/.ssh$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2xXksxDQua8Btw5/JmybYJe/Yt2CdF86cv2sSqnH3IUiOIfa2mQuCNkTr6zlc29ZCiw4NQqx/6UfXsSneh01m+oaGwN09tLhbxjtTxApWpga62kqZvddmRU+aVIHG9byC4ysWO2cPK07uYNZFTzbBy/krG1HIwACG0uUoCKMATDnp4H8v71BVsj5AcULTz8yP9cLRkgkjPn1TamNzX10Xn9mac8kHiBBSLfmK1T/pdW1njksCsw+ICwkACcq95YjQt/6zJTX1jf61c4amBj9qPshc2+pF5rRjp2M76c3seCRuIxGMEAzNdvxvaNkm0SngMwg7tcnftb+2aBKnTZ49 502558513@qq.com

把上面的公钥文件中的内容在Gitlab中进行配置,在Gitlab页面右上角的下拉菜单中点击【设置】。




7.5.4 配置JDK和Maven

复制本地的JDK和Maven的压缩包到data目录下。

zgs@zgs:~/data/software$ ls
apache-maven-3.6.3-bin.tar.gz docker-compose jdk-8u261-linux-x64.tar.gz
zgs@zgs:~/data/software$ sudo cp apache-maven-3.6.3-bin.tar.gz /opt/docker_jenkins/data/
zgs@zgs:~/data/software$ sudo cp jdk-8u261-linux-x64.tar.gz /opt/docker_jenkins/data/
zgs@zgs:~/data/software$ cd /opt/docker_jenkins/data/
zgs@zgs:/opt/docker_jenkins/data$ ls
apache-maven-3.6.3-bin.tar.gz jenkins.security.ResourceDomainConfiguration.xml
com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
config.xml jenkins.telemetry.Correlator.xml
copy_reference_file.log jobs
github-plugin-configuration.xml logs
hudson.model.UpdateCenter.xml net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
hudson.plugins.build_timeout.operations.BuildStepOperation.xml nodeMonitors.xml
hudson.plugins.emailext.ExtendedEmailPublisher.xml nodes
hudson.plugins.git.GitSCM.xml org.jenkinsci.plugins.github_branch_source.GitHubConfiguration.xml
hudson.plugins.git.GitTool.xml org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
hudson.plugins.timestamper.TimestamperConfig.xml org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
hudson.tasks.Mailer.xml org.jenkins.plugins.lockableresources.LockableResourcesManager.xml
hudson.tasks.Shell.xml plugins
hudson.triggers.SCMTrigger.xml queue.xml.bak
identity.key.enc scriptApproval.xml
jdk-8u261-linux-x64.tar.gz secret.key
jenkins.fingerprints.GlobalFingerprintConfiguration.xml secret.key.not-so-secret
jenkins.install.InstallUtil.installingPlugins secrets
jenkins.install.InstallUtil.lastExecVersion updates
jenkins.install.UpgradeWizard.state userContent
jenkins.model.ArtifactManagerConfiguration.xml users
jenkins.model.GlobalBuildDiscarderConfiguration.xml war
jenkins.model.JenkinsLocationConfiguration.xml workflow-libs
jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml

手动解压,使用下面命令将JDK和Maven解压至当前目录。

tar -zxvf jdk-8u261-linux-x64.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz

在Jenkins配置页面配置JDK和Maven。





点击【保存】按钮即可。

5.5.5 手动拉取Gitlab项目

使用SSH无密码连接时,第一次连接需要手动拉取依次代码,用于确定连接正常。

使用下面命令进入Jenkins的Docker容器内。

zgs@zgs:/opt/docker_jenkins/data$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e1d33e74317 jenkins/jenkins "/sbin/tini -- /usr/…" 8 days ago Up 11 hours 0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp jenkins
027f38b36a87 test-ci_testci "catalina.sh run" 9 days ago Up 11 hours 0.0.0.0:8080->8080/tcp testci
f174354636b5 twang2218/gitlab-ce-zh:11.1.4 "/assets/wrapper" 12 days ago Up 11 hours (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp gitlab
zgs@zgs:/opt/docker_jenkins/data$ docker exec -it 8e1 bash
jenkins@8e1d33e74317:/$

登录Gitlab站点的项目主页,复制项目对应的SSH项目代码,然后在Jenkins对应的Docker容器内执行Git clone命令将对应的项目代码从Gitlab中拉取到Jenkins服务器内。


zgs@zgs:/opt/docker_jenkins/data$ docker exec -it 8e1 bash
jenkins@8e1d33e74317:/$ git clone git@192.168.254.129:root/test-ci.git
fatal: could not create work tree dir 'test-ci': Permission denied

可以看到执行git clone命令时出现了错误,在当前路径下没有权限创建test-ci项目的目录,我们可以按照下面的命令解决此问题。

jenkins@8e1d33e74317:/$ cd /var/jenkins_home/
jenkins@8e1d33e74317:~$ git clone git@192.168.254.129:root/test-ci.git
Cloning into 'test-ci'...
The authenticity of host '192.168.254.129 (192.168.254.129)' can't be established.
ECDSA key fingerprint is SHA256:WufO0MKIlFCuvHo/8eZ/3yM0h/bLnMhQH8NCgF1Y0jE.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.254.129' (ECDSA) to the list of known hosts.
remote: Counting objects: 76, done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 76 (delta 29), reused 42 (delta 15)
Receiving objects: 100% (76/76), 6.65 KiB | 0 bytes/s, done.
Resolving deltas: 100% (29/29), done.

拉取完代码后,可以将对应目录删除,具体命令如下:

jenkins@8e1d33e74317:~$ ls
apache-maven-3.6.3 jenkins.mvn.GlobalMavenConfig.xml
apache-maven-3.6.3-bin.tar.gz jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml
com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml jenkins.security.ResourceDomainConfiguration.xml
config.xml jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
copy_reference_file.log jenkins.telemetry.Correlator.xml
github-plugin-configuration.xml jobs
hudson.model.UpdateCenter.xml logs
hudson.plugins.build_timeout.operations.BuildStepOperation.xml net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
hudson.plugins.emailext.ExtendedEmailPublisher.xml nodeMonitors.xml
hudson.plugins.git.GitSCM.xml nodes
hudson.plugins.git.GitTool.xml org.jenkins.plugins.lockableresources.LockableResourcesManager.xml
hudson.plugins.gradle.Gradle.xml org.jenkinsci.plugins.gitclient.JGitApacheTool.xml
hudson.plugins.timestamper.TimestamperConfig.xml org.jenkinsci.plugins.gitclient.JGitTool.xml
hudson.tasks.Ant.xml org.jenkinsci.plugins.github_branch_source.GitHubConfiguration.xml
hudson.tasks.Mailer.xml org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
hudson.tasks.Maven.xml org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
hudson.tasks.Shell.xml plugins
hudson.triggers.SCMTrigger.xml queue.xml.bak
identity.key.enc scriptApproval.xml
jdk-8u261-linux-x64.tar.gz secret.key
jdk1.8.0_261 secret.key.not-so-secret
jenkins.fingerprints.GlobalFingerprintConfiguration.xml secrets
jenkins.install.InstallUtil.installingPlugins test-ci
jenkins.install.InstallUtil.lastExecVersion updates
jenkins.install.UpgradeWizard.state userContent
jenkins.model.ArtifactManagerConfiguration.xml users
jenkins.model.GlobalBuildDiscarderConfiguration.xml war
jenkins.model.JenkinsLocationConfiguration.xml workflow-libs
jenkins@8e1d33e74317:~$ rm -rf test-ci/

Docker、CICD持续集成部署、Gitlab使用、Jenkins介绍的相关教程结束。

《Docker、CICD持续集成部署、Gitlab使用、Jenkins介绍.doc》

下载本文的Word格式文档,以方便收藏与打印。