发布于 2026-01-06 1 阅读
0

有没有一款免费的持续集成解决方案(使用 Docker-Compose)可以用于你的 GitLab 代码库?

有没有一款免费的持续集成解决方案(使用 Docker-Compose)可以用于你的 GitLab 代码库?

这篇文章最初发表在我的博客上。

如果你和我一样,用 GitHub 来托管公共仓库和组织拥有的私有仓库,而用 GitLab 来托管自己的私有仓库,那么你就会明白我的意思。GitLab 提供免费且无限制的私有仓库,完全能够满足需求。

在提交了很多代码之后,你决定每次创建合并请求(是的,合并请求。这里我们用的是 GitLab 的术语)时,最好能自动执行测试。

然后你觉得可以像管理 GitHub 代码库一样使用 CircleCI,尤其你还知道如何在 CircleCI 上使用 docker-compose。你登录 CircleCI 账号,进入集成页面,却发现GitLab 集成选项不见了。GitHub 和 Bitbucket 都有,但就是没有 GitLab。糟糕。你仍然可以在 CircleCI 的网站上为添加 GitLab 集成功能投票,但在他们做出改变之前,你只能束手无策。

你决定列出所有能与 GitLab 兼容并符合你预期的免费 CI 服务。然后你发现 GitLab 本身就提供 CI 服务。在阅读了网站上那些含糊不清的功能介绍之后GitLab 的广告语是:你们的产品确实不错,只是因为网站上的信息太模糊,我们没能充分体会到你们的 CI 服务有多棒。真是可惜),你开始琢磨,或许即使是使用社区版免费私有仓库的用户,他们也提供免费的 CI 服务。看起来每月有 2000 分钟的构建时间限制,这确实非常慷慨。我们今天的问题更具体一些:是否可以使用 docker-compose 构建整个堆栈并在 CI 中运行测试?答案是肯定的。

首先,文档(写得非常糟糕……)说你需要启用一些共享运行器,但我的情况是默认已经启用了,所以我猜你也不需要手动启用。接下来。

现在我们只需要.gitlab-ci.yml在项目根目录下创建一个文件。这方面的文档很齐全,但对于 docker-compose 的使用却鲜有提及。看来我们只需要把它安装成 Python 包(感谢 Stack Overflow!),然后就可以使用了。我们还需要用到一些不太常用的 image:docker 和 docker:dind 服务。好吧,如果可行,何乐而不为呢?

image: docker

services:
  - docker:dind

before_script:
  - apk add --no-cache py-pip
  - pip install docker-compose
  - docker-compose build
  - docker-compose up -d
  # here we can install our dependencies (composer, yarn…)

tests:
  script:
    # launch our tests
    - docker-compose exec php phpspec run --format pretty
    - docker-compose exec php phpunit
    - docker-compose exec php behat
Enter fullscreen mode Exit fullscreen mode

其实很简单。我只是在执行命令时遇到了一些交互式 TTY 的问题(这个问题我在本地和 CircleCI 上都没有遇到)docker-compose exec。可能是因为 pip 使用的版本引入了回归错误-T?我也不确定。总之,你可以通过给命令添加标签来解决这个问题。

image: docker

services:
  - docker:dind

before_script:
  - apk add --no-cache py-pip
  - pip install docker-compose
  - docker-compose build
  - docker-compose up -d
  - docker-compose exec -T php composer install

tests:
  script:
    - docker-compose exec -T php phpspec run --format pretty
    - docker-compose exec -T php phpunit
    - docker-compose exec -T php behat
Enter fullscreen mode Exit fullscreen mode

这样应该可以解决问题。希望对你有帮助。祝测试顺利。

更新:其实,我可能说得太快了……
我的网络出了问题。容器之间无法通信……也许我可以调整一下网络选项(network_mode?)。
如果有 Docker 专家在场,我非常希望得到一些帮助 :)

图片来自Paradasos (CC BY/NC)

文章来源:https://dev.to/einenlum/a-free-ci-using-docker-compose-for-your-gitlab-repositories-6po