一光年

[Gitlab-CICD] 使用Docker自动打包并运行Maven项目

2019.10.31

使用gitlab-cicd功能,轻松达到软件项目自动化集成与部署的目的,工程开发部署效率的终于飞涨有了亲身的体会。

特在此分享一下部署过程。

部署对象

  1. SpringBoot项目
  2. 使用Maven打包

运行环境

  1. CentOS系统
  2. Maven项目(Docker方式运行)
  3. Gitlab(Docker方式安装)
  4. Gitlab-runner(Docker方式安装)

安装设置

1. gitlab安装

现在的gitlab可以直接通过docker方式安装,比yum方式安装方便了很多,再次不再赘述。

2. gitlab-runner安装

gitlab-runner是整个CICD的关键,gitlab工程是通过runner方式来进行自动化集成与部署的。

gitlab-runner同样可以通过docker方式安装。

docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

3. gitlab-runner注册和设置

对于目标项目,需要注册一个gitlab-runner实例来实现自动化处理。

# 进入gitlab-runner容器内部
docker exec -it gitlab-runner bash

以下在gitlab-runner容器内部的执行命令

# 注册runner开始
gitlab-runner register

# 输入gitlab服务的网址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://xxx

# 输入token(这个token在gitlab的[Admin Area -> Runners]可以找到)
Please enter the gitlab-ci token for this runner
xxx

# 输入Runner的描述
Please enter the gitlab-ci description for this runner
[hostname] my-runner

# 输入执行标签(目标项目如果指定此TAG,则本runner会被执行)
Please enter the gitlab-ci tags for this runner (comma separated):
mvn-runner

# 输入Ruuner的执行者
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

# 指定docker版本
Please enter the Docker image (eg. ruby:2.1):
alpine:latest
  1. gitlab-runner配置

将每次使用maven打包的资源缓存起来,可以极大缩短每次打包的时间,提高效率。

# 以下,同样是在gitlab-runner容器中执行

# 修改Runner配置文件
vim /srv/gitlab-runner/config/config.toml

# 找到对应runner的volumes配置,修改如下
volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/data/.m2/:/.m2/"]

# 下面再加一行,防止runner重复拉取镜像
pull_policy = "if-not-present"

# 退出镜像
exit

重启gitlab-runner容器,使得以上配置生效

docker restart gitlab-runner

项目配置

以上,gitlab和gitlab-runner的配置就已经完成了。下面回到项目中,编辑Dockerfile和.gitlab-ci.yml文件。

编辑Dockerfile

FROM openjdk:8-jdk

VOLUME /tmp
COPY  /target/app.jar app.jar

ENV PORT 8080
EXPOSE $PORT

ENTRYPOINT ["java", "-jar", "/app.jar"]

编辑.gitlab-ci.yml

image: docker:stable  #1

variables:  #2
  MAVEN_OPTS: "-Dmaven.repo.local=/.m2"
  TAG: test/my-app:v0.1  # 镜像名称
  PORT: 18080

stages:  #5
  - compile
  - build
  - run

project-compile:  #6
  image: maven:3-jdk-8
  stage: compile
  tags:
    - mvn-runner
  script:
    - mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true
  artifacts:
    expire_in: 1 days
    paths:
      - target/*.jar

project-build:  #7
  stage: build
  tags:
    - mvn-runner
  script:
    - docker build -t $TAG .
    - docker rm -f my-maven-app || true
  only:
    - master

project-run:
  stage: run
  dependencies: []
  tags:
    - mvn-runner
  script:
    - docker run -d --name my-maven-app -p $PORT:8080 $TAG

CI/CD运行

以上配置完成后,提交修改后的项目代码,即可看到项目的[CI/CD -> Pipeline]中,已经有任务在执行。

企业微信截图_d3edf237-a0c5-42b3-a970-8b6d177c1840