gitlab-ci自动构建java项目

1,657 阅读2分钟

公众号:飞翔的代码

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

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

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

gitlab-runner安装和配置

先准备好以下文件

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

创建好目录

cd /usr/local
mkdir -p docker/gitlab-runner/build
cd docker/gitlab-runner/build

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

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

# 这个版本要和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.6.3-bin.tar.gz /usr/local/maven
RUN tar -zxvf apache-maven-3.6.3-bin.tar.gz && \
    rm -fr apache-maven-3.6.3-bin.tar.gz

ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.6.3
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,内容如下:

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

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

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

docker-compose.yml

cd ..
vi docker-compose.yml

docker-compose.yml内容如下:

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.6.3/conf/settings.xml # 这里maven的版本要和自己下载的版本一致
      - ./config:/etc/gitlab-runner/

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

<?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>

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

mkdir config
touch config/config.toml

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

gitlab-runner配置

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

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

docker exec -it gitlab-runner bash

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

gitlab-ci-multi-runner register

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

  1. Please enter the gitlab-ci coordinator URL (e.g. gitlab.com/):
    • 这个上面从gitlab后台复制的地址
  2. Please enter the gitlab-ci token for this runner:
    • 这个填上面从gitlab后台复制的token
  3. Please enter the gitlab-ci description for this runner:
    • 随便填一个描述的说明文字
  4. Please enter the gitlab-ci tags for this runner (comma separated):
    • 填写tag,在之后的.gitlab-ci.yml中任务可以指定不同tag的ci来执行
  5. 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文件,内容如下:

# 定义构建步骤
stages:
  - oa

# 定义每个步骤的具体规则和脚本
oa:
  stage: oa # 这个名字是上面定义的步骤名
  only: # 这参数是一个数组,表示限定指定的分支才会触发
    - master # 只有master分支上提交代码才会触发自动构建
  tags: # 这里填runner注册到gitlab时填写的tag
    - oa
  script: # 具体的构建脚本
    # maven构建
    - /usr/local/maven/apache-maven-3.6.3/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

version: '3.1'
services:
  oa-admin:
    build: build
    container_name: oa-admin
    ports:
      - 8088:8088 # 这是项目的端口

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

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可以做更多事