使用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保存在项目根目录下编写以下内容
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-oraclejdk8
oraclejdk的镜像,只包含jdk所以需要下载并设置maven,由于docker-maven-plugin的问题好像只能读取settings.xml下的dockerhub用户名密码,所以需要使用sed命令插入
script
内可以执行shell命令,我提供的代码内容为下载解压maven->设置maven全局属性->设置Maven环境变量->执行打包
配置Maven
由于使用了-DpushImageTag
所以需要在pom.xml
内添加imageTag标签,使用项目的version参数作为tag
<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
当status为passed之后,在docker hub中就能发现自己push的镜像
推送到私有仓库
docker官方的hub到国内实在是太慢了,所以很多情况需要推送到其他的仓库中去。比如Gitlab的官方仓库。
进入仓库页面官方给了一些示例。
修改pom.xml
<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的内容
- 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测试,可以在页面中看见新推送的镜像