GitLab Ci+docker持续化部署SpringBoot项目

338 阅读5分钟

准备环境

需要 dockerdocker-compose环境

安装docker和docker-compose 参考Docker的安装使用与程序的部署

安装GitLab CE 和 GitLab Runner

创建gitlab文件夹,进入后创建docker-compose.yml文件

version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ce'
    restart: always
    container_name: gitlab
    hostname: '192.168.2.132:8001'
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.2.132:8001'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        # unicorn['port'] = 8888
        nginx['listen_port'] = 80
    ports:
      - '8001:80'
      - '8443:443'
      - '2222:22'
    volumes:
      - /etc/localtime:/etc/localtime
      - ./config:/etc/gitlab
      - ./data:/var/opt/gitlab
      - ./logs:/var/log/gitlab
  gitlab-runner:
    image: gitlab/gitlab-runner
    restart: always
    hostname: gitlab-runner
    container_name: gitlab-runner
    extra_hosts:
      - git.imlcs.top:192.168.2.132
    depends_on:
      - gitlab
    volumes:
      - /etc/localtime:/etc/localtime
      - ./runner:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock

执行docker-compose up -d运行容器

需要一定的部署时间请耐心等待

配置GitLab

访问http://192.168.2.132:8001 并设置好密码

image-20200819174745049

使用 root 帐号加刚才设置的密码登录

image-20200819174925545

设置中文

  1. 点击头像--->设置 在这里插入图片描述

  2. 点击左侧Preferences 在这里插入图片描述

  3. 找到Language 选择中文 image-20200819175111582

刷新页面就变成中文

获取 GitLab CI 地址与令牌参数

将项目上传到GitLab上

在项目设置->CI/CD中找到Runner并展开

image-20200820115003315

获取 URL 和 注册令牌 接下来配置 GitLab Runner 会用到 在这里插入图片描述

配置 GitLab Runner

方法一

docker exec -it gitlab-runner  gitlab-runner register -n \
  --url http://192.168.2.132:8001/ \
  --registration-token WE6zAWHJniXzWDxq2qPU \
  --description "dockersock" \
  --docker-privileged=true \
  --docker-pull-policy="if-not-present" \
  --docker-image "docker:latest" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock \
  --docker-volumes /root/m2:/root/.m2 \
  --executor docker

如果出现以下提示

ERROR: Registering runner... failed                 runner=WE6zAWHJ status=couldn't execute POST against http://192.168.2.132:8001/api/v4/runners: Post http://192.168.2.132:8001/api/v4/runners: dial tcp 192.168.2.132:8001: connect: no route to host
PANIC: Failed to register this runner. Perhaps you are having network problems

则是没有关闭防火墙,关闭防火墙后重启docker服务

在如方法二中图所示添加标签信息

方法二

该方法更方便理解每一步

[root@localhost gitlab]# docker exec -it gitlab-runner gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=17 revision=a998cacd version=13.2.2
Running in system-mode.
# 输入GitLab地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.2.132:8001/
# 输入GitLab Token
Please enter the gitlab-ci token for this runner:
WE6zAWHJniXzWDxq2qPU
# 输入 Runner 的说明(可以为空,以后可修改)
Please enter the gitlab-ci description for this runner:
[gitlab-runner]:
# 设置 Tag 可以用于指定在构建规定的 tag 时触发 ci(可后期修改)
Please enter the gitlab-ci tags for this runner (comma separated):
docker,maven
# 选择 runner 执行器,这里我们选择的是 docker
Please enter the executor: shell, docker+machine, docker-ssh+machine, kubernetes, custom, docker-ssh, parallels, ssh, virtualbox, docker:
docker
Please enter the default Docker image (e.g. ruby:2.6):
docker:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

当上述步骤完成后,刷新当前页面,可以看见当前页面下多出来一个 runner:

image-20200820124518376

点击锁右边的编辑按钮

image-20200820124921871

