You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Drone CI部署Docker化Rails老应用(替代Capistrano)

解决方案:Drone CI 部署 Docker 化 Rails 应用到多环境

基于你的场景,完全可以用 Drone CI 配合 Docker 生态替代 Capistrano,无需自定义 Shell 脚本,以下是具体实现步骤:

1. 核心流程梳理

Drone CI 流水线分为两个核心阶段:

  • 构建 Docker 镜像并推送到自有镜像仓库
  • 根据代码分支触发对应环境(Staging/UAT/Production)的部署操作

2. 配置 Drone CI 镜像构建流水线

在项目根目录创建/修改 .drone.yml,首先定义镜像构建推送的基础流程:

kind: pipeline
type: docker
name: build-and-push-image

# 触发条件:仅指定分支提交时执行
trigger:
  branch:
    - develop
    - uat
    - master

steps:
  - name: build-push-image
    image: plugins/docker
    settings:
      # 替换为你的自有镜像仓库地址和应用名称
      repo: your-registry-domain/rails-app
      # 生成镜像标签:分支名+短commit哈希,同时保留分支名作为标签
      tags:
        - "${DRONE_BRANCH}-${DRONE_COMMIT_SHA:0:8}"
        - "${DRONE_BRANCH}"
      registry: your-registry-domain
      # 从Drone Secrets中读取镜像仓库的账号密码(避免硬编码)
      username:
        from_secret: docker_registry_username
      password:
        from_secret: docker_registry_password

3. 分环境部署流水线配置

为每个环境单独定义部署流水线,通过分支触发对应环境的部署操作:

3.1 Staging 环境部署

kind: pipeline
type: ssh
name: deploy-staging

trigger:
  branch:
    - develop

# Staging服务器连接信息(从Drone Secrets读取)
server:
  host:
    from_secret: staging_server_host
  user:
    from_secret: staging_server_user
  key:
    from_secret: staging_server_ssh_key # 推荐用SSH密钥认证,更安全

steps:
  - name: update-and-restart-app
    commands:
      # 拉取对应分支的镜像
      - docker pull your-registry-domain/rails-app:develop
      # 切换到服务器上的应用目录(提前配置好docker-compose.yml)
      - cd /opt/staging/rails-app
      # 重启服务
      - docker-compose down
      - docker-compose up -d

3.2 UAT 环境部署

kind: pipeline
type: ssh
name: deploy-uat

trigger:
  branch:
    - uat

server:
  host:
    from_secret: uat_server_host
  user:
    from_secret: uat_server_user
  key:
    from_secret: uat_server_ssh_key

steps:
  - name: update-and-restart-app
    commands:
      - docker pull your-registry-domain/rails-app:uat
      - cd /opt/uat/rails-app
      - docker-compose down
      - docker-compose up -d

3.3 Production 环境部署

生产环境建议增加触发限制(仅打Tag时部署),同时添加数据库迁移等必要步骤:

kind: pipeline
type: ssh
name: deploy-production

trigger:
  branch:
    - master
  # 可选:仅当打Git Tag时触发生产部署,更严谨
  event:
    - tag

server:
  host:
    from_secret: prod_server_host
  user:
    from_secret: prod_server_user
  key:
    from_secret: prod_server_ssh_key

steps:
  - name: backup-db # 生产环境建议先备份数据库
    commands:
      - cd /opt/prod/rails-app
      - docker-compose exec db pg_dump -U your-db-user your-db-name > backup-$(date +%Y%m%d%H%M).sql

  - name: update-and-restart-app
    commands:
      # 用Tag作为镜像标签,避免分支标签的不确定性
      - docker pull your-registry-domain/rails-app:${DRONE_TAG}
      - cd /opt/prod/rails-app
      - docker-compose down
      - docker-compose up -d
      # 执行数据库迁移(根据实际情况选择是否启用)
      - docker-compose exec app rails db:migrate

4. 移除 Capistrano 相关配置

完成 Drone 配置后,即可彻底移除 Capistrano:

  • 删除项目中的 config/deploy 目录、config/deploy.rb 文件
  • 从 Gemfile 中移除所有 Capistrano 相关依赖(如 capistrano-rails、capistrano-bundler 等)
  • 执行 bundle install 更新依赖

关键注意事项

  • 环境变量管理:不同环境的敏感配置(数据库连接、Rails密钥等),建议放在服务器的 .env 文件中,不要硬编码到 docker-compose.yml
  • 镜像标签策略:生产环境优先使用 Git Tag 作为镜像标签,避免分支标签的变动风险
  • Docker 权限:目标服务器的部署用户需要加入 docker 组,拥有执行 Docker 命令的权限
  • 健康检查:可以在 docker-compose.yml 中为 Rails 服务添加健康检查,确保部署成功后服务正常

内容的提问来源于stack exchange,提问作者Mr.Muhammad Ramzan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:45:25