DevOps, 阿里云, kubernetes, 技术, 运维

基于 GitLab CI 和阿里云 k8s 的持续交付解决方案

2020年12月27日

今年对于我个人而言,在 DevOps 上的最大收获,莫过于摸索了这套基于 GitLab CI 和 k8s 的持续交付解决方案,其实原理都很简单,在我去年的方案里又做了改进,实现了基于 git tag 的触发方式,并且把原先的本地打包推镜像改为在 GitLab Runner 上打包推镜像。

这套解决方案大致流程是这样的:

  1. 推送代码,在代码中配置 gitlab-ci.yml
  2. 推送 tag,触发 GitLab Runner 编译 docker 镜像,并推送至阿里云镜像仓库
  3. 在阿里云 k8s 上基于镜像仓库创建应用,并创建重新部署的触发器,在镜像更新时触发该触发器

这样,以后每次推送新的 tag 上去,就可以实现自动打包&部署了。

下面,我来详细讲解下所有步骤。

配置 GitLab Runner

config.toml:
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "common-runner"
  url = "https://git.xxx.xxx"
  token = "TOKEN"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/xxx/gitlab-runner/cache:/cache"]
    shm_size = 0

其中 tokenGitLab Admin Area / Overview / Runners 中可以找到,或者也可以从 Project / Settings / CI/CD 中找到项目专用的 Runner token。

代码配置

前端(node)

Dockerfile:
FROM node:10-alpine

WORKDIR /app

COPY package.json /app
COPY yarn.lock /app
RUN yarn install
COPY . /app
RUN yarn build

EXPOSE 8888
ENV APP_ENV $APP_ENV
CMD ["yarn", "start"]
.gitlab-ci.yml
image: docker:latest

variables:
    REGISTRY: 'registry.cn-hangzhou.aliyuncs.com'
    USERNAME: 'your username'
    PASSWORD: 'your password'
    NAMESPACE: 'your namespace'
    PROJECT_NAME: 'your project name'

stages:
    - build

docker-build:
    stage: build
    image: docker:latest
    script:
        - docker login --username=$USERNAME $REGISTRY -p $PASSWORD
        - docker build -t $REGISTRY/$NAMESPACE/$PROJECT_NAME:$CI_COMMIT_REF_NAME -t $REGISTRY/$NAMESPACE/$PROJECT_NAME:latest .
        - docker push $REGISTRY/$NAMESPACE/$PROJECT_NAME:$CI_COMMIT_REF_NAME
        - docker push $REGISTRY/$NAMESPACE/$PROJECT_NAME:latest
    only:
        - tags

后端(spring boot)

Dockerfile
FROM openjdk:11-jre-slim

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

VOLUME /tmp

COPY target/xxx-api.jar app.jar
ENV SPRING_PROFILES_ACTIVE="prd"
ENV JAVA_OPTS="-Xmx256m"
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
.gitlab-ci.yml
image: docker:latest

variables:
  MAVEN_OPTS: '-Dmaven.repo.local=/cache/.m2/repository'
  REGISTRY: 'registry.cn-hangzhou.aliyuncs.com'
  USERNAME: 'your username'
  PASSWORD: 'your password'
  NAMESPACE: 'your namespace'
  PROJECT_NAME: 'your project name'

stages:
  - package
  - build

maven-package:
  image: maven:3.6-jdk-11-slim
  stage: package
  script:
    - mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true
    - cp target/$PROJECT_NAME.jar /cache/jars/
  only:
    - tags

docker-build:
  stage: build
  image: docker:latest
  script:
    - docker login --username=$USERNAME $REGISTRY -p $PASSWORD
    - mkdir target
    - cp /cache/jars/$PROJECT_NAME.jar target
    - docker build -t $REGISTRY/$NAMESPACE/$PROJECT_NAME:$CI_COMMIT_REF_NAME -t $REGISTRY/$NAMESPACE/$PROJECT_NAME:latest .
    - docker push $REGISTRY/$NAMESPACE/$PROJECT_NAME:$CI_COMMIT_REF_NAME
    - docker push $REGISTRY/$NAMESPACE/$PROJECT_NAME:latest
  only:
    - tags

阿里云 k8s 配置

应用创建触发器:

gitlab-ci-k8s-cd-01

复制触发器URL到镜像仓库中创建推送触发器:

gitlab-ci-k8s-cd-02

完成。

您已成功订阅 HADB.ME
真棒!下一步,完成结账以便解锁 HADB.ME
欢迎回来!您已登录成功。
登录失败,请重试。
操作成功!您的账户已全面激活,现在您有所有内容的权限了。
错误!Stripe 结账失败。
成功!您的账单信息已更新。
错误!账单信息更新失败。