使用Gitlab CI与Maven创建Docker镜像

之前使用了Jenkins作为自动构建工具,然而还是需要自己一台VPS去安装Jenkins软件。

然而Gitlab提供CI/CD服务(Continuous Integration & Deployment)每月有2k Mins的免费额度,如果需要更多的事件可以购买Ultimate或者自己搭建Runner。

同时Gitlab也提供免费的registry,不知道有没有额度限制,直接一条龙服务都提供了(Gitlab 大法好)。除了上次删库的情况也没出现过啥问题,没有私有库数量的限制,拿来专做自己的私有库还是不错滴。

自动化脚本gitlab-ci.yml

创建gitlab-ci.yml保存在项目根目录下编写以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
stages:
- build
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
auto-build:
image: frolvlad/alpine-oraclejdk8
stage: build
script:
- mkdir /var/tmp/maven
- wget -P /var/tmp/maven http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
- tar xzf /var/tmp/maven/apache-maven-3.5.4-bin.tar.gz -C /var/tmp/maven
- rm -rf /var/tmp/maven/apache-maven-3.5.4-bin.tar.gz
- sed -i "126i <server><id>docker-hub</id><username>***</username><password>****</password><configuration><email>****</email></configuration></server>" /var/tmp/maven/apache-maven-3.5.4/conf/settings.xml
- export M2_HOME=/var/tmp/maven/apache-maven-3.5.4
- export PATH=$PATH:$M2_HOME/bin
- mvn package docker:build -DpushImageTag
artifacts:
paths:
- target/web-*.jar

总共阶段只有一个build,在build过程中就push到docker hub中去了

services提供docker的服务接口使用docker:dind镜像并设置变量使程序可以访问docker服务进行镜像打包

这里使用了frolvlad/alpine-oraclejdk8oraclejdk的镜像,只包含jdk所以需要下载并设置maven,由于docker-maven-plugin的问题好像只能读取settings.xml下的dockerhub用户名密码,所以需要使用sed命令插入

script内可以执行shell命令,我提供的代码内容为下载解压maven->设置maven全局属性->设置Maven环境变量->执行打包

配置Maven

由于使用了-DpushImageTag所以需要在pom.xml内添加imageTag标签,使用项目的version参数作为tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<serverId>docker-hub</serverId>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<pushImage>true</pushImage>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
</configuration>
</plugin>

执行

只需要commit并push之后gitlab ci会自动根据.gitlab-ci.yml进行操作,push完成之后就可以在pipelines中看到新的pipeline

Pipeline

当status为passed之后,在docker hub中就能发现自己push的镜像

推送到私有仓库

docker官方的hub到国内实在是太慢了,所以很多情况需要推送到其他的仓库中去。比如Gitlab的官方仓库。

进入仓库页面官方给了一些示例。

修改pom.xml

1
2
3
4
5
6
7
8
9
<plugin>
...
<configuration>

<serverId>gitlab-hub</serverId>
<imageName>registry.gitlab.com/${docker.image.prefix}/${project.artifactId}</imageName>
...
</configuration>
</plugin>

在镜像名前添加registry.gitlab.com,同时要符合registry.gitlab.com/用户名/仓库名的规则。

修改注入settings.xml文件的内容,修改用户名密码和邮箱为gitlab的内容

1
- sed -i "126i <server><id>gitlab-hub</id><username>***</username><password>****</password><configuration><email>****</email></configuration></server>"  /var/tmp/maven/apache-maven-3.5.4/conf/settings.xml

push测试,可以在页面中看见新推送的镜像

文章作者: Image
文章链接: https://by.cx/2018/07/30/Gitlab-CI-Maven-Docker/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 编译程序