使用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-oraclejdk8oraclejdk的镜像,只包含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

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测试,可以在页面中看见新推送的镜像