RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1177952
Accepted
BigTows
BigTows
Asked:2020-09-14 15:46:11 +0000 UTC2020-09-14 15:46:11 +0000 UTC 2020-09-14 15:46:11 +0000 UTC

CD项目如何实施?

  • 772

大家好,我从来没有自动设置我的项目的布局,所以我请求帮助组织这一切。

有一个项目,采用 docker-compose 的微服务架构风格,一切都存储在 GitLab 上,存储库如下所示:

  • ServiceA——服务A,存放源代码+Dockerfile
  • ServiceB——服务B,存放源代码+Dockerfile
  • ServiceC——服务C,存放源代码+Dockerfile
  • git submodules应用程序 - 使用+列出服务 (ServiceA...C) 本身docker-compose.yml;

存储库中的所有docker-compose服务都在中声明(除了它们的“模块”之外,还列出了完成图像中的 docker 服务),因此,要运行应用程序,只需执行docker-compose up -d --build

有2个环境:

  • 暂存——验收环境,测试,无 ssh 访问
  • 生产 - prod,可以通过 ssh 访问(当然最好不要接触 ssh)

我想做以下事情:

  1. 当我 update master-branch, repositoryApplication时,更新会自动传递到 Staging 环境并更新应用程序。
  2. 在 Staging 环境中测试成功后,您可以单击кнопочку(确认发布)并将更改交付到 Production 环境(过程类似于 Staging 环境)。

现在是实际问题:)

如何组织这个过程? 也许由于缺乏经验,我错过了一些过程,但应该是。

docker
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    AfsmNGhr
    2020-09-15T02:41:46Z2020-09-15T02:41:46Z

    有一个项目,采用 docker-compose 的微服务架构风格,一切都存储在 GitLab 上,存储库如下所示:

    服务A - 服务A,存放源代码+Dockerfile

    首先,微服务可以单独部署是可取的。目前的描述中,配置只有在Application stack,不够灵活。如果Service A它改变,它需要改变Application。

    解决方案:

    • 您对基础设施 docker-compose.*.yml的描述(包括docker-compose.development.yml,我们使用docker-compose.override.yml,建立链接)
    • docker-compose 文件描述environment(直接在服务仓库中)
    • 您的测试、构建和推送到 docker 注册表或通过Application( .gitlab-ci.yml)
    • 减少服务的连接性
    • 通过外部网络进行通信

    没有 ssh
    访问 有 ssh 访问(当然最好不要碰 ssh)

    SSH 是一个很好的部署选项。最主要的是不是通过ssh手动进行的。

    应用程序栈

    我们在.gitlab-ci.ymlqa、集成测试、部署中描述为staging/ production。在这里,您可以放置​​脚本来自动化部署。

    让我们举个例子。我的 CD 实现的一些类似物Application。看services/example(模拟Service A)

    bash+用于自动化ansible。

    安可:

    • 软件服务器配置environment和机密(最小加密host_vars.yml)
    • 通过 ssh 部署(传输堆栈文件,然后将其删除)

    重击:

    • 服务、环境检查
    • 将 docker-compose.*.yml 合并到一个堆栈中(构建/部署)

    它看起来像什么:

    ./build example staging

    我们构建服务example并将其上传到注册表。请记住,此时需要资源。

    部署类似。

    ./deploy example staging
    

    在引擎盖下,我们有 ansible,我们将密码提供给他以vault获取秘密。您可以同时使用group_vars和host_vars。

    docker-compose.yml我们通过 ansible 将它带入相同的形式,ansible vars我们已经控制了变量(开发除外)。

    gitlab 示例

    image: afsmnghr/ansible-gitlab-runner:1.2.1
    
    variables:
      ...
    
    stages:
      - integration
      - production
    
    .ssh: &ssh |
      eval "$(ssh-agent -s)"
      echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
      mkdir -p ~/.ssh
      ssh-keyscan "$PROD_IP" >> ~/.ssh/known_hosts
    
    .ansible: &ansible |
      # WARNING: Ansible refuses to read from a world-writeable folder
      chmod -v 600 "$(pwd)"
      echo "$ANSIBLE_VAULT_PASSWORD" > .vault
    
    build:
      stage: integration
      before_script:
        - *ssh
        - *ansible
      script:
        - ./build example production
      after_script:
        - rm -f .vault
      only:
        - tags
      except:
        refs:
          - schedules
          - branches
          - develop
    
    deploy:
      stage: production
      before_script:
        - *ssh
        - *ansible
      script:
        - ./deploy example production
      after_script:
        - rm -f .vault
      only:
        - tags
      except:
        refs:
          - schedules
          - branches
          - develop
    

    我们将标签推送到 master(设置策略)。开始构建并部署到生产环境。如果可以用简单的命令描述基本的东西,那么一切都很容易实现。

    而不是一个结论

    主要问题和有什么帮助:

    • 自动化(ansible 剧本/角色)
    • 秘密管理(ansible 保险库、hashicorp 保险库)
    • 基础设施/服务器库存(ansible)
    • 每个环境的 IaC(许多 docker-compose 文件)
    • 2

相关问题

  • 在 Docker 容器中运行 Jenkins 时未安装插件

  • 是否可以从该容器内连接到 docker 容器

  • Docker 中的测试报告

  • 如何停止 podman 容器?

  • docker-compose 中的端口

  • 我可以在商业项目中使用 Docker CE 吗?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5