将代码直接部署到docker容器。 或者如何在每次提交后不拖延

任务来了WEB-12982
在存储库中创建一个web-12982分支
分支进行时,阅读tz并喝咖啡
直接进行开发

git commit,git push
分支重新组装时
git commit,git push
重建分支时,翻转Twitter
git commit,git push
...
您将提交50个提交的评论分支

您了解50次提交恰好是50分钟的纯时间,因为它是适当的并开始收集,因为1分钟的间隔太短了,无法进行拖延和基本需求以外的任何事情。


情况熟悉吗? 在我公司,开发基础结构的组织如下:


  • Hitlab有许多项目存储库
  • 为确保在创建新分支时易于开发,码头工人会自动在唯一的地址(具有所有必要环境的父分支的完整副本)上创建自己的沙箱。
  • 您所需的一切都已准备就绪-只需编写代码并在每次提交后测试并查看结果,这非常方便!

但是,慢慢地...如果这种情况很接近您,欢迎您的光临。



问题的实质


tldr:对代码所做的更改要求重新组装容器并花费时间(一分钟以上,这取决于项目,尤其是如果配置了CI \ CD的话),这实际上并没有用处,但是完全占用了程序员的工作时间。

类似的问题定期出现在所有

例如,很明显地,为前端发明了相同的liveReload


我之前曾发表过一篇与相关主题有关的文章 ,但与调试过程有关(顺便说一句,感谢您的翔实评论和积极反馈)。 但是,关于剪切的问题基本上没有消失,我们还继续等待直到分支重新组装为止。


即使跳过了其他阶段,仅保留了build-dev和deploy-dev,等待时间对于任何有用的操作来说都是微不足道的,但对于总花费的时间来说却是相当可观的,尤其是对于CI \ CD,例如来自Gitlab的情况。


当然,如果程序员具有相对强大的计算机,配置了gitlab-runner,配置了与远程服务器上相同的环境,并且将相应的标签添加到gitlab-ci.yml中,则可以通过本地组装项目来加快该过程。在ctrl + s键之后,构建速度将与自动FTP代码部署相同。


特别是 烫伤 当您在开发过程中犯下通常不会影响应用程序操作的错别字/错误时,这很累人,但是不能像这样留下错误,并且只有在组装后查看结果时才会注意到它们。


需要什么和解决方案选项


tldr:找到一种方法,以尽可能简单,快速地查看编辑结果。 为了不每次都提交并且不等待重建分支。 我从本地计算机选择rsync到与容器文件夹一起安装的远程服务器文件夹。

我没有在Internet上找到完整的解决方案,但实际上有几种选择:


  • 使用代码库直接在容器中配置ftp \ ssh,将其包含在映像中,通过FTP直接连接到容器本身
    • 就我个人而言,这种选择似乎有点复杂,而且过于“拐杖”,尽管这里所有的选择都是拐杖。
  • (供本地使用)使用docker cp将代码直接加载到容器中
    • 该选项不适用于远程服务器。
    • docker cp的功能极为有限,因为不应每次都复制供应商文件夹,并且复制算法本身也会很慢。
  • (供远程\本地使用)将所需的容器文件夹安装到外部主机文件夹。 将本地文件直接下载到已安装的主机文件夹中。 已经有很多实现选项:
    • 使用docker-machine特别是docker-machine scp
      • 同样,您需要配置环境,配置docker-machine,也许这在您经常使用其他服务器时是有意义的
    • 在IDE中,使用所需的主机文件夹配置FTP连接
      • 每个新分支都需要创建一个新连接或更改映射
    • 使用scp或rsync将文件上传到所需的主机文件夹,为此,请使用小的bash脚本并将其挂在热键上
      • 起初,它似乎不必要地复杂,但实际上并非如此。 该脚本本身尽可能简单,并且需要自动化该过程,因此您不必每次都重新配置映射

解决方案本身:rsync +卷


tldr:
  • 需要ssh访问远程服务器并在本地计算机上进行rsync
  • 远程服务器必须具有可写文件夹
  • 将容器中的项目文件夹安装到外部主机文件夹
  • 将一个小的bash脚本添加到项目的根目录,以与远程服务器同步文件
  • 配置用于执行同步脚本的热键

值得注意的是,提供的解决方案不包括在开发和测试环境中


