CI:持续集成,我们通常使用CI来做一些自动化工作,比如程序的打包,单元测试,部署等,这种构建方式避免了打包环境差异引起的错误,提高了工作效率。Gitlab-CI是Gitlab官方提供的持续集成服务,我们可以在仓库的根目录下新建.gitlab-ci.yml文件,自己定义持续集成流程模板,并且在Gitlab中配置runner,在之后的每次提交合并中将会触发构建,并且可以通过Gitlab的hook, 在代码提交的各个环节自动地完成一系列的构建工作,总之对于一些非复杂性的集成需求,都是可以满足的。
gitlab-runner注册参考官网:
https://docs.gitlab.com/runner/install/docker.html
demo下载地址:https://gitee.com/starsky20/docker-gitlab-cicd.git
镜像地址:
https://hub.docker.com/r/gitlab/gitlab-runner/tags?page=1&ordering=last_updated
sudo docker pull gitlab/gitlab-runner:latest
rm -rf /home/data/gitlab-runner/
mkdir -p /home/data/gitlab-runner/{config,data,logs}
chmod 777 -R /home/data/gitlab-runner/
gitlab-runner注册参考官网:https://docs.gitlab.com/runner/install/docker.html
sudo docker run -dit --name gitlab-runner --restart=always
-v /home/data/gitlab-runner/config:/etc/gitlab-runner
-v /var/run/docker.sock:/var/run/docker.sock
gitlab/gitlab-runner:latest
启动结果:
Runner注册步骤:
首先,在docker容器里执行注册命令:
docker exec -it gitlab-runner /bin/bash
gitlab-runner register
这里的地址是gitlab配置里的,这里以gitlab中的项目spring-demo为例:
点击该项目进入后,选择设置-》CICD->runner
展开runner后可以看到注册runner的地址,和token,这个就是我们需要用的。
执行注册过程:
详细步骤如下:
[root@localhost gitlab-runner]# #进入gitlab-runner内部 [root@localhost gitlab-runner]# docker exec -it gitlab-runner /bin/bash #注册gitlab-runner root@928f47744364:/# gitlab-runner register Runtime platform arch=amd64 os=linux pid=23 revision=c1edb478 version=14.0.1 Running in system-mode. #输入gitlab项目注册地址 Enter the GitLab instance URL (for example, https://gitlab.com/): http://192.168.0.87:8880/ #输入gitlab项目注册token Enter the registration token: 9g3JBgtr7rUtWoVW_GMD #输入描述信息,可以随便输入 Enter a description for the runner: [928f47744364]: my-runner #输入标签名称,可以随便输入 Enter tags for the runner (comma-separated): my-tag,another-tag Registering runner... succeeded runner=9g3JBgtr #选择执行gitlab-runner的执行程序,因为我用docker实现自动部署,所以输入docker: Enter an executor: custom, virtualbox, docker-ssh+machine, kubernetes, docker, docker-ssh, parallels, shell, ssh, docker+machine: docker #选择docker作为执行程序,需要定义一个默认镜像的名称。这个镜像的名称要在后期的.gitlab-ci.yml(自动化部署配置文件)里用到,根据项目代码语言不同,指定不同的镜像。这里项目是java语言的,就使用官方maven:3-jdk-8镜像 Enter the default Docker image (for example, ruby:2.6): maven:3-jdk-8 Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! root@928f47744364:/#
以上表示spring-demo项目gitlab-runner注册成功,此时到我们项目首页右侧设置—》CI/CD —》Runner就可以看到我们刚注册的my-runner了。如图:
以上是通过手动一步一步设置,这种操作相对比较麻烦一些,下面我们根据参数指定注册过程需要的数据直接配置:
docker run -dit --name gitlab-runner --restart always
-v /home/data/gitlab-runner/config:/etc/gitlab-runner
-v /var/run/docker.sock:/var/run/docker.sock
gitlab/gitlab-runner register
–non-interactive
–url “http://192.168.0.87:8880/”
–registration-token “9g3JBgtr7rUtWoVW_GMD”
–description “my-runner”
–tag-list “another-tag, my-tag”
–executor “docker”
–docker-image maven:3-jdk-8
–run-untagged=“true”
–locked=“false”
–access-level=“not_protected”
修改Runner配置文件
修改runner配置文件,因为docker image每次构建都是在独立的container里, maven的 .m2文件并不会被多次构建公用,这里我们可以通过修改gitlab-runner的配置,将maven .m2目录加到volumes中,并增加镜像拉取规则(默认是从远程拉取镜像,这里修改为优先获取本地镜像,不存在时才去远程拉取镜像)。
vim /home/data/gitlab-runner/config/config.toml ,找到volumes配置,修改为如下,分别是挂载了宿主机的docker和配置Maven的缓存,提高效率。[root@localhost config]# [root@localhost config]# vim /home/data/gitlab-runner/config/config.toml concurrent = 1 check_interval = 0 [session_server] session_timeout = 1800 [[runners]] name = "my-runner" url = "http://192.168.0.87:8880/" token = "j7jVRMZfo5srqW1TWEgL" executor = "docker" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.docker] #挂载宿主机的docker和配置Maven的缓存,提高效率 volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/home/.m2/:/.m2/"] tls_verify = false image = "maven:3-jdk-8" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false shm_size = 0
配置支持https
官网:https://docs.gitlab.com/runner/configuration/tls-self-signed.html
参考文档:https://blog.csdn.net/londa/article/details/941448451、首先通过cp命令将crt文件从gitlab宿主机上拷贝到gitlab-runner容器宿主机 /home/data/gitlab-runner/config/ 目录下。
cp -r ssl /home/data/gitlab-runner/config/
查看gitlab-runner从gitlab拷贝证书:
证书在gitlab-runner容器的/etc/gitlab-runner目录下,对应的宿主机目录/home/data/gitlab-runner/config/。
配置docker支持访问gitlab
vim /etc/docker/daemon.json
{
“insecure-registries”:[
“https://192.168.0.87:8443”,#这是gitlab的访问地址
“120.79.51.144:8079”,
“192.168.0.87:8075”,
“192.168.0.87:8076”,
“192.168.0.86:8075”
]
}
{
“registry-mirrors”: [
“http://192.168.0.86:8075”,
“https://192.168.0.86:8075”,
“https://registry.docker-cn.com”,
“https://docker.mirrors.ustc.edu.cn”,
“https://hub-mirror.c.163.com”,
“https://hub.docker.com”,
“https://hub.daocloud.io”
]
}
配置完成后重启docker服务。
systemctl daemon-reload && systemctl restart docker登录验证gitlab:
docker login https://192.168.0.87:8443
注意:这里需要保证gitlab地址(gitlab.rb配置)、项目访问地址(gitlab.yml配置)、nginx地址(nginx.conf)这些全部配置正确,并且访问地址一致才行。具体参考以上gitlab配置https。测试证书是否有效
通过openssl进行执行命令:
openssl s_client -cert demoCA/sslclientcert.pem -key demoCA/sslclientkey.pem -CAfile demoCA/cacert.pem -tls1_2 -host 127.0.0.1 -port 8443
sudo openssl s_server -cert demoCA/sslservercert.pem -key demoCA/sslserverkey.pem -CAfile demoCA/cacert.pem -tls1_2 -Verify 1 -accept 8443将crt转为pem:
openssl x509 -in mycert.crt -out mycert.pem -outform PE
将pem转为crt:
openssl x509 -outform der -in full_chain.pem -out your-cert.crt注册gitlab-runner,指定证书
查看项目url及token.
执行如下命令:
docker run -it --rm -v /home/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
–non-interactive
–url “https://192.168.0.87:8443/”
–registration-token “yfDotLzyHDVBwz71E2CF”
–description “package-runner”
–tag-list “package”
–executor “docker”
–docker-privileged
–docker-image docker:latest
–run-untagged=“true”
–locked=“false”
–access-level=“not_protected”
–tls-ca-file=/etc/gitlab-runner/ssl/server.crt;
以上注册方式可能会注册失败,由于gitlab不同版本区别较大,并且备份不是全量,部分数据不全导致注册异常,可以采用将gitlab挂载目录全部备份,拷贝到新的服务器,重启启动服务,然后还原备份数据即可。gitlab版本升级
参考文档:
https://docs.gitlab.com/ee/policy/maintenance.html#upgrade-recommendations
https://docs.gitlab.com/ee/update/index.html首先备份一下数据,以防万一
1、进入dokcer 容器gitlab备份数据:
sudo docker exec -i -t gitlab /bin/bash
GitLab 12.2 或更高版本:
sudo gitlab-backup create
GitLab 12.1 及更早版本:
gitlab-rake gitlab:backup:create
备份完成,备份文件在 data/backups 文件夹下。在宿主机挂载目录查看备份数据。
2、停止全部服务: gitlab-ctl stop
3、退出容器: exit
4、停止dokcer容器gitlab: sudo docker stop gitlab
5、再删除容器: sudo docker rm gitlab
6、运行新版本gitlab容器(注意升级版本的选择)
sudo docker run -dit --name gitlab
–hostname 192.168.0.87 -p 8443:443 -p 8880:80 -p 4222:22
-v /home/data/gitlab/conf:/etc/gitlab
-v /home/data/gitlab/logs:/var/log/gitlab
-v /home/data/gitlab/data:/var/opt/gitlab
-v /etc/localtime:/etc/localtime
–restart always --privileged=true
gitlab//gitlab-ce:14.0.5-ce.0:latest
备注:只用修改gitlab版本,挂载目录中的数据不要删除备份及恢复
参考官网:
https://docs.gitlab.com/ee/raketasks/backup_restore.html#when-the-secrets-file-is-lost
参考文档:https://www.cnblogs.com/breakering/p/9712040.htmlGitlab备份
gitlab备份比较简单,我们直接使用gitlab本身提供的命令进行备份即可,命令会备份gitlab仓库、数据库、用户、用户组、用户密钥、权限等信息1、通过gitlab-rake命令备份gitlab
gitlab提供的备份命令为gitlab-rake,备份命令使用如下:
GitLab 12.2 或更高版本:
sudo gitlab-backup createGitLab 12.1 及更早版本:
gitlab-rake gitlab:backup:create
如果您从源代码安装 GitLab,请使用以下命令:sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
如果从 Docker 容器中运行 GitLab,请根据您安装的 GitLab 版本从主机运行备份:
GitLab 12.2 或更高版本:
docker exec -t gitlab-backup createGitLab 12.1 及更早版本:
docker exec -t gitlab-rake gitlab:backup:create如果在 Kubernetes 集群上使用GitLab Helm 图表,则可以通过使用 在 GitLab 任务kubectl运行器backup-utilitypod 上运行脚本来运行备份任务。有关更多详细信息,请参阅 备份 GitLab 安装。
kubectl exec -it – backup-utility与 Kubernetes 的情况类似,如果您扩展了 GitLab 集群以使用多个应用程序服务器,您应该选择一个指定的节点(不会自动扩展)来运行备份 Rake 任务。由于备份 Rake 任务与主 Rails 应用程序紧密耦合,因此这通常是一个节点,您也在该节点上运行 Puma 或 Sidekiq。
示例输出:
Dumping database tables: - Dumping table events... [DONE] - Dumping table issues... [DONE] - Dumping table keys... [DONE] - Dumping table merge_requests... [DONE] - Dumping table milestones... [DONE] - Dumping table namespaces... [DONE] - Dumping table notes... [DONE] - Dumping table projects... [DONE] - Dumping table protected_branches... [DONE] - Dumping table schema_migrations... [DONE] - Dumping table services... [DONE] - Dumping table snippets... [DONE] - Dumping table taggings... [DONE] - Dumping table tags... [DONE] - Dumping table users... [DONE] - Dumping table users_projects... [DONE] - Dumping table web_hooks... [DONE] - Dumping table wikis... [DONE] Dumping repositories: - Dumping repository abcd... [DONE] Creating backup archive: $TIMESTAMP_gitlab_backup.tar [DONE] Deleting tmp directories...[DONE] Deleting old backups... [SKIPPING]
备份完成后,默认备份文件在/var/opt/gitlab/backups/目录下。如果是通过挂载宿主机目录,则在宿主机目录backups下。可以修改备份的位置及时间,使用如下命令:
vim /etc/gitlab/gitlab.rb ### Backup Settings ###! Docs: https://docs.gitlab.com/omnibus/settings/backups.html # gitlab_rails['manage_backup_path'] = true gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800
修改上图backup_path的值改变备份数据存储位置,修改backup_keep_time来改变存储数据时间。gitlab备份文件随时间变化越来越多,服务器的磁盘空间也不够大。此时我们就要删除部分旧的备份文件,gitlab也提供了删除旧的备份文件功能。通过backup_keep_time进行配置即可即可,之后使用gitlab-ctl reconfigure使得配置生效。ps:备份文件的名称1628639264_2021_08_11_14.0.5是此次备份的编号。该编号我们会在后续恢复gitlab数据使用到。
2、定时备份gitlab
如果要使gitlab进行自动备份,我们可以通过crontab命令来实现自动备份。强烈建议使用系统crontab命令,而不是用户crontab。
以实现每天凌晨4点进行一次自动备份为例,系统的crontab配置如下:
vim /etc/crontab
0 4 * * * root /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
然后重启crontab服务,如下:
systemctl restart crondGitLab 12.1 及更早版本的用户应改用该命令gitlab-rake gitlab:backup:create。
GitLab 12.1 以上的版本使用:
/opt/gitlab/bin/gitlab-backup create
Gitlab仓库恢复
恢复步骤:
Omnibus GitLab 安装的恢复
此过程假设:
您已经安装了与创建备份完全相同的 GitLab Omnibus版本和类型 (CE/EE)。
你sudo gitlab-ctl reconfigure至少跑过一次。
GitLab 正在运行。如果没有,请使用sudo gitlab-ctl start.
首先确保您的备份 tar 文件位于gitlab.rb配置中描述的备份目录中 gitlab_rails[‘backup_path’]。默认值为 /var/opt/gitlab/backups. 它需要归git用户所有。sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /var/opt/gitlab/backups/ sudo chown git.git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
停止连接到数据库的进程。让 GitLab 的其余部分保持运行:
sudo gitlab-ctl stop puma sudo gitlab-ctl stop sidekiq # Verify sudo gitlab-ctl status
接下来,恢复备份,指定要恢复的备份的时间戳:
# This command will overwrite the contents of your GitLab database! sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
GitLab 12.1 及更早版本的用户应改用该命令gitlab-rake gitlab:backup:restore。
gitlab-rake gitlab:backup:restore没有在您的注册表目录上设置正确的文件系统权限。这是一个已知问题。在 GitLab 12.2 或更高版本中,您可以使用gitlab-backup restore来避免此问题。
如果您的备份 tar 文件和已安装的 GitLab 版本之间存在 GitLab 版本不匹配,则恢复命令将中止并显示错误消息。安装正确的 GitLab 版本,然后重试。
接下来,/etc/gitlab/gitlab-secrets.json如有必要,恢复, 如前所述。重新配置、重启并检查 GitLab:
sudo gitlab-ctl reconfigure sudo gitlab-ctl restart sudo gitlab-rake gitlab:check SANITIZE=true
在 GitLab 13.1 及更高版本中,检查数据库值可以被解密, 尤其是/etc/gitlab/gitlab-secrets.json在恢复时,或者如果不同的服务器是恢复的目标。
sudo gitlab-rake gitlab:doctor:secrets还原 Docker 映像和 GitLab Helm 图表安装
对于在 Kubernetes 集群上使用 Docker 映像或 GitLab Helm 图表的 GitLab 安装,还原任务期望还原目录为空。但是,对于 Docker 和 Kubernetes 卷挂载,可能会在卷根目录创建一些系统级目录,例如lost+found 在 Linux 操作系统中找到的目录。这些目录通常归 拥有root,这可能会导致访问权限错误,因为恢复 Rake 任务以git用户身份运行。要恢复 GitLab 安装,用户必须确认恢复目标目录为空。对于这两种安装类型,备份 tarball 必须位于备份位置(默认位置为/var/opt/gitlab/backups)。
对于 Docker 安装,可以从主机运行恢复任务:
在这里插入代码片 # Stop the processes that are connected to the database docker exec -it <name of container> gitlab-ctl stop puma docker exec -it <name of container> gitlab-ctl stop sidekiq # Verify that the processes are all down before continuing docker exec -it <name of container> gitlab-ctl status # Run the restore docker exec -it <name of container> gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce # Restart the GitLab container docker restart <name of container> # Check GitLab docker exec -it <name of container> gitlab-rake gitlab:check SANITIZE=true
GitLab 12.1 及更早版本的用户应改用该命令gitlab-rake gitlab:backup:create。
gitlab-rake gitlab:backup:restore没有在您的注册表目录上设置正确的文件系统权限。这是一个已知问题。在 GitLab 12.2 或更高版本中,您可以使用gitlab-backup restore来避免此问题。
GitLab Helm chart 使用不同的过程,记录在 恢复 GitLab Helm 图表安装中以下是验证gitlab备份的有效性,我们可以把该备份文件复制到已经安装好的新服务器的/home/data/gitlab/data/backups/目录下。然后进行数据恢复,最后访问并查看其数据完整性即可。
通过gitlab备份文件可以恢复gitlab所有的信息,包括仓库、数据库、用户、用户组、用户密钥、权限等信息。注意:新服务器上的gitlab的版本号必须与创建备份时的gitlab版本号相同,并且安装目录也要相同,否则恢复后由于安装位置不同导致异常。
gitlab数据恢复比较简单,具体步骤如下:
在新服务器上启动一个gitlab服务,版本号需要和备份gitlab一致,安装目录一致。容器安装参考以上《gitlab安装》
1、将备份数据拷贝到新的gitlab服务宿主机backup目录中。
scp /home/data/gitlab/data/backups/1628639264_2021_08_11_14.0.5_gitlab_backup.tar root@192.168.0.86:/home/data/gitlab/data/backups/
服务器授权该目录:
chmod 777 -R /home/data/gitlab
cd /home/data/gitlab/data/backups/2、停止相关数据连接服务
在新服务器上停止gitlab相关数据连接服务,命令如下:
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
3、恢复gitlab仓库
现在我们要从1628639264_2021_08_11_14.0.5这个备份编号中,恢复数据,命令如下:
docker exec -it gitlab_backup /bin/bash
gitlab-rake gitlab:backup:restore RAILS_ENV=production BACKUP=1628639264_2021_08_11_14.0.5
gitlab-rake gitlab:check SANITIZE=true
如果出现多个done的信息,说明整个gitlab数据就已经正常恢复完毕。
3、启动gitlab服务
恢复完毕以后,我们现在来启动gitlab服务,使用以下命令:
gitlab-ctl restart
启动完成,重新登录gitlab查看
创建SpringBoot项目测试CICD
以下介绍springboot项目,通过定义dockerfile,gitlab-ci.yml相关打包流程,进行自动打包部署,所有访问以http访问,如果是正式环境,需要以https进行访问配置(htps暂不处理)。
配置docker
由于nexus3私服安装在86机器上,gitlab安装在87机器上,所以在gitlab上提交项目时,上传镜像,运行项目操作会使用到nexus3私服,所以这里需要在87服务器上配置通过docker访问86服务器nexus3服务地址,gitlab和docker安装和配置这里不在说明,参考以上gitlab安装。配置内容如下:
vim /etc/docker/daemon.json "insecure-registries":[ "192.168.0.86:8076", "192.168.0.86:8075" "registry-mirrors": [ "https://47.119.120.197:8075", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://hub.docker.com", "https://hub.daocloud.io"
配置完成后重启docker服务
systemctl daemon-reload
systemctl restart docker重启完成后可以通过docker登录测试访问nexus服务是否正常:
docker login -u admin -p admin123 http://192.168.0.86:8075
注意:这里需要在86机器上开放docker访问端口2375,否则,在其他机器无法访问86私服。Docker/nexus安装参考上一文章内容。
注册runner
注册runner,主要在gilab-ci.yml定义执行流程使用,以下定义了build、package、deploy三种方式:
docker run -it --rm -v /home/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ --non-interactive \ --url "http://192.168.0.87:8880/" \ --registration-token "sNPXWNcFsqBrLXEVFNxi" \ --description "package-runner" \ --tag-list "mvn-package" \ --executor "docker" \ --docker-privileged \ --docker-image docker:latest \ --run-untagged="true" \ --locked= "false" \ --access-level="not_protected"; docker run -it --rm -v /home/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ --non-interactive \ --url "http://192.168.0.87:8880/" \ --registration-token "sNPXWNcFsqBrLXEVFNxi" \ --description "build-runner" \ --tag-list "build" \ --executor "docker" \ --docker-privileged \ --docker-image docker:latest \ --run-untagged="true" \ --locked="false" \ --access-level="not_protected"; docker run -it --rm -v /home/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ --non-interactive \ --url "http://192.168.0.87:8880/" \ --registration-token "sNPXWNcFsqBrLXEVFNxi" \ --description "deploy-runner" \ --tag-list "deploy" \ --executor "docker" \ --docker-privileged \ --docker-image docker:latest \ --run-untagged="true" \ --locked="false" \ --access-level="not_protected";
修改config.toml挂载目录
修改/home/data/gitlab-runner/config/config.toml配置文件maven缓存文件目录,将宿主机目录改在到容器中,即修改volumes内容为:
volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/home/.m2/😕.m2/"]
将宿主机/home/.m2/目录改在到容器/.m2/目录。修改项目pom.xml,引入docker插件
1、引入docker-maven打包插件,配置打包相关信息
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>spring-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <!-- docker 打包镜像上传配置测试环境--> <!--<docker-ip>47.119.120.197</docker-ip> <docker-url>https://${docker-ip}:2375</docker-url> <registry-url>${docker-ip}:8075</registry-url>--> <!-- docker 打包镜像上传配置正式环境--> <!-- <docker-ip>120.79.51.144</docker-ip> <docker-url>https://${docker-ip}:2375</docker-url> <registry-url>${docker-ip}:8075</registry-url>--> <!-- docker 打包镜像上传配置本地测试环境--> <docker-ip>192.168.0.86</docker-ip> <docker-url>http://${docker-ip}:2375</docker-url> <registry-url>${docker-ip}:8075</registry-url> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.4.0</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}-${project.version}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--docker 打包插件--> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <!-- <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions>--> <configuration> <!--打包docker镜像的docker服务器--> <dockerHost>${docker-url}</dockerHost> <!--镜像名,这里用工程名 --> <imageName>${registry-url}/${project.artifactId}:${project.version}</imageName> <!--nexus3 hosted 仓库地址--> <registryUrl>${registry-url}</registryUrl> <!-- ca认证正书--> <!--< dockerCertPath>/home/data/gitlab/data/cert</dockerCertPath>--> <!--<dockerCertPath>D:\cert\docker</dockerCertPath>--> <!--TAG,这里用工程版本号--> <imageTags> <!-- 指定镜像标签,可以排至多个标签 --> <imageTag>${project.version}</imageTag> </imageTags> <!--是否强制覆盖已有镜像--> <forceTags>true</forceTags> <!--方式一:1、指定Dockerfile文件所在目录,通过文件执行打包上传nexus私服--> <dockerDirectory>src/main/docker</dockerDirectory> <!-- 方式二:通过配置命令打包 --> <!--<baseImage>java</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>--> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <!-- 运行命令 mvn clean package docker:build 打包并生成docker镜像 --> <!-- serverId, 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 执行命令: mvn clean compile package docker:build -DpushImage <!--<serverId>docker-proxy</serverId>--> </configuration> </plugin> </plugins> <!-- 资源目录 --> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <!-- 资源根目录排除各环境的配置,防止在生成目录中多余其它目录 --> <excludes> <exclude>bootstrap-dev.yml</exclude> <exclude>bootstrap-prod.yml</exclude> <exclude>bootstrap-test.yml</exclude> </excludes> <filtering>true</filtering> </resource> <!--激活指定文件--> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>bootstrap.yml</include> </includes> </resource> <!--打包java目录--> <resource> <directory>src/main/java</directory> <includes> <include>**/*.*</include> </includes> <excludes> <exclude>**/*.java</exclude> </excludes> <filtering>true</filtering> </resource> <!--打包java目录--> <resource> <directory>src/main/docker</directory> <includes> <include>**/*</include> </includes> <filtering>true</filtering> </resource> </resources> </build> <!--分环境打包,命令行指定激活方式优先spring.profiles.active=dev--> <profiles> <profile> <id>dev</id> <properties> <!--默认激活dev环境--> <profileActive>dev</profileActive> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <profileActive>test</profileActive> </properties> </profile> <profile> <id>prod</id> <properties> <profileActive>prod</profileActive> </properties> </profile> </profiles> </project>
这里我们使用是通过maven插件进行打包,上传镜像。
注意:在docker插件中有一个标签
docker-proxy
该标签使用是为了将打包的镜像上传到该标签指定的私服仓库上,方便其他用户使用。
如果使用了该标签,则需要在maven的settings.xml中配置如下内容:
<server> <!-- 私服仓库id,必须和私服中仓库id一致--> <id>docker-proxy</id> <!-- 登录私服的用户名,密码--> <username>admin</username> <password>admin123</password> </server>
该标签配置后,通过执行命令:mvn clean compile package docker:build -DpushImage
进行编译,打包,上传镜像到私服。
在项目根目录创建Dockerfile文件
在项目根目录创建Dockerfile文件,可以通过本地创建Dockerfile,然后上次到gitlab上,或者通过gitlab上直接创建也可以,这里我使用gitlab上直接创建,登录gitlab,进入到spring-demo项目中,选择repository->file->new file
填写文件名为Dockerfile,文件内容,然后点击保存即可
Dockerfile内容如下:#指定运行环境 FROM java:8 MAINTAINER wangsh #声明一个挂载点,容器内此路径会对应宿主机的某个文件夹 VOLUME /tmp #复制上下文目录下的target/demo-1.0.0.jar 到容器里 #COPY target/daison-server-1.0.2-SNAPSHOT.jar ADD target/*.jar spring-demo.jar #bash方式执行,使demo-0.0.1jar可访问 #RUN新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像。 RUN sh -c 'touch /spring-demo.jar' #声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务 EXPOSE 9080 #设置环境变量 ENV JAVA_OPTS="-Xmx2048m -Xms2048m" ENV SERVER_PORT="--server.port=9085" #指定容器启动程序 #方式一:该种字符串拼接方式不支持变量替换,如果需要参数,可以指定写死 #ENTRYPOINT ["sh","-c","java -server -Xmx512m -Xms512m","-Djava.security.egd=file:/dev/./urandom","-jar","/spring-demo.jar"] #方式二:该种方法支持变量替换,通过docker run -e "JAVA_OPTS=-Xmx2048m -Xms2048m" -p 9090:9090 [容器id] ENTRYPOINT java -server ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /spring-demo.jar ${SERVER_PORT}
创建完成,本地更新gitlab项目,如下图:
![]()
项目根目录创建.gitlab-ci.yml文件
打开gitlab,进入spring-demo项目中,在项目根目录下创建gitlab-ci.yml相关配置,点击repository->File->选择下拉框-》选择 new file
创建一个.gitlab-ci.yml 文件,添加内容后,点击提交保存。
gitlab-ci.yml内容如下:#之前执行 # before_script: # - sudo su # - source /etc/profile #1.因为Runner执行器设置为docker, 所以这里需要指定docker的版本 image: docker:latest #2.必须配置的一些环境变量 variables: MAVEN_OPTS: "-Dmaven.repo.local=/.m2" #私服仓库地址 REGISTRY_URL: http://192.168.0.86:8075 REGISTRY_USER: admin REGISTRY_PWD: admin123 DOCKER_DRIVER: overlay2 # docker host,本地可不写 DOCKER_HOST: tcp://192.168.0.86:2375 # 镜像名称 IMAGE_NAME: spring-demo # 镜像名称 TAG: 192.168.0.86:8075/spring-demo:0.0.1-SNAPSHOT #3.配置缓存,配置后,maven下载的依赖可以被缓存起来,下次不需要重复去下载了 cache: paths: - .m2/repository #4.配置需要用到的额外的服务。docker:dind,这个貌似是用于在 docker 中运行 docker 的一种东西,在项目的构建中需要 #services: # - docker:dind #5.stages,这是 Gitlab CI 中的概念,Stages 表示构建阶段,就是一些按序执行的流程,具体执行是依赖于 Jobs 的 stages: # - build - package - deploy #定义job1 #build: # stage: build # image: maven:3-jdk-8 # tags: # - build # script: # - echo "=============== docker build image ===============" # - mvn clean compile # only: # - master #定义job2 package: stage: package # 打包用到了maven, 所有需要拉取maven镜像, 这是我自己构建的阿里云maven私服的maven镜像 image: maven:3-jdk-8 tags: - mvn-package script: - echo "=============== mvn package ===============" - mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true #编译打包镜像,该种是通过docker的maven插件打包生成镜像 - mvn clean package docker:build # 只作用在master分支 only: - master # 这里可以将maven 打包好的文件传递给下一个 stage ,然后下一步的docker 就可以根据 这个 jar 包 和Dockerfile 构建镜像 artifacts: # 指定下过期时间和路径 expire_in: 1 days paths: - target/*.jar #定义job3 deploy: stage: deploy tags: - deploy script: - echo "=============== deploy ===============" # 登录私服 - docker login --username $REGISTRY_USER --password $REGISTRY_PWD $REGISTRY_URL # - docker login --username admin --password admin123 https://192.168.0.86:8075 # - docker build -t $TAG . #上传镜像 - docker push $TAG # 启动服务,判断服务如果存在,则删除,然后启动服务重启启动 - if [ $(docker ps -aq --filter name=$IMAGE_NAME) ]; then docker rm -f $IMAGE_NAME ;fi - docker run -dit --name spring-demo -p 9080:9080 --restart=always $TAG only: - master
以上定义的gitlab-ci.yml流程是按照docker插件打包方式,dockerfile可以根据pom.xml中docker插件标签dockerDirectory指定dockerfile位置,然后通过maven命令 mvn clean package docker:build打包镜像,然后执行上传镜像到nexus私服,在启动运行容器。
方法二:
该中配置方式通过命令执行编译,打包,上传镜像,启动容器,该中方式不需要docker插件,需要将Dockerfile文件放在项目根目录下,gitlab-ci.yml具体配置如下:
#之前执行 # before_script: # - sudo su # - source /etc/profile #1.因为Runner执行器设置为docker, 所以这里需要指定docker的版本 image: docker:latest #2.必须配置的一些环境变量,后续流程会使用到该变量 variables: MAVEN_OPTS: "-Dmaven.repo.local=/.m2" SERVER_IP: 192.168.0.86 # SERVER_IP: 47.119.120.197 SERVER_PORT: 8075 #私服仓库地址 REGISTRY_URL: https://$SERVER_IP:$SERVER_PORT REGISTRY_USER: admin REGISTRY_PWD: admin123 DOCKER_DRIVER: overlay2 # docker host,本地部署可不写 DOCKER_HOST: tcp://$SERVER_IP:2375 # 镜像名及版本号 IMAGE_NAME: spring-demo IMAGE_VERSION: 0.0.1-SNAPSHOT # 镜像名称 TAG: $SERVER_IP:$SERVER_PORT/$IMAGE_NAME:$IMAGE_VERSION #3.配置缓存,配置后,maven下载的依赖可以被缓存起来,下次不需要重复去下载了 cache: paths: - .m2/ #4.配置需要用到的额外的服务。docker:dind,这个貌似是用于在 docker 中运行 docker 的一种东西,在项目的构建中需要 #services: # - docker:dind #5.stages,这是 Gitlab CI 中的概念,Stages 表示构建阶段,就是一些按序执行的流程,具体执行是依赖于 Jobs 的 stages: # - build - package - deploy #定义job1 #build: # stage: build # image: maven:3-jdk-8 # tags: # - build # script: # - echo "=============== docker build image ===============" # - mvn clean compile # only: # - master #定义job2 package: stage: package # 打包用到了maven, 所有需要拉取maven镜像 image: maven:3-jdk-8 tags: - mvn-package script: - echo "=============== mvn package ===============" - mvn $MAVEN_OPTS clean compile package -Dmaven.test.skip=true #编译打包镜像 # - mvn clean compile package docker:build # 只作用在master分支 only: - master # 这里可以将maven 打包好的文件传递给下一个 stage ,然后下一步的docker 就可以根据 这个 jar 包 和Dockerfile 构建镜像 artifacts: # 指定下过期时间和路径 expire_in: 1 days paths: - target/*.jar #定义job3 deploy: stage: deploy tags: - deploy script: - echo "=============== deploy ===============" #打包生成镜像 - docker build -t $TAG . # 登录私服 # - docker login --username admin --password admin123 https://192.168.0.86:8075 - docker login --username $REGISTRY_USER --password $REGISTRY_PWD $REGISTRY_URL #上传镜像 - docker push $TAG # 启动服务,判断服务如果存在,则删除,然后启动服务重启启动 - if [ $(docker ps -aq --filter name=$IMAGE_NAME) ]; then docker rm -f $IMAGE_NAME ;fi #清空重复镜像 - docker image prune -f #清空未使用挂载缓存目录 - docker volume prune -f #启动容器 - docker run -dit --name $IMAGE_NAME -p 9080:9080 --restart=always $TAG only: - master
提交代码到gitlab
提交代码到gitlab后,会自动执行.
登录gitlab,进入当前提交项目目录,点击CI/CD->pipelines
点击正在运行的pipeline查看任务
可以看到这里有两个任务,一个是打包,一个是部署。
点击任务,查看package执行具体日志:
详细信息如下:在这里插入代码片 Running with gitlab-runner 14.0.1 (c1edb478) on package-runner 7tH14pxU Preparing the "docker" executor 00:17 Using Docker executor with image maven:3-jdk-8 ... Pulling docker image maven:3-jdk-8 ... Using docker image sha256:cd13aef18fc44265fad303d5279ba630e30e855422d261f20b905dfff90dd60a for maven:3-jdk-8 with digest maven@sha256:3223f3761a39b432d37d051a2537c52ac04f6b0235ffcd2f5a6caab96cfa541a ... Preparing environment 00:00 Running on runner-7th14pxu-project-2-concurrent-0 via 647ad32b7320... Getting source from Git repository 00:01 Fetching changes with git depth set to 50... Reinitialized existing Git repository in /builds/root/spring-demo/.git/ Checking out 12937c30 as master... Removing target/ Skipping Git submodules setup Restoring cache 00:01 Checking cache for default-1... No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. Successfully extracted cache Executing "step_script" stage of the job script 00:31 Using docker image sha256:cd13aef18fc44265fad303d5279ba630e30e855422d261f20b905dfff90dd60a for maven:3-jdk-8 with digest maven@sha256:3223f3761a39b432d37d051a2537c52ac04f6b0235ffcd2f5a6caab96cfa541a ... $ echo "=============== mvn package ===============" =============== mvn package =============== $ mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true [INFO] Scanning for projects... [INFO] [INFO] ----------------------< com.example:spring-demo >----------------------- [INFO] Building demo 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ spring-demo --- [INFO] [INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ spring-demo --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 0 resource [INFO] Copying 0 resource [INFO] Copying 1 resource [INFO] [INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ spring-demo --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /builds/root/spring-demo/target/classes [INFO] [INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ spring-demo --- [INFO] Not copying test resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ spring-demo --- [INFO] Not compiling test sources [INFO] [INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ spring-demo --- [INFO] Tests are skipped. [INFO] [INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ spring-demo --- [INFO] Building jar: /builds/root/spring-demo/target/spring-demo-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:2.0.1.RELEASE:repackage (default) @ spring-demo --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5.146 s [INFO] Finished at: 2021-07-22T02:57:40Z [INFO] ------------------------------------------------------------------------ $ mvn clean package docker:build [INFO] Scanning for projects... [INFO] [INFO] ----------------------< com.example:spring-demo >----------------------- [INFO] Building demo 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ spring-demo --- [INFO] Deleting /builds/root/spring-demo/target [INFO] [INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ spring-demo --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 0 resource [INFO] Copying 0 resource [INFO] Copying 1 resource [INFO] [INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ spring-demo --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /builds/root/spring-demo/target/classes [INFO] [INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ spring-demo --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /builds/root/spring-demo/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ spring-demo --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /builds/root/spring-demo/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ spring-demo --- [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running com.example.demo.DemoApplicationTests 02:57:46.963 [main] DEBUG org.springframework.test.context.junit4.SpringJUnit4ClassRunner - SpringJUnit4ClassRunner constructor called with [class com.example.demo.DemoApplicationTests] 02:57:46.979 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 02:57:47.001 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)] 02:57:47.064 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [com.example.demo.DemoApplicationTests] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper] 02:57:47.088 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [com.example.demo.DemoApplicationTests], using SpringBootContextLoader 02:57:47.096 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [com.example.demo.DemoApplicationTests]: class path resource [com/example/demo/DemoApplicationTests-context.xml] does not exist 02:57:47.096 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [com.example.demo.DemoApplicationTests]: class path resource [com/example/demo/DemoApplicationTestsContext.groovy] does not exist 02:57:47.096 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [com.example.demo.DemoApplicationTests]: no resource found for suffixes {-context.xml, Context.groovy}. 02:57:47.097 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [com.example.demo.DemoApplicationTests]: DemoApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 02:57:47.157 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [com.example.demo.DemoApplicationTests] 02:57:47.163 [main] DEBUG org.springframework.core.env.StandardEnvironment - Adding PropertySource 'systemProperties' with lowest search precedence 02:57:47.163 [main] DEBUG org.springframework.core.env.StandardEnvironment - Adding PropertySource 'systemEnvironment' with lowest search precedence 02:57:47.164 [main] DEBUG org.springframework.core.env.StandardEnvironment - Initialized StandardEnvironment with PropertySources [MapPropertySource@1160003871 {name='systemProperties', properties={java.runtime.name=OpenJDK Runtime Environment, sun.boot.library.path=/usr/local/openjdk-8/jre/lib/amd64, java.vm.version=25.302-b08, java.vm.vendor=Oracle Corporation, java.vendor.url=http://java.oracle.com/, path.separator=:, java.vm.name=OpenJDK 64-Bit Server VM, file.encoding.pkg=sun.io, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=unknown, java.vm.specification.name=Java Virtual Machine Specification, user.dir=/builds/root/spring-demo, java.runtime.version=1.8.0_302-b08, basedir=/builds/root/spring-demo, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.endorsed.dirs=/usr/local/openjdk-8/jre/lib/endorsed, os.arch=amd64, surefire.real.class.path=/builds/root/spring-demo/target/surefire/surefirebooter5714235678873556567.jar, java.io.tmpdir=/tmp, line.separator= , java.vm.specification.vendor=Oracle Corporation, os.name=Linux, sun.jnu.encoding=UTF-8, java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib, surefire.test.class.path=/builds/root/spring-demo/target/test-classes:/builds/root/spring-demo/target/classes:/.m2/org/springframework/boot/spring-boot-starter-web/2.0.1.RELEASE/spring-boot-starter-web-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar:/.m2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/.m2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/.m2/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar:/.m2/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar:/.m2/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar:/.m2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/.m2/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar:/.m2/org/springframework/boot/spring-boot-starter-json/2.0.1.RELEASE/spring-boot-starter-json-2.0.1.RELEASE.jar:/.m2/com/fasterxml/jackson/core/jackson-databind/2.9.5/jackson-databind-2.9.5.jar:/.m2/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar:/.m2/com/fasterxml/jackson/core/jackson-core/2.9.5/jackson-core-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.5/jackson-datatype-jdk8-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.5/jackson-datatype-jsr310-2.9.5.jar:/.m2/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.5/jackson-module-parameter-names-2.9.5.jar:/.m2/org/springframework/boot/spring-boot-starter-tomcat/2.0.1.RELEASE/spring-boot-starter-tomcat-2.0.1.RELEASE.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-el/8.5.29/tomcat-embed-el-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.29/tomcat-embed-websocket-8.5.29.jar:/.m2/org/hibernate/validator/hibernate-validator/6.0.9.Final/hibernate-validator-6.0.9.Final.jar:/.m2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar:/.m2/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/.m2/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/.m2/org/springframework/spring-web/5.0.5.RELEASE/spring-web-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-webmvc/5.0.5.RELEASE/spring-webmvc-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-test/2.0.1.RELEASE/spring-boot-starter-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test/2.0.1.RELEASE/spring-boot-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test-autoconfigure/2.0.1.RELEASE/spring-boot-test-autoconfigure-2.0.1.RELEASE.jar:/.m2/junit/junit/4.12/junit-4.12.jar:/.m2/org/assertj/assertj-core/3.9.1/assertj-core-3.9.1.jar:/.m2/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.jar:/.m2/net/bytebuddy/byte-buddy/1.7.11/byte-buddy-1.7.11.jar:/.m2/net/bytebuddy/byte-buddy-agent/1.7.11/byte-buddy-agent-1.7.11.jar:/.m2/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/.m2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/.m2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar:/.m2/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar:/.m2/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar:/.m2/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-test/5.0.5.RELEASE/spring-test-5.0.5.RELEASE.jar:/.m2/org/xmlunit/xmlunit-core/2.5.1/xmlunit-core-2.5.1.jar:/.m2/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar:/.m2/net/minidev/json-smart/2.3/json-smart-2.3.jar:/.m2/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar:/.m2/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/.m2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:, java.specification.name= Java Platform API Specification, java.class.version=52.0, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, os.version=3.10.0-1160.el7.x86_64, user.home=/root, user.timezone=Etc/UTC, java.awt.printerjob=sun.print.PSPrinterJob, file.encoding=UTF-8, java.specification.version=1.8, java.class.path=/builds/root/spring-demo/target/test-classes:/builds/root/spring-demo/target/classes:/.m2/org/springframework/boot/spring-boot-starter-web/2.0.1.RELEASE/spring-boot-starter-web-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar:/.m2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/.m2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/.m2/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar:/.m2/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar:/.m2/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar:/.m2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/.m2/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar:/.m2/org/springframework/boot/spring-boot-starter-json/2.0.1.RELEASE/spring-boot-starter-json-2.0.1.RELEASE.jar:/.m2/com/fasterxml/jackson/core/jackson-databind/2.9.5/jackson-databind-2.9.5.jar:/.m2/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar:/.m2/com/fasterxml/jackson/core/jackson-core/2.9.5/jackson-core-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.5/jackson-datatype-jdk8-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.5/jackson-datatype-jsr310-2.9.5.jar:/.m2/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.5/jackson-module-parameter-names-2.9.5.jar:/.m2/org/springframework/boot/spring-boot-starter-tomcat/2.0.1.RELEASE/spring-boot-starter-tomcat-2.0.1.RELEASE.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-el/8.5.29/tomcat-embed-el-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.29/tomcat-embed-websocket-8.5.29.jar:/.m2/org/hibernate/validator/hibernate-validator/6.0.9.Final/hibernate-validator-6.0.9.Final.jar:/.m2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar:/.m2/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/.m2/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/.m2/org/springframework/spring-web/5.0.5.RELEASE/spring-web-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-webmvc/5.0.5.RELEASE/spring-webmvc-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-test/2.0.1.RELEASE/spring-boot-starter-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test/2.0.1.RELEASE/spring-boot-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test-autoconfigure/2.0.1.RELEASE/spring-boot-test-autoconfigure-2.0.1.RELEASE.jar:/.m2/junit/junit/4.12/junit-4.12.jar:/.m2/org/assertj/assertj-core/3.9.1/assertj-core-3.9.1.jar:/.m2/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.jar:/.m2/net/bytebuddy/byte-buddy/1.7.11/byte-buddy-1.7.11.jar:/.m2/net/bytebuddy/byte-buddy-agent/1.7.11/byte-buddy-agent-1.7.11.jar:/.m2/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/.m2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/.m2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar:/.m2/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar:/.m2/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar:/.m2/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-test/5.0.5.RELEASE/spring-test-5.0.5.RELEASE.jar:/.m2/org/xmlunit/xmlunit-core/2.5.1/xmlunit-core-2.5.1.jar:/.m2/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar:/.m2/net/minidev/json-smart/2.3/json-smart-2.3.jar:/.m2/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar:/.m2/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/.m2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:, user.name=root, java.vm.specification.version=1.8, sun.java.command=/builds/root/spring-demo/target/surefire/surefirebooter5714235678873556567.jar /builds/root/spring-demo/target/surefire 2021-07-22T02-57-45_605-jvmRun1 surefire3374515824924664810tmp surefire_06513386400555942857tmp, java.home=/usr/local/openjdk-8/jre, sun.arch.data.model=64, user.language=en, java.specification.vendor=Oracle Corporation, awt.toolkit=sun.awt.X11.XToolkit, java.vm.info=mixed mode, java.version=1.8.0_302, java.ext.dirs=/usr/local/openjdk-8/jre/lib/ext:/usr/java/packages/lib/ext, sun.boot.class.path=/usr/local/openjdk-8/jre/lib/resources.jar:/usr/local/openjdk-8/jre/lib/rt.jar:/usr/local/openjdk-8/jre/lib/sunrsasign.jar:/usr/local/openjdk-8/jre/lib/jsse.jar:/usr/local/openjdk-8/jre/lib/jce.jar:/usr/local/openjdk-8/jre/lib/charsets.jar:/usr/local/openjdk-8/jre/lib/jfr.jar:/usr/local/openjdk-8/jre/classes, java.vendor=Oracle Corporation, localRepository=/.m2, file.separator=/, java.vendor.url.bug=http://bugreport.sun.com/bugreport/, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, sun.cpu.isalist=}}, SystemEnvironmentPropertySource@1075738627 {name='systemEnvironment', properties={CI_COMMIT_MESSAGE=修改配置 , PATH=/usr/local/openjdk-8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, CI_SERVER_VERSION_MAJOR=14, CI_PROJECT_URL=http://192.168.0.87:8880/root/spring-demo, CI_COMMIT_REF_SLUG=master, GITLAB_FEATURES=, CI_PROJECT_PATH_SLUG=root-spring-demo, FF_USE_NEW_BASH_EVAL_STRATEGY=false, CI_SERVER_VERSION_MINOR=0, PWD=/builds/root/spring-demo, FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY=false, CI_SERVER=yes, SERVER_PORT=8075, CI_PROJECT_VISIBILITY=private, CI_BUILD_NAME=package, CI_PROJECT_TITLE=spring-demo, FF_USE_WINDOWS_LEGACY_PROCESS_STRATEGY=true, CI_PIPELINE_SOURCE=push, CI_RUNNER_ID=5, CI_REGISTRY_USER=gitlab-ci-token, CI_COMMIT_REF_NAME=master, CI_NODE_TOTAL=1, CI_SERVER_URL=http://192.168.0.87:8880, CI_COMMIT_TIMESTAMP=2021-07-22T10:56:57+08:00, SHLVL=1, CI_BUILD_REF_NAME=master, CI_JOB_STATUS=running, CI_PROJECT_REPOSITORY_LANGUAGES=java,dockerfile, CI_PAGES_URL=http://root.example.com/spring-demo, JAVA_HOME=/usr/local/openjdk-8, CI_JOB_STAGE=package, IMAGE_VERSION=0.0.1-SNAPSHOT, CI_PAGES_DOMAIN=example.com, CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX=192.168.0.87:8880/root/dependency_proxy/containers, CI_BUILD_STAGE=package, CI_CONCURRENT_ID=0, CI_RUNNER_REVISION=c1edb478, CI_PIPELINE_ID=68, CI_PROJECT_NAMESPACE=root, CI_JOB_JWT=[MASKED], CI_JOB_IMAGE=maven:3-jdk-8, JAVA_VERSION=8u302, CI_BUILD_TOKEN=[MASKED], FF_CMD_DISABLE_DELAYED_ERROR_LEVEL_EXPANSION=false, CI_RUNNER_EXECUTABLE_ARCH=linux/amd64, _=/usr/bin/mvn, CI_PROJECT_NAME=spring-demo, CI_BUILD_REF_SLUG=master, CI=true, FF_SKIP_NOOP_BUILD_STAGES=true, FF_NETWORK_PER_BUILD=false, CI_JOB_TOKEN=[MASKED], MAVEN_PROJECTBASEDIR=/builds/root/spring-demo, CI_PROJECT_DIR=/builds/root/spring-demo, CI_RUNNER_VERSION=14.0.1, TAG=192.168.0.86:8075/spring-demo:0.0.1-SNAPSHOT, CI_COMMIT_SHA=12937c30983a27ed9f5ff5839c6eb8544b6fc8b2, FF_GITLAB_REGISTRY_HELPER_IMAGE=true, CI_SERVER_REVISION=25fc1060aff, CI_JOB_STARTED_AT=2021-07-22T10:57:14+08:00, CI_CONCURRENT_PROJECT_ID=0, MAVEN_HOME=/usr/share/maven, CI_DEPENDENCY_PROXY_USER=gitlab-ci-token, CI_PIPELINE_URL=http://192.168.0.87:8880/root/spring-demo/-/pipelines/68, CI_SERVER_PORT=8880, CI_COMMIT_BEFORE_SHA=865cef8e59757322b9cb1050b2a8450644ffded4, DOCKER_DRIVER=overlay2, CI_SERVER_NAME=GitLab, CI_COMMIT_SHORT_SHA=12937c30, CI_JOB_URL=http://192.168.0.87:8880/root/spring-demo/-/jobs/153, FF_USE_POWERSHELL_PATH_RESOLVER=false, GITLAB_USER_NAME=Administrator, CI_BUILDS_DIR=/builds, IMAGE_NAME=spring-demo, CI_RUNNER_TAGS= mvn-package, CI_SERVER_VERSION_PATCH=5, OLDPWD=/builds/root/spring-demo, CI_SERVER_PROTOCOL=http, CI_COMMIT_BRANCH=master, FF_ENABLE_BASH_EXIT_CODE_CHECK=false, GITLAB_CI=true, REGISTRY_URL=http://192.168.0.86:8075, CI_JOB_ID=153, GITLAB_USER_ID=1, CI_PIPELINE_IID=68, CI_SERVER_VERSION=14.0.5, CI_COMMIT_TITLE=修改配置, REGISTRY_USER=admin, CI_DEPENDENCY_PROXY_SERVER=192.168.0.87:8880, DOCKER_HOST=tcp://192.168.0.86:2375, CI_API_V4_URL=http://192.168.0.87:8880/api/v4, GITLAB_USER_EMAIL=admin@example.com, CI_PROJECT_ROOT_NAMESPACE=root, CI_BUILD_REF=12937c30983a27ed9f5ff5839c6eb8544b6fc8b2, CI_PROJECT_ID=2, CI_RUNNER_DESCRIPTION=package-runner, LANG=C.UTF-8, CI_REGISTRY_PASSWORD=[MASKED], CI_PROJECT_PATH=root/spring-demo, CI_COMMIT_REF_PROTECTED=true, MAVEN_OPTS= -Dmaven.repo.local=/.m2, CI_DEFAULT_BRANCH=master, CI_DISPOSABLE_ENVIRONMENT=true, CI_RUNNER_SHORT_TOKEN=7tH14pxU, CI_COMMIT_AUTHOR=test <test@qq.com>, FF_SKIP_DOCKER_MACHINE_PROVISION_ON_CREATION_FAILURE=false, CI_CONFIG_PATH=.gitlab-ci.yml, CI_BUILD_BEFORE_SHA=865cef8e59757322b9cb1050b2a8450644ffded4, MAVEN_CMD_LINE_ARGS= clean package docker:build, CI_COMMIT_DESCRIPTION=, REGISTRY_PWD=admin123, CI_DEPENDENCY_PROXY_PASSWORD=[MASKED], CI_SERVER_HOST=192.168.0.87, CI_PIPELINE_CREATED_AT=2021-07-22T10:57:05+08:00, FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR=false, SERVER_IP=192.168.0.86, FF_USE_FASTZIP=false, FF_USE_DIRECT_DOWNLOAD=true, HOSTNAME=runner-7th14pxu-project-2-concurrent-0, CI_BUILD_ID=153, CI_JOB_NAME=package, GITLAB_USER_LOGIN=root, CI_REPOSITORY_URL=http://gitlab-ci-token:[MASKED]@192.168.0.87:8880/root/spring-demo.git, HOME=/root}}] 02:57:47.222 [main] DEBUG org.springframework.core.io.support.PathMatchingResourcePatternResolver - Resolved classpath location [com/example/demo/] to resources [URL [file:/builds/root/spring-demo/target/test-classes/com/example/demo/], URL [file:/builds/root/spring-demo/target/classes/com/example/demo/]] 02:57:47.222 [main] DEBUG org.springframework.core.io.support.PathMatchingResourcePatternResolver - Looking for matching resources in directory tree [/builds/root/spring-demo/target/test-classes/com/example/demo] 02:57:47.222 [main] DEBUG org.springframework.core.io.support.PathMatchingResourcePatternResolver - Searching directory [/builds/root/spring-demo/target/test-classes/com/example/demo] for files matching pattern [/builds/root/spring-demo/target/test-classes/com/example/demo/*.class] 02:57:47.246 [main] DEBUG org.springframework.core.io.support.PathMatchingResourcePatternResolver - Looking for matching resources in directory tree [/builds/root/spring-demo/target/classes/com/example/demo] 02:57:47.247 [main] DEBUG org.springframework.core.io.support.PathMatchingResourcePatternResolver - Searching directory [/builds/root/spring-demo/target/classes/com/example/demo] for files matching pattern [/builds/root/spring-demo/target/classes/com/example/demo/*.class] 02:57:47.247 [main] DEBUG org.springframework.core.io.support.PathMatchingResourcePatternResolver - Resolved location pattern [classpath*:com/example/demo/*.class] to resources [file [/builds/root/spring-demo/target/test-classes/com/example/demo/DemoApplicationTests.class], file [/builds/root/spring-demo/target/classes/com/example/demo/DemoApplication.class]] 02:57:47.370 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [/builds/root/spring-demo/target/classes/com/example/demo/DemoApplication.class] 02:57:47.372 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration com.example.demo.DemoApplication for test class com.example.demo.DemoApplicationTests 02:57:47.551 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [com.example.demo.DemoApplicationTests]: using defaults. 02:57:47.551 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] 02:57:47.584 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required dependencies available. Offending class: [org/springframework/transaction/TransactionDefinition] 02:57:47.589 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required dependencies available. Offending class: [org/springframework/transaction/interceptor/TransactionAttribute] 02:57:47.589 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@35e2d654, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@1bd4fdd, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@55183b20, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@4f83df68, org.springframework.test.context.support.DirtiesContextTestExecutionListener@6cf0e0ba, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@7d8995e, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@130d63be, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@42a48628, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@293a5bf6, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@6aeb35e6] 02:57:47.590 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.DemoApplicationTests] 02:57:47.591 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.DemoApplicationTests] 02:57:47.598 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.DemoApplicationTests] 02:57:47.598 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.DemoApplicationTests] 02:57:47.598 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.DemoApplicationTests] 02:57:47.598 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.DemoApplicationTests] 02:57:47.604 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@692f203f testClass = DemoApplicationTests, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@48f2bd5b testClass = DemoApplicationTests, locations = '{}', classes = '{class com.example.demo.DemoApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=0}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@436e852b, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@3e57cd70, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@7b69c6ba, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@1b26f7b2], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> false]], class annotated with @DirtiesContext [false] with mode [null]. 02:57:47.604 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.DemoApplicationTests] 02:57:47.604 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.DemoApplicationTests] 02:57:47.619 [main] DEBUG org.springframework.test.context.support.DependencyInjectionTestExecutionListener - Performing dependency injection for test context [[DefaultTestContext@692f203f testClass = DemoApplicationTests, testInstance = com.example.demo.DemoApplicationTests@515c6049, testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@48f2bd5b testClass = DemoApplicationTests, locations = '{}', classes = '{class com.example.demo.DemoApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=0}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@436e852b, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@3e57cd70, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@7b69c6ba, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@1b26f7b2], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> false]]]. 02:57:47.659 [main] DEBUG org.springframework.core.env.StandardEnvironment - Adding PropertySource 'systemProperties' with lowest search precedence 02:57:47.659 [main] DEBUG org.springframework.core.env.StandardEnvironment - Adding PropertySource 'systemEnvironment' with lowest search precedence 02:57:47.659 [main] DEBUG org.springframework.core.env.StandardEnvironment - Initialized StandardEnvironment with PropertySources [MapPropertySource@1658699134 {name='systemProperties', properties={java.runtime.name=OpenJDK Runtime Environment, sun.boot.library.path=/usr/local/openjdk-8/jre/lib/amd64, java.vm.version=25.302-b08, java.vm.vendor=Oracle Corporation, java.vendor.url=http://java.oracle.com/, path.separator=:, java.vm.name=OpenJDK 64-Bit Server VM, file.encoding.pkg=sun.io, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=unknown, java.vm.specification.name=Java Virtual Machine Specification, user.dir=/builds/root/spring-demo, java.runtime.version=1.8.0_302-b08, basedir=/builds/root/spring-demo, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.endorsed.dirs=/usr/local/openjdk-8/jre/lib/endorsed, os.arch=amd64, surefire.real.class.path=/builds/root/spring-demo/target/surefire/surefirebooter5714235678873556567.jar, java.io.tmpdir=/tmp, line.separator= , java.vm.specification.vendor=Oracle Corporation, os.name=Linux, sun.jnu.encoding=UTF-8, java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib, surefire.test.class.path=/builds/root/spring-demo/target/test-classes:/builds/root/spring-demo/target/classes:/.m2/org/springframework/boot/spring-boot-starter-web/2.0.1.RELEASE/spring-boot-starter-web-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar:/.m2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/.m2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/.m2/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar:/.m2/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar:/.m2/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar:/.m2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/.m2/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar:/.m2/org/springframework/boot/spring-boot-starter-json/2.0.1.RELEASE/spring-boot-starter-json-2.0.1.RELEASE.jar:/.m2/com/fasterxml/jackson/core/jackson-databind/2.9.5/jackson-databind-2.9.5.jar:/.m2/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar:/.m2/com/fasterxml/jackson/core/jackson-core/2.9.5/jackson-core-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.5/jackson-datatype-jdk8-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.5/jackson-datatype-jsr310-2.9.5.jar:/.m2/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.5/jackson-module-parameter-names-2.9.5.jar:/.m2/org/springframework/boot/spring-boot-starter-tomcat/2.0.1.RELEASE/spring-boot-starter-tomcat-2.0.1.RELEASE.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-el/8.5.29/tomcat-embed-el-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.29/tomcat-embed-websocket-8.5.29.jar:/.m2/org/hibernate/validator/hibernate-validator/6.0.9.Final/hibernate-validator-6.0.9.Final.jar:/.m2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar:/.m2/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/.m2/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/.m2/org/springframework/spring-web/5.0.5.RELEASE/spring-web-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-webmvc/5.0.5.RELEASE/spring-webmvc-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-test/2.0.1.RELEASE/spring-boot-starter-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test/2.0.1.RELEASE/spring-boot-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test-autoconfigure/2.0.1.RELEASE/spring-boot-test-autoconfigure-2.0.1.RELEASE.jar:/.m2/junit/junit/4.12/junit-4.12.jar:/.m2/org/assertj/assertj-core/3.9.1/assertj-core-3.9.1.jar:/.m2/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.jar:/.m2/net/bytebuddy/byte-buddy/1.7.11/byte-buddy-1.7.11.jar:/.m2/net/bytebuddy/byte-buddy-agent/1.7.11/byte-buddy-agent-1.7.11.jar:/.m2/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/.m2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/.m2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar:/.m2/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar:/.m2/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar:/.m2/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-test/5.0.5.RELEASE/spring-test-5.0.5.RELEASE.jar:/.m2/org/xmlunit/xmlunit-core/2.5.1/xmlunit-core-2.5.1.jar:/.m2/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar:/.m2/net/minidev/json-smart/2.3/json-smart-2.3.jar:/.m2/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar:/.m2/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/.m2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:, java.specification.name=Java Platform API Specification, java.class.version=52.0, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, os.version=3.10.0-1160.el7.x86_64, user.home=/root, user.timezone=Etc/UTC, java.awt.printerjob=sun.print.PSPrinterJob, file.encoding=UTF-8, java.specification.version=1.8, java.class.path=/builds/root/spring-demo/target/test-classes:/builds/root/spring-demo/target/classes:/.m2/org/springframework/boot/spring-boot-starter-web/2.0.1.RELEASE/spring-boot-starter-web-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar:/.m2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/.m2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/.m2/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar:/.m2/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar:/.m2/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar:/.m2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/.m2/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar:/.m2/org/springframework/boot/spring-boot-starter-json/2.0.1.RELEASE/spring-boot-starter-json-2.0.1.RELEASE.jar:/.m2/com/fasterxml/jackson/core/jackson-databind/2.9.5/jackson-databind-2.9.5.jar:/.m2/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar:/.m2/com/fasterxml/jackson/core/jackson-core/2.9.5/jackson-core-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.5/jackson-datatype-jdk8-2.9.5.jar:/.m2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.5/jackson-datatype-jsr310-2.9.5.jar:/.m2/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.5/jackson-module-parameter-names-2.9.5.jar:/.m2/org/springframework/boot/spring-boot-starter-tomcat/2.0.1.RELEASE/spring-boot-starter-tomcat-2.0.1.RELEASE.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-el/8.5.29/tomcat-embed-el-8.5.29.jar:/.m2/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.29/tomcat-embed-websocket-8.5.29.jar:/.m2/org/hibernate/validator/hibernate-validator/6.0.9.Final/hibernate-validator-6.0.9.Final.jar:/.m2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar:/.m2/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/.m2/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/.m2/org/springframework/spring-web/5.0.5.RELEASE/spring-web-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-webmvc/5.0.5.RELEASE/spring-webmvc-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-starter-test/2.0.1.RELEASE/spring-boot-starter-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test/2.0.1.RELEASE/spring-boot-test-2.0.1.RELEASE.jar:/.m2/org/springframework/boot/spring-boot-test-autoconfigure/2.0.1.RELEASE/spring-boot-test-autoconfigure-2.0.1.RELEASE.jar:/.m2/junit/junit/4.12/junit-4.12.jar:/.m2/org/assertj/assertj-core/3.9.1/assertj-core-3.9.1.jar:/.m2/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.jar:/.m2/net/bytebuddy/byte-buddy/1.7.11/byte-buddy-1.7.11.jar:/.m2/net/bytebuddy/byte-buddy-agent/1.7.11/byte-buddy-agent-1.7.11.jar:/.m2/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/.m2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/.m2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar:/.m2/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar:/.m2/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar:/.m2/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar:/.m2/org/springframework/spring-test/5.0.5.RELEASE/spring-test-5.0.5.RELEASE.jar:/.m2/org/xmlunit/xmlunit-core/2.5.1/xmlunit-core-2.5.1.jar:/.m2/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar:/.m2/net/minidev/json-smart/2.3/json-smart-2.3.jar:/.m2/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar:/.m2/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/.m2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:, user.name= root, java.vm.specification.version=1.8, sun.java.command=/builds/root/spring-demo/target/surefire/surefirebooter5714235678873556567.jar /builds/root/spring-demo/target/surefire 2021-07-22T02-57-45_605-jvmRun1 surefire3374515824924664810tmp surefire_06513386400555942857tmp, java.home=/usr/local/openjdk-8/jre, sun.arch.data.model=64, user.language=en, java.specification.vendor=Oracle Corporation, awt.toolkit=sun.awt.X11.XToolkit, java.vm.info=mixed mode, java.version=1.8.0_302, java.ext.dirs=/usr/local/openjdk-8/jre/lib/ext:/usr/java/packages/lib/ext, sun.boot.class.path=/usr/local/openjdk-8/jre/lib/resources.jar:/usr/local/openjdk-8/jre/lib/rt.jar:/usr/local/openjdk-8/jre/lib/sunrsasign.jar:/usr/local/openjdk-8/jre/lib/jsse.jar:/usr/local/openjdk-8/jre/lib/jce.jar:/usr/local/openjdk-8/jre/lib/charsets.jar:/usr/local/openjdk-8/jre/lib/jfr.jar:/usr/local/openjdk-8/jre/classes, java.vendor=Oracle Corporation, localRepository=/.m2, file.separator=/, java.vendor.url.bug=http://bugreport.sun.com/bugreport/, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, sun.cpu.isalist=}}, SystemEnvironmentPropertySource@1961176822 {name='systemEnvironment', properties={CI_COMMIT_MESSAGE=修改配置 , PATH=/usr/local/openjdk-8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, CI_SERVER_VERSION_MAJOR=14, CI_PROJECT_URL=http://192.168.0.87:8880/root/spring-demo, CI_COMMIT_REF_SLUG=master, GITLAB_FEATURES=, CI_PROJECT_PATH_SLUG=root-spring-demo, FF_USE_NEW_BASH_EVAL_STRATEGY=false, CI_SERVER_VERSION_MINOR=0, PWD=/builds/root/spring-demo, FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY=false, CI_SERVER=yes, SERVER_PORT=8075, CI_PROJECT_VISIBILITY=private, CI_BUILD_NAME=package, CI_PROJECT_TITLE=spring-demo, FF_USE_WINDOWS_LEGACY_PROCESS_STRATEGY=true, CI_PIPELINE_SOURCE=push, CI_RUNNER_ID=5, CI_REGISTRY_USER=gitlab-ci-token, CI_COMMIT_REF_NAME=master, CI_NODE_TOTAL=1, CI_SERVER_URL=http://192.168.0.87:8880, CI_COMMIT_TIMESTAMP=2021-07-22T10:56:57+08:00, SHLVL=1, CI_BUILD_REF_NAME=master, CI_JOB_STATUS=running, CI_PROJECT_REPOSITORY_LANGUAGES=java,dockerfile, CI_PAGES_URL=http://root.example.com/spring-demo, JAVA_HOME=/usr/local/openjdk-8, CI_JOB_STAGE=package, IMAGE_VERSION=0.0.1-SNAPSHOT, CI_PAGES_DOMAIN=example.com, CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX=192.168.0.87:8880/root/dependency_proxy/containers, CI_BUILD_STAGE=package, CI_CONCURRENT_ID=0, CI_RUNNER_REVISION=c1edb478, CI_PIPELINE_ID=68, CI_PROJECT_NAMESPACE=root, CI_JOB_JWT=[MASKED], CI_JOB_IMAGE=maven:3-jdk-8, JAVA_VERSION=8u302, CI_BUILD_TOKEN=[MASKED], FF_CMD_DISABLE_DELAYED_ERROR_LEVEL_EXPANSION=false, CI_RUNNER_EXECUTABLE_ARCH=linux/amd64, _=/usr/bin/mvn, CI_PROJECT_NAME=spring-demo, CI_BUILD_REF_SLUG=master, CI=true, FF_SKIP_NOOP_BUILD_STAGES=true, FF_NETWORK_PER_BUILD=false, CI_JOB_TOKEN=[MASKED], MAVEN_PROJECTBASEDIR=/builds/root/spring-demo, CI_PROJECT_DIR=/builds/root/spring-demo, CI_RUNNER_VERSION=14.0.1, TAG=192.168.0.86:8075/spring-demo:0.0.1-SNAPSHOT, CI_COMMIT_SHA=12937c30983a27ed9f5ff5839c6eb8544b6fc8b2, FF_GITLAB_REGISTRY_HELPER_IMAGE=true, CI_SERVER_REVISION=25fc1060aff, CI_JOB_STARTED_AT=2021-07-22T10:57:14+08:00, CI_CONCURRENT_PROJECT_ID=0, MAVEN_HOME=/usr/share/maven, CI_DEPENDENCY_PROXY_USER=gitlab-ci-token, CI_PIPELINE_URL=http://192.168.0.87:8880/root/spring-demo/-/pipelines/68, CI_SERVER_PORT=8880, CI_COMMIT_BEFORE_SHA=865cef8e59757322b9cb1050b2a8450644ffded4, DOCKER_DRIVER=overlay2, CI_SERVER_NAME=GitLab, CI_COMMIT_SHORT_SHA=12937c30, CI_JOB_URL=http://192.168.0.87:8880/root/spring-demo/-/jobs/153, FF_USE_POWERSHELL_PATH_RESOLVER=false, GITLAB_USER_NAME=Administrator, CI_BUILDS_DIR=/builds, IMAGE_NAME=spring-demo, CI_RUNNER_TAGS=mvn-package, CI_SERVER_VERSION_PATCH=5, OLDPWD=/builds/root/spring-demo, CI_SERVER_PROTOCOL=http, CI_COMMIT_BRANCH=master, FF_ENABLE_BASH_EXIT_CODE_CHECK=false, GITLAB_CI=true, REGISTRY_URL=http://192.168.0.86:8075, CI_JOB_ID=153, GITLAB_USER_ID=1, CI_PIPELINE_IID=68, CI_SERVER_VERSION=14.0.5, CI_COMMIT_TITLE=修改配置, REGISTRY_USER=admin, CI_DEPENDENCY_PROXY_SERVER=192.168.0.87:8880, DOCKER_HOST=tcp://192.168.0.86:2375, CI_API_V4_URL=http://192.168.0.87:8880/api/v4, GITLAB_USER_EMAIL=admin@example.com, CI_PROJECT_ROOT_NAMESPACE=root, CI_BUILD_REF=12937c30983a27ed9f5ff5839c6eb8544b6fc8b2, CI_PROJECT_ID=2, CI_RUNNER_DESCRIPTION=package-runner, LANG=C.UTF-8, CI_REGISTRY_PASSWORD=[MASKED], CI_PROJECT_PATH=root/spring-demo, CI_COMMIT_REF_PROTECTED=true, MAVEN_OPTS= -Dmaven.repo.local=/.m2, CI_DEFAULT_BRANCH=master, CI_DISPOSABLE_ENVIRONMENT=true, CI_RUNNER_SHORT_TOKEN=7tH14pxU, CI_COMMIT_AUTHOR=test <test@qq.com>, FF_SKIP_DOCKER_MACHINE_PROVISION_ON_CREATION_FAILURE=false, CI_CONFIG_PATH=.gitlab-ci.yml, CI_BUILD_BEFORE_SHA=865cef8e59757322b9cb1050b2a8450644ffded4, MAVEN_CMD_LINE_ARGS= clean package docker:build, CI_COMMIT_DESCRIPTION=, REGISTRY_PWD=admin123, CI_DEPENDENCY_PROXY_PASSWORD=[MASKED], CI_SERVER_HOST=192.168.0.87, CI_PIPELINE_CREATED_AT= 2021-07-22T10:57:05+08:00, FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR=false, SERVER_IP=192.168.0.86, FF_USE_FASTZIP=false, FF_USE_DIRECT_DOWNLOAD=true, HOSTNAME=runner-7th14pxu-project-2-concurrent-0, CI_BUILD_ID=153, CI_JOB_NAME=package, GITLAB_USER_LOGIN=root, CI_REPOSITORY_URL=http://gitlab-ci-token:[MASKED]@192.168.0.87:8880/root/spring-demo.git, HOME=/root}}] 02:57:47.660 [main] DEBUG org.springframework.test.context.support.TestPropertySourceUtils - Adding inlined properties to environment: {spring.jmx.enabled=false, org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=0} 02:57:47.660 [main] DEBUG org.springframework.core.env.StandardEnvironment - Adding PropertySource 'Inlined Test Properties' with highest search precedence . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.1.RELEASE) 2021-07-22 02:57:48.376 INFO 79 --- [ main] com.example.demo.DemoApplicationTests : Starting DemoApplicationTests on runner-7th14pxu-project-2-concurrent-0 with PID 79 (started by root in /builds/root/spring-demo) 2021-07-22 02:57:48.377 INFO 79 --- [ main] com.example.demo.DemoApplicationTests : No active profile set, falling back to default profiles: default 2021-07-22 02:57:48.443 INFO 79 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2af004b: startup date [Thu Jul 22 02:57:48 UTC 2021]; root of context hierarchy 2021-07-22 02:57:50.684 INFO 79 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 0 (http) 2021-07-22 02:57:50.744 INFO 79 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2021-07-22 02:57:50.745 INFO 79 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.29 2021-07-22 02:57:50.788 INFO 79 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib] 2021-07-22 02:57:50.939 INFO 79 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/demo] : Initializing Spring embedded WebApplicationContext 2021-07-22 02:57:50.939 INFO 79 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2498 ms 2021-07-22 02:57:51.137 INFO 79 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2021-07-22 02:57:51.140 INFO 79 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2021-07-22 02:57:51.140 INFO 79 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2021-07-22 02:57:51.140 INFO 79 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2021-07-22 02:57:51.140 INFO 79 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2021-07-22 02:57:51.396 INFO 79 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2021-07-22 02:57:51.726 INFO 79 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2af004b: startup date [Thu Jul 22 02:57:48 UTC 2021]; root of context hierarchy 2021-07-22 02:57:51.842 INFO 79 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/],methods=[GET]}" onto java.lang.String com.example.demo.DemoApplication.home() 2021-07-22 02:57:51.844 INFO 79 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2021-07-22 02:57:51.845 INFO 79 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2021-07-22 02:57:51.882 INFO 79 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2021-07-22 02:57:51.900 INFO 79 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2021-07-22 02:57:52.225 INFO 79 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 34437 (http) with context path '/demo' 2021-07-22 02:57:52.237 INFO 79 --- [ main] com.example.demo.DemoApplicationTests : Started DemoApplicationTests in 4.573 seconds (JVM running for 6.146) 2021-07-22 02:57:52.466 INFO 79 --- [o-auto-1-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/demo] : Initializing Spring FrameworkServlet 'dispatcherServlet' 2021-07-22 02:57:52.466 INFO 79 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2021-07-22 02:57:52.493 INFO 79 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 27 ms [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.231 s - in com.example.demo.DemoApplicationTests 2021-07-22 02:57:52.767 INFO 79 --- [ Thread-3] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2af004b: startup date [Thu Jul 22 02:57:48 UTC 2021]; root of context hierarchy [INFO] [INFO] Results: [INFO] [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] [INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ spring-demo --- [INFO] Building jar: /builds/root/spring-demo/target/spring-demo-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:2.0.1.RELEASE:repackage (default) @ spring-demo --- [INFO] [INFO] --- docker-maven-plugin:1.2.2:build (default-cli) @ spring-demo --- [INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier] [INFO] Copying /builds/root/spring-demo/target/spring-demo-0.0.1-SNAPSHOT.jar -> /builds/root/spring-demo/target/docker/spring-demo-0.0.1-SNAPSHOT.jar [INFO] Copying src/main/docker/Dockerfile -> /builds/root/spring-demo/target/docker/Dockerfile [INFO] Building image 192.168.0.86:8075/spring-demo:0.0.1-SNAPSHOT Step 1/9 : FROM java:8 ---> d23bdf5b1b1b Step 2/9 : MAINTAINER wangsh ---> Using cache ---> d9beb5070a95 Step 3/9 : VOLUME /tmp ---> Using cache ---> 47de9369f756 Step 4/9 : ADD *.jar spring-demo.jar ---> a2eefec044bb Step 5/9 : RUN sh -c 'touch /spring-demo.jar' ---> Running in ccbd3047ebb4 Removing intermediate container ccbd3047ebb4 ---> 335fa2b586ab Step 6/9 : EXPOSE 9080 ---> Running in 6a08c8489cd8 Removing intermediate container 6a08c8489cd8 ---> 3f7bd59924bc Step 7/9 : ENV JAVA_OPTS="-Xmx2048m -Xms2048m" ---> Running in 8e7909f498f6 Removing intermediate container 8e7909f498f6 ---> 6a52285b7966 Step 8/9 : ENV SERVER_PORT="--server.port=9085" ---> Running in c33405aedfa1 Removing intermediate container c33405aedfa1 ---> d67a7b82c712 Step 9/9 : ENTRYPOINT java -server ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /spring-demo.jar ${SERVER_PORT} ---> Running in f05f80a57efd Removing intermediate container f05f80a57efd ---> ad88808811a2 ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null} Successfully built ad88808811a2 Successfully tagged 192.168.0.86:8075/spring-demo:0.0.1-SNAPSHOT [INFO] Built 192.168.0.86:8075/spring-demo:0.0.1-SNAPSHOT [INFO] Tagging 192.168.0.86:8075/spring-demo:0.0.1-SNAPSHOT with 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 21.924 s [INFO] Finished at: 2021-07-22T02:58:04Z [INFO] ------------------------------------------------------------------------ Saving cache for successful job 00:01 Creating cache default-1... WARNING: .m2/repository: no matching files Archive is up to date! Created cache Uploading artifacts for successful job 00:01 Uploading artifacts... target/*.jar: found 1 matching files and directories Uploading artifacts as "archive" to coordinator... ok id=153 responseStatus=201 Created token=j42qj8s1 Job succeeded
以上执行maven打包,首次执行下载jar包较慢,需要等待一段时间,由于我们这里设置了缓存目录,下载执行是首先查看本地,如果本地已经存在,则不下载。
查看宿主机maven下载jar包仓库:
可以看到已经下载jar包到本地机器。
Job2执行deploy结果:
详细信息:
Running with gitlab-runner 14.0.1 (c1edb478) on deploy-runner ecsZZi3q Preparing the "docker" executor Using Docker executor with image docker:latest ... Pulling docker image docker:latest ... Using docker image sha256:08bdaf2f88f90320cd3e92a469969efb1f066c6d318631f94e7864828abd7c75 for docker:latest with digest docker@sha256:a61102937d2bda8319882998ef1ffa27387617f6eea6c298b18a05f7fba82c0d ... Preparing environment 00:01 Running on runner-ecszzi3q-project-2-concurrent-0 via 647ad32b7320... Getting source from Git repository 00:01 Fetching changes with git depth set to 50... Reinitialized existing Git repository in /builds/root/spring-demo/.git/ Checking out 12937c30 as master... Removing target/ Skipping Git submodules setup Restoring cache 00:00 Checking cache for default-1... No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. Successfully extracted cache Downloading artifacts Downloading artifacts for package (153)... Downloading artifacts from coordinator... ok id=153 responseStatus=200 OK token=j42qj8s1 Executing "step_script" stage of the job script Using docker image sha256:08bdaf2f88f90320cd3e92a469969efb1f066c6d318631f94e7864828abd7c75 for docker:latest with digest docker@sha256:a61102937d2bda8319882998ef1ffa27387617f6eea6c298b18a05f7fba82c0d ... $ echo "=============== deploy ===============" =============== deploy =============== $ docker login --username $REGISTRY_USER --password $REGISTRY_PWD $REGISTRY_URL WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded $ docker push $TAG The push refers to repository [192.168.0.86:8075/spring-demo] 6cc3073c0661: Preparing bf3383134655: Preparing 35c20f26d188: Preparing c3fe59dd9556: Preparing 6ed1a81ba5b6: Preparing a3483ce177ce: Preparing ce6c8756685b: Preparing 30339f20ced0: Preparing 0eb22bfb707d: Preparing a2ae92ffcd29: Preparing a3483ce177ce: Waiting ce6c8756685b: Waiting 30339f20ced0: Waiting 0eb22bfb707d: Waiting a2ae92ffcd29: Waiting 6ed1a81ba5b6: Layer already exists 35c20f26d188: Layer already exists c3fe59dd9556: Layer already exists a3483ce177ce: Layer already exists 30339f20ced0: Layer already exists ce6c8756685b: Layer already exists a2ae92ffcd29: Layer already exists 0eb22bfb707d: Layer already exists 6cc3073c0661: Pushed bf3383134655: Pushed 0.0.1-SNAPSHOT: digest: sha256:b764cfae505c25071806539708870fc0efcad04d283755b38e233751d02aff06 size: 2424 $ if [ $(docker ps -aq --filter name=$IMAGE_NAME) ]; then docker rm -f $IMAGE_NAME ;fi $ docker image prune WARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] Total reclaimed space: 0B $ docker run -dit --name $IMAGE_NAME -p 9080:9080 --restart=always $TAG 95c2e00bac2ed86830f05ecd5e9a7de9a497f2ac40af96285eb67d2ef20012bd Saving cache for successful job 00:01 Creating cache default-1... WARNING: .m2/repository: no matching files Archive is up to date! Created cache Job succeeded
以上时.gitlab-ci.yml中定义的job2执行结果,即deploy执行的登录私服,上传镜像,启动容器等操作结果。
查看打包结果
CI/CD pipelines任务执行完成后,查看执行结果,可以看到打包前后对比,打包完成已经生成docker镜像,并启动服务
打包前镜像:
打包后spring-demo镜像:
启动spring-demo镜像:
demo下载地址:https://gitee.com/starsky20/docker-gitlab-cicd.gitERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
以上时启动gitlab-runner时,需要加载一个config.toml配置文件,在容器启动时通过宿主机挂载到容器的/etc/gitlab-runner/config目录,而挂载宿主机目录还没有config.toml配置文件,所以提示以上错误。
解决办法:
进入到gitlab-runner容器内存,执行注册即可,注册完成会自动生成config.toml文件Using locally found image version due to “if-not-present” pull policy
gitlab-runner 14版本不支持该属性,删除即可。
Could not transfer artifact com.jayway.jsonpath:json-path:jar:2.4.0
[ERROR] Failed to execute goal on project spring-demo: Could not resolve dependencies for project com.example:spring-demo:jar:0.0.1-SNAPSHOT: Could not transfer artifact com.jayway.jsonpath:json-path:jar:2.4.0 from/to central (https://repo.maven.apache.org/maven2): GET request of: com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar from central failed: Connection reset -> [Help 1]
maven打包时提示缺少该jar包,在项目pom.xml文件中引入即可。
<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.4.0</version> </dependency>
ERROR: Runner http://192.168.0.87:8880/j7jVRMZfo5srqW1TWEgL is not healthy and will be disabled!
原因:config.toml配置中token之和项目中token值不一致导致,重新注册runner即可。
"Can’t close tar writer: io: read/write on closed pipe
$ docker build -t spring-demo:0.0.1-SNAPSHOT .
27time=“2021-07-20T08:15:22Z” level=error msg=“Can’t add file /builds/root/spring-demo/.git/objects/9c/c84ea9b4d95453115d0c26488d6a78694e0bc6 to tar: io: read/write on closed pipe”
28time=“2021-07-20T08:15:22Z” level=error msg=“Can’t close tar writer: io: read/write on closed pipe”
29Error response from daemon: Client sent an HTTP request to an HTTPS server.
30ERROR: Job failed: exit code 1
面临的问题是因为生成pickle 对象的进程分配了不同的用户,然后访问pickle 对象的进程。
在 Dockerfile 中添加了如下步骤,RUN chown -R /home/data/gitlab/
把这个目录的权限打开:
chmod -R 777 /var/run/docker.sockunable to find valid certification path to requested target
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (default-cli) on project spring-demo: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target -> [Help 1]
docker中增加了tls认证,客户端在执行docker命令时需要tls认证相关信息,将docker认证的ca.pem, cert.pem, key.pem文件放在指定位置,执行docker命令时加载认证文件信息即可。
例如:查看正在运行的容器
docker --tlsverify --tlscacert=/opt/cert/docker/ca.pem --tlscert=/opt/cert/docker/cert.pem --tlskey=/opt/cert/docker/key.pem -H tcp://47.119.120.197:2375 pson project spring-demo: Exception caught: no basic auth credentials
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (default-cli) on project spring-demo: Exception caught: no basic auth credentials -> [Help 1]
项目打包时提示授权问题,时由于docker登录私服时需要账号密码认证。
解决办法:
在docker配置文件/etc/docker/daemon.json中添加访问私服的地址:vim /etc/docker/daemon.json "insecure-registries":[ "192.168.0.86:8076", "192.168.0.86:8075" "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://hub.docker.com", "https://hub.daocloud.io"
然后再docker执行login命令时添加上用户账号密码即可
docker login -u admin -p admin123 http://192.168.0.86:8075
Error response from daemon: Get http://192.168.0.87:8075/v2/: dial tcp 192.168.0.87:8075: connect: connection refused
26$ docker login --username admin --password admin123 192.168.0.87:8075
27WARNING! Using --password via the CLI is insecure. Use --password-stdin.
28Error response from daemon: Get http://192.168.0.87:8075/v2/: dial tcp 192.168.0.87:8075: connect: connection refused
29ERROR: Job failed: exit code 1解决办法:
在docker配置文件/etc/docker/daemon.json中添加访问私服的地址:vim /etc/docker/daemon.json "insecure-registries":[ "192.168.0.86:8076", "192.168.0.86:8075" "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://hub.docker.com", "https://hub.daocloud.io" docker安装GitLab-runnerdocker安装GitLab-runner拉取镜像创建挂载目录启动容器注册gitlab-runner修改Runner配置文件创建SpringBoot项目测试CICD项目结构配置docker注册runner修改config.toml挂载目录修改项目pom.xml,引入docker插件在项目根目录创建Dockerfile文件提交代码到gitlab查看打包结果安装错误ERROR: Failed to load config stat /etc/gitlab-runner/
环境:ubuntu 16.04 LTS目的:使用Docker安装和配置GitLab Runner,搭建GitLab CI持续集成环境。 安装gitlab-runner $ docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/config...1。运行一个runner docker run --name runner -d -v /var/run/docker.sock:/var/run/docker.sock -v /gitlab-runner/config/:/etc/gitlab-runner gitlab/gitlab-runner:ubuntu-v14.6.1 2.进入容器启动一个runner gitlab-runner register \ --non-interactive \ --exeDocker是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。 总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应这个错误提示可能是由于您的 Docker 镜像文件不完整或损坏导致的。建议您重新下载或拷贝一份完整的 Docker 镜像文件,并再次执行 `docker load` 命令。 如果问题仍然存在,可以尝试使用以下命令清除 Docker 缓存并重新加载镜像: docker system prune -a docker load -i /opt/nacos/nacos-server 此外,还可以检查以下几点: 1. 检查您的 Docker 版本是否最新,可以使用 `docker version` 命令查看。 2. 检查您的磁盘空间是否足够,可以使用 `df -h` 命令查看。 希望这些信息可以帮助您解决问题。