如何使用 GitLab CI + Docker + Ansible 部署 Rails 应用程序?

How to deploy a Rails app with GitLab CI + Docker + Ansible?

我有一个托管的 GitLab,上面有一些 Ruby 在 Rails 项目上。我有一个 CI 脚本,它使用项目构建一个 Docker 图像并将其推送到 GitLab 注册表。最后,我需要将该映像部署到暂存服务器。

stages:
  - test
  - build
  - deploy

# ...

build_image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_DRIVER: overlay
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.host.com:4567
    - docker build -t gitlab.host.com:4567/group/app:$CI_BUILD_REF_NAME .
    - docker push gitlab.host.com:4567/group/app:$CI_BUILD_REF_NAME
  only:
    - master

我想用 Ansible 来做,但不知道该怎么做。也许有人可以推荐寻找什么或阅读什么?谢谢

我建议不要在 CI 中使用 Ansible。这通常会使事情变得复杂,因为容器 运行 你的 CI 需要安装 Ansible 才能工作。但是这是可行的,我有这样的设置。另一个缺点是 Ansible 'eats' 输出,如果有错误,将以未格式化的方式打印它。
如果您的意图不是在 CI 中使用 Ansible 而是自己使用 Ansible 部署它,我也必须反对这样做。这将导致所有想要更新登台服务器的人与您联系,或者他们需要访问登台服务器和 ansible 剧本。他们还会问自己最后一次更新是什么时候。

最好将您的代码放在不同的步骤中,即执行 ssh 到机器中、拉取图像、停止前一个并启动新的。你甚至可以在 Gitlab 中定义一个 'staging' 环境,它会在最后一次更新完成时通知你。这对其他开发人员来说很方便。
您可以将 ssh 私钥放入 Gitlab 秘密变量中,并将其放入 ~/.ssh/id_rsa 作为第一个部署步骤。然后,这将使您可以访问登台机。你应该调用他的用户 'gitlab-staging' 或类似的东西,这样你就可以跟踪主机上的访问日志回到这个配置。

希望对您有所帮助,如果您有任何问题,请告诉我。