在这种情况下,我将研究docker-compose和gitlab-ci环境,其中docker-compose使用gitlab-ci中的环境变量。


我们在gitlab-ci中形成目标文件夹的路径,并将此路径导出到docker-compose.yml:


before_script: - export SHARED_DIR_BASE='/var/www/builds' #    ,      - export SHARED_BRANCH_DIR=${SHARED_DIR_BASE}/${PROJECT_GROUP}/${PROJECT_NAME}/${CI_COMMIT_REF_NAME} #     web-123   my_group/my_project,      /var/shared/my_group/my_project/web-123 Deploy dev: stage: deploy_dev script: #   ,         - mkdir -p ${SHARED_BRANCH_DIR} - rsync -r --exclude-from=.gitignore --exclude-from=.dockerignore . ${SHARED_BRANCH_DIR} - find ${SHARED_BRANCH_DIR} -type d -exec setfacl -d -mo:rwx {} \; - find ${SHARED_BRANCH_DIR} -type d -exec setfacl -mo:rwx {} \; - find ${SHARED_BRANCH_DIR} -type f -exec setfacl -mo:rwx {} \; - envsubst < docker-compose.tmpl > docker-compose.yml #     gitlab-ci.yml  docker-compose.yml,   docker-compose.tmpl - docker-compose up -d 

接下来,我们需要将项目文件夹安装到docker-compose的外部主机文件夹中,因为我们在docker-compose中使用了变量,所以我们需要docker-compose.tmpl模板,在其中将使用这些变量。


 version: '2.3' services: web: ... volumes: - ${SHARED_BRANCH_DIR}:/app/:rw #             #        .    ,      ,           .              ,     ,        - /app/protected/vendor/ 

当前的配置已足够,现在,当您在主机服务器上构建分支时,将创建/ var / www / builds / GROUP_NAME / PROJECT_NAME / BRANCH_NAME文件夹,项目将被转移到那里,除了.gitignore和.dockerignore中指定的文件和文件夹之外,然后您可以简单地配置FTP映射,但是我们会做得更远,并使过程更加自动化。


实际上,要同步文件,我们需要运行以下命令:


 rsync -r -u \ --delete-after \ --exclude-from=.gitignore \ --exclude-from=.dockerignore \ . $sshUserName@$sshHost:$sharedBaseDir 

实际上,在中小型项目上,此命令的执行速度比您有时间提交并将编辑内容推送到存储库的速度快。 仍然需要使该脚本具有更完整的外观,并将其执行绑定到热键。


完整脚本代码:deploy.sh
 #!/usr/bin/env bash #    while [ -n "$1" ] do case "$1" in --sshUserName=*) sshUserName=${1#*=} ;; --sshHost=*) sshHost=${1#*=} ;; esac shift done #  shared    gitBranch=$(git branch | grep \* | cut -d ' ' -f2) gitProject=$(git config --local remote.origin.url|sed -n 's#.*/\([^.]*\)\.git#\1#p') gitGroup=$(git config --local remote.origin.url|sed -n 's#.*/\([^.]*\)/.*\.git#\1#p') sharedBaseDir=/var/www/builds/$gitGroup/$gitProject/$gitBranch #         rsync -r -u \ --delete-after \ --exclude-from=.gitignore \ --exclude-from=.dockerignore \ . $sshUserName@$sshHost:$sharedBaseDir echo "done" 

应该注意的是,该脚本必须位于存储库的项目文件夹的根目录中,或指示该脚本应在哪个目录中工作。


仅保留该脚本到特定热键的执行并设置参数sshUserName和sshHost(可以理解,已经可以通过ssh访问远程服务器)。 我将举一个PHPstorm的例子。


  • 转到文件->设置
  • 在左侧菜单的设置窗口中,展开工具 ,然后选择外部工具
  • 我们编写脚本的路径,并在参数中指定实际的sshUserName和sshHost

  • 接下来,转到Keymap并查找我们的外部工具的名称,设置必要的组合


仅此而已。 现在,当您单击所需的组合时,所有项目文件都将与远程文件夹同步,该远程文件夹随项目文件夹一起安装在容器内。 也就是说,任何更改都将几乎立即可见。


我并不假装此解决方案是“理想的”,可能有更好的选择,如果我在评论中了解到它们,我将很高兴。 谢谢你

Source: https://habr.com/ru/post/zh-CN439262/


All Articles