迁移到Gitlab CI服务的记录

131 阅读2分钟

我们成为Gitlab的客户已经超过3年了,今天,作为一个巧合,我们庆祝了我们使用Gitlab CI的第一年

一开始,在Gitlab CI和Gitlab紧密集成之前,我们使用Jenkins集成来构建、测试和部署我们的代码,这很有效,但考虑到所有与Jenkins相关的维护任务,这很痛苦,但这是另一篇文章的故事。

我是Gitlab CI的超级粉丝,它与Gitlab的集成是惊人的,事实上,我们最近刚刚为我们的Gitlab运行程序启用了自动缩放选项,以加快我们的开发过程,到目前为止,一切都很愉快。

我在阅读该功能时发现,有一个选项可以使用Docker镜像进行测试和构建;有趣的是,我们已经用Docker Compose和一些使用Shell Executors的Gitlab Runners在做这件事。

Docker Images配置的有趣之处在于,它支持Gitlab称之为服务的东西,这与Docker Compose服务(有点)相似,但有一些例外和限制。

例如,有一个docker-compose.yml 文件,看起来像这样。

version: "2"
services:
  my_ruby_app:
    build:
      dockerfile: Dockerfile
      context: .
    image: mataleon_sp:$CI_BUILD_REF
    command: pwd
    environment:
      RAILS_ENV: test
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7.16
    ports:
      - 3306
    environment:
      MYSQL_ROOT_PASSWORD: ""
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - ${PWD}/sql/:/docker-entrypoint-initdb.d/

可以很容易地被翻译成这样,并集成到Gitlab CI中。

variables:
  RAILS_ENV: test
  MYSQL_ROOT_PASSWORD: ""
  MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
  CONTAINER_SHA_IMAGE: gitlab-registry.internal.company/namespace/fancy_project:$CI_BUILD_REF

services:
- name: mysql:5.7.16
  alias: mysql

stages:
- build
- test
- deploy

build_docker_image:
  stage: build
  script:
    - docker login -p $DOCKER_PASSWORD -u $DOCKER_USER gitlab-registry.internal.company
    - docker build -t $CONTAINER_SHA_IMAGE -f Dockerfile .
    - docker push $CONTAINER_SHA_IMAGE
    - docker rmi -f $CONTAINER_SHA_IMAGE
  tags:
    - regular
  except:
    - master

specs:
  image: "$CONTAINER_SHA_IMAGE"
  script:
    - ./bin/ci_specs.sh
  stage: test
  tags:
    - autoscale

lint:
  image: "$CONTAINER_SHA_IMAGE"
  script:
    - ./bin/ci_lint.sh
  stage: test
  tags:
    - autoscale

deploy:
  image: "$CONTAINER_SHA_IMAGE"
  script:
    - ./bin/ci_deploy.sh
  stage: deploy
  tags:
    - autoscale
  only:
    - master

在最终的.gitlab-ci.yml 文件中需要注意的重要部分是。

  • 对一些假设的脚本(如./bin/ci_lint.sh./bin/ci_deploy.sh )的调用,这些脚本恰好使用了先前在构建阶段构建的环境变量$CONTAINER_SHA_IMAGE 中定义的动态image
  • 其他两个环境变量MYSQL_ROOT_PASSWORDMYSQL_ALLOW_EMPTY_PASSWORD 现在是如何成为variables 部分的一部分,然后被 mysql 容器使用;以及
  • 使用两个不同的标签(autoscaleshared ),后者用于构建和推送docker镜像,然后被使用前一个标签的作业使用。

尽管services 支持一些扩展的Docker选项,但有一个选项(目前)不被支持:卷装载。所以我们的mysql 服务不能直接挂载以下内容。

volumes:
  - ${PWD}/sql/:/docker-entrypoint-initdb.d/

取代卷挂载的明显(也是最好的)方法是数据库迁移,因为最终发生在那个特定的MySQL容器和路径上的,是在容器被创建时执行一些任意的SQL脚本。

Gitlab CI很不错