我对Gitlab CI完全陌生,但开始阅读文档。在实际构建它之前,我想检查是否按计划进行是个好主意:
我在Gitlab存储库中有一个docker-compose文件和几个Dockerfiles。 docker-compose文件由许多相互依赖的图像组成。我们有两个docker服务器,一个 prod服务器和一个 dev服务器。我们希望实现以下目标:
docker-compose down
) dev服务器上的容器 docker-compose up -d
)有什么方法可以反对这种方法吗?我目前面临的主要问题是,我不知道如何使用" /"参考"我现有的服务器。因此,我不想采用通常的方法(创建一个新的隔离的docker容器,测试软件并扔掉)但我想按照上面的描述进行操作。
感谢您的帮助!
在做了一些额外的研究之后,我觉得有必要添加一些东西:从我的理解,通常在CI / CD管道中调整Docker容器来测试你的应用程序。由于我实际上正在测试一堆容器/ docker-compose文件,它对docker主机系统有一定的要求,我需要在docker中使用docker之类的东西并在那里部署我的堆栈。但是,在第一阶段我想使用现有的docker服务器,因为我的" stack"需要进行调整才能从头开始动态创建。
容器对主机系统有要求的原因是我们在这种情况下使用Docker作为基础设施工具。因此,我们使用Docker容器而不是VM。结果是企业应用程序的完整环境,其中不同的服务(管理接口,存储库等)是单独的容器。
希望这会有所帮助。如果有什么不清楚,请问。
答案 0 :(得分:2)
您描述的设置非常典型,可用于运行集成测试,您可以使用或多或少的完整系统进行测试。 有不同的方法可以解决这个问题,但这是我的看法:
1)使用单独的GitLab CI构建服务器(gitlab-ci-runner)而不是开发服务器。它可以是任何类型:shell,docker等。通过这种方式,您可以将部署环境与构建服务器分开。
2)在CI管道中,在构建所有代码,单元测试等之后添加手动作业(https://docs.gitlab.com/ee/ci/yaml/README.html#when-manual)以启动对dev / staging服务器的集成测试
3)手动作业只需使用秘密变量(https://docs.gitlab.com/ee/ci/variables/README.html#secret-variables)中的凭证ssh到dev服务器。然后它会执行docker-compose down
,docker-compose pull
,docker-compose up
,假设最新的docker镜像已经在构建阶段构建并部署到私有docker注册表。
4)管道中的另一项工作开始测试
5)一旦测试完成,您可以拥有另一个阶段,该阶段仅手动触发或推送某个git标签,例如release/v*
(https://docs.gitlab.com/ee/ci/yaml/README.html#only-and-except-simplified)。在此作业中,您将ssh到prod服务器并再次执行docker-compose down
,docker-compose pull
,docker-compose up
,假设已经构建了版本的docker镜像。也就是说,您不在部署计算机上构建和标记docker镜像 - 只在那里运行容器。
要在构建服务器上构建docker镜像,可以使用shell executor,docker-in-docker或docker socket binding:https://docs.gitlab.com/ee/ci/docker/using_docker_build.html
shell方法是最简单的。
答案 1 :(得分:0)
我已经通过以下方式做到这一点:
1)gitlab运行程序,与主机上的docker连接
sudo gitlab-runner register -n \
--url https://gitlab.YOURSITE.com/ \
--registration-token YOUR_TOKEN \
--executor docker \
--description "runner #1" \
--docker-image "docker:stable" \
--docker-privileged \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /home/gitlab-runner/docker-cache \
最后两行带有卷,允许在两次启动之间共享缓存,并可以在gitlab运行器所在的同一服务器上启动容器
2)用于测试/集成
integration:
stage: integration
when: manual
script:
- docker-compose -p integration -f docker-compose.integration.yml down -v
- docker-compose -p integration -f docker-compose.integration.yml build --compress
- docker-compose -p integration -f docker-compose.integration.yml up -d
请注意,dovn -v
将删除卷,并使用up
使用默认数据重新创建它们
3)在生产中,我使用docker swarm / stack。它允许在与gitlabRunner服务器不同的服务器上启动容器
deploy-production:
when: manual
stage: production
script:
- docker login registry.MYSITE.com -u USER -p PASSWORD
- docker-compose -f docker-compose.release.yml build
- docker-compose -f docker-compose.release.yml push
- docker stack deploy preprod -c deploy/production/service.yml --with-registry-auth
由于我将图像存储在专用注册表中,因此我使用--with-registry-auth