我们成为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_PASSWORD和MYSQL_ALLOW_EMPTY_PASSWORD现在是如何成为variables部分的一部分,然后被 mysql 容器使用;以及 - 使用两个不同的标签(
autoscale和shared),后者用于构建和推送docker镜像,然后被使用前一个标签的作业使用。
尽管services 支持一些扩展的Docker选项,但有一个选项(目前)不被支持:卷装载。所以我们的mysql 服务不能直接挂载以下内容。
volumes:
- ${PWD}/sql/:/docker-entrypoint-initdb.d/
取代卷挂载的明显(也是最好的)方法是数据库迁移,因为最终发生在那个特定的MySQL容器和路径上的,是在容器被创建时执行一些任意的SQL脚本。
Gitlab CI很不错。