我正在使用 CI/CD 服务器(自托管 Woodpecker)来管理我的应用程序。管道运行所有这些步骤:克隆、构建、测试、打包为容器、推送到容器注册表(自托管 Gitea)。
但是缺少最后一步:“部署”。我不想通过 ssh 进入应用程序服务器(自我管理的 Debian VPS)并手动重新部署 - 我想自动拉取最新的 Docker 映像并重新部署应用程序。我希望这是管道的最后一步。
我可以创建一个管道步骤,使用 ssh 在应用程序服务器上运行脚本。但这感觉有点肮脏 - 在使用 CI/CD 之前,我通过脚本完成了所有事情,但我现在想以现代方式做事。
我不是 CI/CD 专家,所以我不知道这通常是如何完成的?
(我运行的是普通的 Docker 环境,不是 Kubernetes。)
考虑到您没有使用 Kubernetes 这样的编排系统,适合您情况的常见方法是使用 Webhook 触发器,告诉您的服务器在新的 Docker 映像推送到容器注册表时进行更新。
这个过程可以如下进行:
创建一个简单的应用程序来侦听服务器上的 Webhook。该应用程序应执行以下操作:
配置您的容器注册表,以便在推送新映像时将 Webhook 发送到此应用程序。
在实施方面:
docker-compose down && docker-compose pull && docker-compose up -d
一样简单。这种方法可以保持 CI/CD 管道清洁,并且不需要通过 SSH 连接到服务器。请记住保护您的侦听器应用程序,因为它将有能力关闭和备份您的应用程序。 Webhooks 的身份验证是必须的。
我修改的另外一些方法:
可以创建一个管道步骤,使用 ssh 登录应用程序服务器并运行“部署脚本”。结果将由管道步骤捕获,以便它成为输出日志的一部分。
或者应用程序服务器上的脚本或 cron 作业,轮询 docker 注册表(例如每分钟)以获取新映像,然后重新部署。这将 CI/CD 和应用程序服务器解耦。我认为这更干净,但问题是在重新部署之前总是有一分钟的延迟。
或者是应用服务器上一个单独的 webhook 监听“app”,它从容器注册表中监听特定的 webhook,然后运行脚本。现有的工具可以实现这一点,因此无需编写工具 - 只需编写部署脚本本身即可。似乎最流行的工具是 webhook 和 webhookd。
或者可以使用 watchtower,它接收一个 webhook 然后升级特定容器的镜像。