进入runner目录,可以看到有个config.tooml文件,编辑该文件

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "ci/cd-test"
  url = "http://192.168.2.132:8001/"
  token = "Ygz9Wn82NjxzYTnEDoty"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/root/m2:/root/.m2"]
    shm_size = 0
    pull_policy = "if-not-present"

每配置一个 runner 就会在配置文件中生成一个 [[runners]]

  • 修改 privileged = true

    默认为 false,需改为 true。false 时,在 CI 构建的时候 会进行 health check,很耗时而且还是失败,设为 true 就自动跳过了。

  • 修改 volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/root/m2:/root/.m2"]

    如果本地有 maven 环境的话,可以挂在到本地,这样在处理依赖时可以直接使用本地的环境,并且可以用阿里云镜像源。

  • 添加 pull_policy = "if-not-present"

    依赖拉取策略:如果本地有就不检查,如果没有就拉取

容器化与 Gitlab CI Auto DevOps 配置

编写 Dockerfile 文件

在项目根目录下创建Dockerfile文件

FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY  /target/*.jar app.jar
ENV PORT 5000
EXPOSE $PORT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]

配置 .gitlab-ci.yml 文件

添加 Gitlab CI 核心的配置文件——==.gitlab-ci.yml==,并把它放在项目的根目录下。Gitlab 项目在创建的时候,默认会开启 Auto DevOps流水线,当有代码 push 到仓库中去的时候会自动扫描根目录下是否包含 .gitlab-ci.yml,如果有,会根据预定义的持续集成和持续交付配置自动化地构建、测试和部署应用程序。详细的语法参考官方文档: .gitlab.yml reference

# 设置 Maven 阿里云镜像 也可以在 /root/.m2 目录中编辑 settings.xml文件 添加阿里云镜像信息
before_script:
  - rm -rf /root/.m2/settings.xml
  - echo -e "<?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\""><mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors></settings>" > /root/.m2/settings.xml

image: docker:latest
variables: # 定义job执行时所需要使用的环境变量
  DOCKER_DRIVER: overlay2
  #DOCKER_HOST: tcp://192.168.2.132:2375  # docker host,本地可不写
  TAG: root/gitlab-ci:v1.0  # 镜像名称
  CONTAINER_NAME: gitlab-ci-cd
  PORT: 8765
cache: # 配置缓存,配置后,maven 下载的依赖可以被缓存起来,下次不需要重复去下载了。
  paths:
    - .m2/repository
services: # 配置需要用到的额外的服务。docker:dind,用于在 docker 中运行 docker 的一种东西,在项目的构建中需要。
  - docker:dind
stages: # 这是 Gitlab CI 中的概念,Stages 表示构建阶段,定义管道有哪些stage,stage按定义顺序执行
  - package
  - deploy
maven-package: # 定义的 Jobs 之一,用于构建 jar 包。内部又引入 maven 镜像来处理,负责执行 package 这一流程。
  image: maven:3.6.3-jdk-8
  tags: # 指定哪一个gitlab runner可以pickup这个job去执行,每个gitlab runner都有一个tag
    - maven
  stage: package
  script: # 定义job要执行的命令
    - mvn clean package -Dmaven.test.skip=true
  artifacts: # 定义那些文件需要在下一个job使用,一般是用于上一个job构建的结果文件需要在下一个job去使用
    paths:
      - target/*.jar
build-master: # 定义的 Jobs 之一,用于构建 Docker 镜像。负责执行 deploy 这一流程。具体执行 build 和 run。
  tags:
    - docker
  stage: deploy
  script:
    - docker build -t $TAG . # 构件镜像
    - docker rm -f $CONTAINER_NAME || true # 删除容器
    - docker run -d --name $CONTAINER_NAME -p $PORT:$PORT $TAG # 运行容器
  only: # 指定哪些branch的push commit会触发执行该job,本例子指定只有master才会执行deploy这个job
    - master

完成配置工作后 Git 执行 commit&push 就会开始自动构建。回到 Gitlab 页面就可以看到构建的过程。