公众号:飞翔的代码
公司里一直使用gitlab来管理代码,刚好gitlab提供了gitlab-ci+runner来执行自动化脚本,结合这两个功能正好可以实现代码提交后自动构建
原理:gitlab-runner注册到gitlab,当向gitlab提交代码时,gitlab通知runner程序,runner程序在本地拉取最新代码,执行.gitlab-ci.yml
文件中定义的脚本
需要先搭建好gitlab,参照前段时间发布的 超快搭建Gitlab
gitlab-runner安装和配置
先准备好以下文件
apache-maven-3.6.3-bin.tar.gz
maven安装包,版本不一定非要一模一样docker-compose
docker-compose可执行文件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
执行上面的命令后,会要求填写一些参数,分别如下:
- Please enter the gitlab-ci coordinator URL (e.g. gitlab.com/):
- 这个上面从gitlab后台复制的地址
- Please enter the gitlab-ci token for this runner:
- 这个填上面从gitlab后台复制的token
- Please enter the gitlab-ci description for this runner:
- 随便填一个描述的说明文字
- Please enter the gitlab-ci tags for this runner (comma separated):
- 填写tag,在之后的.gitlab-ci.yml中任务可以指定不同tag的ci来执行
- 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可以做更多事