RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 605602
Accepted
ForgottenPark
ForgottenPark
Asked:2020-12-20 15:27:50 +0000 UTC2020-12-20 15:27:50 +0000 UTC 2020-12-20 15:27:50 +0000 UTC

如何简化部署方案?

  • 772

这是我第一次在一个小团队中从事公司内部项目。我或多或少掌握了 git。现在我正在为部署而苦苦挣扎。要点是这样的:

我们使用标准分支方案(master、develop、topic)。在本地编程和排版。有一个战斗服务器。它也是一个 git 服务器。它也是一个测试服务器 :) 该服务器包含 2 个 Web 应用程序。第一个我们从 master 分支中拉取 - 发布已准备就绪,第二个 - 从开发中 - 我们在 master 拉取之前进行测试。

因此,为了在生产环境(或至少在测试环境)中老生常谈地发布对功能分支的微小更改,我必须克服以下常规:

  1. 从功能切换到开发,更新分支。
  2. 合并功能,推送开发
  3. 切换到master,更新它
  4. 合并开发,推送 master
  5. 连接到生产服务器以拉取开发应用程序
  6. 连接到生产服务器,拉取主应用程序
  7. ???
  8. “然后请更正这封信”
  9. 转到 1

有没有可能以某种方式简化一切?我确定我做错了什么。

git
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    KoVadim
    2020-12-20T16:51:14Z2020-12-20T16:51:14Z

    第 1-2 点是每个开发人员都执行的非常简化的过程(例如,删除了测试)。这是他的正常周期。

    第 3-4 项是发布。它不应该由普通开发人员完成。它由发布经理(或分配给它的负责人)完成。并不是每次打喷嚏都这样做,而是根据流程——每两周一次或每天两次。

    项目 5-8 通过按一个(最多两个按钮)或运行一个脚本来完成。它运行在一个特殊的构建服务器上(对于这样的小公司,它可以是一台用于构建、测试和存储库的机器)。构建脚本本身通常执行以下操作

    • git 克隆 / git 存档
    • 运行修复配置、模板的脚本(你不想向所有程序员显示产品数据库的密码?)
    • 运行处理 css、缩小 js 等的脚本。
    • 运行单元测试(它们在这里,因为最小化后可能会出现问题:))
    • 归档并将档案存储在安全的地方
    • 我们连接到产品服务器(服务器)并在那里上传档案。
    • 存档在服务器上解压到一个单独的文件夹中,nginx/apache 或符号链接配置被更正并且服务器重新启动。(当然,您可以停止服务器、删除文件并启动服务器,但如果出现问题...)。
    • 在产品上运行最少的测试(例如,主页返回 200 个代码,而不是 500 个)。
    • 并将带有发布链接的标签添加到 git。

    此脚本编写一次,然后根据需要进行修改。

    另外,应该补充这个脚本,以便它可以与 develop 分支一起工作。

    现在让我们让生活更轻松。我们将此脚本添加到 git 服务器上的钩子中,以便在 developer / master 推送时,它会自动启动,并因此部署到测试服务器 / prod。普通程序员禁止merge to master。

    现在一切看起来像这样。开发人员采用了一个功能,为它创建了一个分支,然后就完成了。在开发人员中合并后(或通过合并请求),其代码自动注入到测试环境中。如果突然间他弄坏了一切——他必须修理它。

    如果这不起作用,您可以在 CI 上运行脚本 - 最流行的脚本之一是 jenkins。因此,部署只需单击一下即可。

    问答

    • 为什么不直接在战斗服务器上射击?如果有人窃取了服务器,他们将可以访问完整的开发历史。有必要?
    • 没有人会从我这里窃取 git 的历史,所以我会开枪。已经发生
    • 为什么脚本如此复杂?想象一下,在半夜发现了一个 bug,急需修复。这种脚本的存在极大地简化了生活。
    • 也许没有测试?能够。但最好做一些最低限度。
    • 5
  2. Nick Volynkin
    2020-12-20T16:10:48Z2020-12-20T16:10:48Z

    让我们首先分离实体。参与过程:

    • 对战服务器。
    • 测试服务器。
    • 混帐服务器
    • 一些“部署代理”。现在你是手工部署(deploying),把这个任务委托给持续集成服务器(CI服务器)就好了。在最简单的版本中,这是通过 git 服务器上的钩子实现的。
    • 应用程序源代码
    • 应用程序分发 - 在您的例子中,这些是使用 Gulp 缩小的文件。

    目前,所有服务器的任务由一个执行,分发包与代码一起存储。尽管如此,让我们将它们视为独立的,并以它们之间的低耦合为目标(就像在类之间的 OOP 中一样)。这将为我们的系统提供灵活性和更大的可扩展性。特别是,我们不会依赖同一磁盘附近的某些东西或在本地网络上可用的事实。

    应该做什么:

    1. 将分发与代码分开。提交时,我们运行 gulp,获取缩小文件,(可选)将它们打包到存档中,将它们移动到服务器并部署到那里。您不需要存储缩小的代码,因为 我们总能从源头上得到它。
    2. 在代码中实施部署脚本。至少为在服务器上执行的操作提供一个位置:填写配置、重新启动服务等。如上所述,这是通过 git-hook 和/或 CI 服务器完成的。
    3. 自动对存储库中的更改做出反应:当推送到某些分支时,部署应该发生在某个环境中。由于我们的代码中现在有部署脚本,因此我们可以使用它。

    在工作安排上:

    1. 修改发布顺序。现在你似乎发布了每一个打字错误,任何人都可以发布。您还应该考虑保护 master 分支(包括您的粗心行为)。

    工作示例

    我建议对 GitLab.com 的示例进行实验(即我们将使用云服务)。选择是主观的,以下是论点:

    1. 可以创建免费的私有存储库。(即您的商业代码相对安全。)
    2. 该套件包括与存储库紧密集成的 GitLab CI。
    3. 免费的跑步者可用(包括私人存储库) - 有条件地,我们将在其上执行任务的虚拟机。

    反对意见:如果项目增长,总有一天免费许可证将不足以完成所有任务。

    GitLab.com 上发布了一个带有管道和日志的工作示例。

    描述正在执行的脚本的主文件位于项目的根文件夹中,名为.gitlab-ci.yml.

    image: alpine
    
    stages:
      - gulp
      - test
      - package
      - deploy
    
    cache:
      paths:
      - node_modules/
    
    gulp:
      stage: gulp
      image: node:latest
      before_script:
        - npm install
      script: node_modules/.bin/gulp compress
      artifacts:
        paths:
        - dist
        expire_in: 10 minutes
    
    test:
      stage: test
      script: ls dist
      script: echo 'run tests here'
    
    package:
      stage: package
      script: tar -czvf packaged.tar.gz dist
      artifacts:
        paths:
        - packaged.tar.gz
    
    deploy_prod:
      stage: deploy
      script: echo 'deploy on master'
      only:
        - master
    
    deploy_test:
      stage: deploy
      script: echo 'deploy on develop'
      only:
        - develop
    

    我们将把依赖项放在npm - package.json 的配置中。该文件gulpfile.js描述了compress提供最小化的任务。

    CI 管道窗口的屏幕截图:

    在此处输入图像描述

    工作的结果: archive packaged.tar.gz, in it dists/hello.js, in it

    !function(t,e,i){t.title="New title"}(window,document);
    
    • 3

相关问题

Sidebar

Stats

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

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +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
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +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