gitlab-ci自动构建java

转载自公众号:飞翔的代码

公司里一直使用gitlab来管理代码,刚好gitlab提供了gitlab-ci+runner来执行自动化脚本,结合这两个功能正好可以实现代码提交后自动构建

原理:gitlab-runner注册到gitlab,当向gitlab提交代码时,gitlab通知runner程序,runner程序在本地拉取最新代码,执行.gitlab-ci.yml文件中定义的脚本

需要先搭建好gitlab,参照前段时间发布的 超快搭建Gitlab

gitlab-runner安装和配置

先准备好以下文件

  1. apache-maven-3.8.6-bin.tar.gz maven安装包,版本不一定非要一模一样
  2. docker-compose docker-compose可执行文件
  3. jdk-8u221-linux-x64.tar.gz jdk8,版本不一定非要一模一样

创建好目录

1
2
3
cd /usr/local
mkdir -p docker/gitlab-runner/build
cd docker/gitlab-runner/build

将准备好的3个文件放到build目录下

在build目录下创建Dockerfile,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 这个版本要和gitlab版本兼容,要不然可能会出些BUG,这个gitlab-runner官网上能找到
FROM gitlab/gitlab-runner:v11.4.2

RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial stable' >> /etc/apt/sources.list

RUN curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
RUN apt-get update -y

RUN apt-get -y install iptables
RUN apt-get -y install apt-transport-https ca-certificates curl software-properties-common docker-ce

RUN mkdir -p /usr/local/docker
WORKDIR /usr/local/docker
COPY daemon.json /etc/docker/daemon.json
RUN service docker start

COPY docker-compose /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-compose

RUN mkdir -p /usr/local/java
WORKDIR /usr/local/java
# 要注意替换成自己所下载的jdk版本,下面还有版本要修改的地方
COPY jdk-8u221-linux-x64.tar.gz /usr/local/java
RUN tar -zxvf jdk-8u221-linux-x64.tar.gz && \
rm -fr jdk-8u221-linux-x64.tar.gz

RUN mkdir -p /usr/local/maven
WORKDIR /usr/local/maven
# 要注意替换成自己所下载的maven版本,下面还有版本要修改的地方
COPY apache-maven-3.8.6-bin.tar.gz /usr/local/maven
RUN tar -zxvf apache-maven-3.8.6-bin.tar.gz && \
rm -fr apache-maven-3.8.6-bin.tar.gz

ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.8.6
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

WORKDIR /

继续在build目录下创建entrypoint.sh,这是容器启动时的入口脚本,主要是启动docker和gitlab-runner,内容如下:

1
2
3
#!/bin/sh
service docker start
gitlab-runner run

继续创建daemon.json,这是docker的配置文件,主要是设置docker镜像源到国内,提高docker拉取镜像的速度,内容如下:

1
2
3
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

docker-compose.yml

1
2
cd ..
vi docker-compose.yml

docker-compose.yml内容如下:

1
2
3
4
5
6
7
8
9
10
11
version: '3.1'
services:
gitlab-runner:
build: build
restart: always
container_name: gitlab-runner
privileged: true # 使用宿主机的root用户运行
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./settings.xml:/usr/local/maven/apache-maven-3.8.6/conf/settings.xml # 这里maven的版本要和自己下载的版本一致
- ./config:/etc/gitlab-runner/

再创建settings.xml,这是maven的配置文件,可以配置中央仓库,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/home/.m2/</localRepository>

<pluginGroups></pluginGroups>
<proxies></proxies>

<servers>
<!-- 如果构建项目时需要到私服拉取jar包就写在这里 -->
</servers>

<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
</settings>

最后再创建一个空的配置文件,如果不创建在启动时容器里会一直报错说配置文件不存在

1
2
mkdir config
touch config/config.toml

至此全部文件已经准备完毕,执行docker-compose up -d即可自动构建gitlab-runner镜像并启动容器

gitlab-runner配置

进入gitlab后台,找到需要自动构建的仓库,复制仓库的settings->CI/CD->Runners中的地址和token,下面要用到

img

容器启动成功后,进入gitlab-runner这个容器

1
docker exec -it gitlab-runner bash

进入容器后,开始注册runner到gitlab

1
gitlab-ci-multi-runner register

执行上面的命令后,会要求填写一些参数,分别如下:

  1. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
  • 这个上面从gitlab后台复制的地址
  1. Please enter the gitlab-ci token for this runner:
  • 这个填上面从gitlab后台复制的token
  1. Please enter the gitlab-ci description for this runner:
  • 随便填一个描述的说明文字
  1. Please enter the gitlab-ci tags for this runner (comma separated):
  • 填写tag,在之后的.gitlab-ci.yml中任务可以指定不同tag的ci来执行
  1. Please enter the executor: docker, shell, virtualbox, docker+machine, docker-ssh+machine, kubernetes, docker-ssh, parallels, ssh:
  • 这一步一般填shell,有时候也会填docker,填docker表示.gitlab-ci.yml中构建脚本在指定的docker镜像中执行

到这里runner已经注册到gitlab了,接下来就可以编写.gitlab-ci.yml

.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
23
24
25
# 定义构建步骤
stages:
- oa

# 定义每个步骤的具体规则和脚本
oa:
stage: oa # 这个名字是上面定义的步骤名
only: # 这参数是一个数组,表示限定指定的分支才会触发
- master # 只有master分支上提交代码才会触发自动构建
tags: # 这里填runner注册到gitlab时填写的tag
- java
script: # 具体的构建脚本
# maven构建
- /usr/local/maven/apache-maven-3.8.6/bin/mvn clean package -Dmaven.test.skip=true
# 将构建出来的jar移到项目的docker/oa-admin/build目录下
- cp api-admin/target/*.jar docker/oa-admin/build/
# 进入docker/oa-admin目录,启动docker
- cd docker/oa-admin
- service docker start
# 将原来的docker容器关闭
- docker-compose down
# 重新构建docker镜像
- docker-compose build
# 启动容器
- docker-compose up -d

docker配置

上面.gitlab-ci.yml中有写到docker/oa-admin/build这样的目录,这是项目的docker镜像和容器配置相关的文件,现在就来创建这些目录和相应的文件

在项目根目录创建docker/oa-admin/build目录

在docker/oa-admin目录下创建docker-compose.yml

1
2
3
4
5
6
7
version: '3.1'
services:
oa-admin:
build: build
container_name: oa-admin
ports:
- 8088:8088 # 这是项目的端口

在docker/oa-admin/build目录下创建Dockerfile

1
2
3
4
5
6
7
8
9
10
FROM openjdk:8-jre

ENV APP_VERSION 1.0.0-SNAPSHOT # 项目版本号,maven打包后jar文件名中有这个版本号

RUN mkdir /webapps

COPY api-admin-$APP_VERSION.jar /webapps/api-admin.jar # 注意jar包的名字

# 容器启动时执行的命令
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/webapps/api-admin.jar", "--spring.profiles.active=test"]

到这算是全部搞好了,提交代码到master分支,在gitlab后台打开项目的仓库,点击CI/CD->Pipelines能够看到正在构建的任务,在这里可以看到该任务构建的进度和日志

构建完成后,可以在runner那台服务器上docker ps查看到一个运行中的项目容器

步骤比较多,动手做一遍,清楚过程后,会发现gitlab-ci可以做更多事