imaginationmedia/deployer-magento2

使用deployer.org部署Magento 2网站

1.0.24 2022-11-21 16:16 UTC

This package is auto-updated.

Last update: 2024-09-21 20:18:06 UTC


README

带有自动化步骤和可扩展功能的Magento 2代码部署工具。

如何安装

首先您需要安装 Deployer

curl -LO https://deployer.org/releases/v6.6.0/deployer.phar && mv deployer.phar /usr/local/bin/dep && chmod +x /usr/local/bin/dep  

如何安装此 Magento 2 部署工具

composer require imaginationmedia/deployer-magento2  

如何使用

在app/etc/deployer中创建一个名为env.json的文件,并配置环境、仓库、项目名称等所有相关信息。

{
  "project": {
    "project_name": "Project Name",
    "repository_path": "git@bitbucket.org:project/repo.git",
    "git_tty" : false
  },
  "environments" : {
    "staging" : {
      "hostname" : "1.2.3.4",
      "user" : "deploy",
      "port" : "2223",
      "deploy_path" : "/home/path/to/server",
      "branch" : "staging",
      "is_production" : 0,
      "identity_file" : "~/.ssh/id_rsa",
      "languages" : "en_US",
      "php_path" : "/usr/bin/php",
      "composer_path" : "/usr/bin/composer",
      "keep_releases" : 3,
      "http_user" : "deploy",
      "slack_webhook" : "https://hooks.slack.com/services/hook/id",
      "additional_commands" : {
        "before_deploy" : [],
        "after_deploy" : [],
        "actions_before_symlink" : []
      },
      "shared_files" : [],
      "shared_dirs" : [],
      "writable_dirs" : [],
      "clear_paths" : [],
      "ignored_steps" : [],
      "composer_ignore_requirements" : false,
      "themes" : "",
      "symlink_fullpath" : false
    },
    "production" : {
      "hostname" : "1.2.3.4",
      "user" : "deploy",
      "port" : "2223",
      "deploy_path" : "/home/path/to/server",
      "branch" : "staging",
      "is_production" : 1,
      "identity_file" : "~/.ssh/id_rsa",
      "languages" : "en_US",
      "php_path" : "/usr/bin/php",
      "composer_path" : "/usr/bin/composer",
      "keep_releases" : 3,
      "http_user" : "deploy",
      "slack_webhook" : "https://hooks.slack.com/services/hook/id",
      "additional_commands" : {
        "before_deploy" : [],
        "after_deploy" : [],
        "actions_before_symlink" : []
      },
      "shared_files" : [],
      "shared_dirs" : [],
      "writable_dirs" : [],
      "clear_paths" : [],
      "themes" : "",
      symlink_fullpath: false
    }
  }
}

在此配置文件中,您有两个部分;项目和环境。

在项目部分,我们设置

  • project_name: 项目名称
  • repository_path: 仓库的git路径
  • git_tty:git clone命令分配TTY。默认为false。这允许您为密钥输入密码或将主机添加到known_hosts

在环境部分,我们将设置我们可以部署的每个环境。对于每个环境,您可以设置

  • hostname: 主机IP地址。
  • user: 我们将要使用的用于部署的用户。
  • port: 使用ssh用户访问的端口号。
  • deploy_path: 我们部署工具将要使用的路径以创建发布文件夹、当前符号链接和所有必需的目录/文件。
  • branch: 我们将要部署的分支。
  • is_production: 一个标志,我们设置是否使用生产模式或开发模式。如果我们设置为生产模式,将执行额外的命令(部署静态内容并编译代码)
  • identity_file: 服务器上的路径,其中deployer将获取允许访问我们的git仓库(商店仓库)的ssh密钥。
  • languages: 设置您的Magento商店中可用的语言(对于多语言商店)。您可以设置所有语言,例如:en_US、pt_BR、it_IT。
  • php_path: 将用于运行所有Magento cli命令的已安装PHP的路径。
  • composer_path: 已安装composer的路径。
  • keep_release: 设置环境中将保留多少个发布版本。
  • http_user: 在我们的部署过程中有一个步骤,我们将设置所有共享文件和目录的所有者。此http_user设置允许我们设置将拥有这些文件/目录的主机用户。
  • slack_webhook: 如果您需要通知Slack频道关于部署,可以在此处设置用于发送这些通知的Slack webhook URL。
  • additional_commands: 这是一个配置,我们可以定义两个值;before_deploy和after_deploy。它在设置在部署开始/完成后需要运行的额外命令时非常有用。例如,如果您需要在部署完成后重新启动Apache,您可以在after_deploy值中添加命令。
    • before_deploy: 我们可以设置在开始部署过程之前将在服务器上执行的命令。
    • after_deploy: 我们可以设置在部署完成后将在服务器上执行的命令。
    • before_symlink_change: 我们可以设置在更改符号链接之前将执行的命令。
  • shared_files: 在此处我们设置必须创建符号链接的共享文件。默认情况下,我们为以下文件创建符号链接:app/etc/env.php和var/.maintenance.ip。任何添加到此配置的新路径将与默认值合并。
  • 共享目录:在这里我们设置需要创建符号链接的共享目录。默认情况下,我们将为以下目录创建符号链接:'var/composer_home', 'var/log', 'var/cache', 'var/export', 'var/report', 'var/import_history', 'var/session', 'var/importexport', 'var/backups', 'var/tmp', 'pub/sitemaps', 'pub/media', 'pub/static'。任何添加到此配置的新路径将与默认值合并。
  • 可写目录:在这里我们设置我们将更改所有者和将其设置为可写的目录。默认情况下,这些目录是:'var', 'pub/static', 'pub/media', 'generation'。任何添加到此配置的新路径将与默认值合并。
  • 清理路径:我们在此配置中设置将在每次部署后清理的目录。默认情况下,它们是 'pub/static', 'var/cache', 'var/page_cache', 'var/view_preprocessed', 'generated'。任何添加到此配置的新路径将与默认值合并。
  • slack_text:您可以使用此设置设置用于通知Slack新部署的消息。默认情况下是“注意!用户 {{user}} 正在将分支 {{branch}} 部署到 {{target}} 环境。”
  • slack_success_text:您可以使用此设置设置用于通知Slack成功部署的消息。默认情况下是“{{target}} 部署成功,没有任何错误。”
  • slack_failure_text:您可以使用此设置设置用于通知Slack失败部署的消息。
  • composer_ignore_requirements:如果您需要在composer安装过程中忽略平台要求,则可以设置此布尔标志。
  • 主题:在此设置中,您可以设置希望部署的主题。所有其他主题都将被忽略。
  • symlink_fullpath:此选项将为文件和目录创建所有符号链接,使用完整路径。如果此选项设置为false,则路径将是 ../../shared/var/log (相对路径),如果此选项设置为true,则将是 /srv/user/shared/var/log (完整路径)

您不需要将此文件保留在您的仓库中,但您需要它才能从您的机器运行部署命令(我们将展示如何做)。

Deployer将在服务器上创建此结构

Deployer directory structure

.dep 是deployer用于管理deployer版本和所有最近更改的文件夹。

releases 是我们部署所有新版本的文件夹。它保持我们在 keep_release 设置中定义的版本数量。

Deployer releases

shared 是我们存储所有共享文件和目录的文件夹,我们将为当前版本创建符号链接。例如pub/media目录。

Deployer shared

current 是指向最新版本的符号链接。我们的服务器webroot应指向此 symlink/pub。因此webroot将是 current/pub

手动部署 & dep命令

如果您想手动运行命令,您必须使用composer安装deployer工具,或者下载包并将其解压缩到名为 deployment 的目录中。

现在您能够从仓库中克隆git代码,我们可以使用 dep命令 来部署它。

在您的本地项目中,您必须访问deployer工具目录(如果手动安装为deployment,如果通过composer安装为vendor/imaginationmedia/deployer-magento2)。

您可以运行以下命令

  • dep deploy environmentName - 它将部署一个环境。例如 dep deploy staging。您也可以指定详细 (-v, -vv, -vvv) 以显示所有日志。
  • dep deploy:unlock environmentName - 如果它被锁定,则将解锁此环境的部署过程。每次我们运行新的部署时,我们的工具都会锁定环境,以避免同时进行多个部署。如果部署失败,它将保持锁定。因此我们需要运行此命令来解锁。例如 dep deploy:unlock environmentName
  • dep rollback environmentName - 如果新版本出现任何错误,我们可以使用此命令快速切换回上一个版本。例如:dep rollback staging。
  • dep ssh environmentName - 您可以使用此命令访问ssh。例如:dep ssh staging。

请记住,您需要在本地拥有app/etc/deployer/env.json才能运行这些命令。

使用BitBucket Pipelines的CI/CD

Bitbucket Pipelines是一个强大的工具,可以用于自动化部署。假设您有2个分支,即staging和master。staging用于将代码部署到测试环境,而master用于将最终代码部署到生产环境。我们可以使用Bitbucket pipelines在每次将新提交推送到这些分支时自动部署代码到这些环境。

我们还创建了一个可用于自动化这些部署的docker镜像。我们的docker镜像可在DockerHub找到。

为了开始设置Bitbucket pipelines以自动化部署,您需要在您的仓库中创建一个名为bitbucket-pipelines.yml的文件,并可以添加以下内容

image: igorimaginemage/php71
pipelines:
  branches:
    master:
      - step:
          name: Deploy Production
          deployment: production
          size: 2x
          caches:
            - composer
          script:
            - cp /opt/atlassian/pipelines/agent/data/id_rsa /root/.ssh/id_rsa
            - curl -LO https://github.com/Imagination-Media/magento2-deployer/raw/master/deployer/releases/6.6.0/dep && mv dep /usr/local/bin/dep && chmod +x /usr/local/bin/dep
            - mkdir -p app/etc/deployer
            - sh -c 'echo "$DEPLOYER_ENV" >> app/etc/deployer/env.json'
            - git clone https://github.com/deployphp/distribution.git vendor/deployer/dist
            - git clone https://github.com/deployphp/recipes.git vendor/deployer/recipes
            - git clone https://github.com/Imagination-Media/magento2-deployer.git vendor/imaginationmedia/deployer-magento2
            - deployerUser=$(git log master -1 --pretty=format:'%an') && git config user.name "$deployerUser"
            - cd vendor/imaginationmedia/deployer-magento2/ && dep deploy production -vvv
    staging:
      - step:
          name: Deploy Staging Environment
          deployment: staging
          caches:
            - composer
          script:
            - cp /opt/atlassian/pipelines/agent/data/id_rsa /root/.ssh/id_rsa
            - curl -LO https://github.com/Imagination-Media/magento2-deployer/raw/master/deployer/releases/6.6.0/dep && mv dep /usr/local/bin/dep && chmod +x /usr/local/bin/dep
            - mkdir -p app/etc/deployer
            - sh -c 'echo "$DEPLOYER_ENV" >> app/etc/deployer/env.json'
            - git clone https://github.com/deployphp/distribution.git vendor/deployer/dist
            - git clone https://github.com/deployphp/recipes.git vendor/deployer/recipes
            - git clone https://github.com/Imagination-Media/magento2-deployer.git vendor/imaginationmedia/deployer-magento2
            - deployerUser=$(git log staging -1 --pretty=format:'%an') && git config user.name "$deployerUser"
            - cd vendor/imaginationmedia/deployer-magento2/ && dep deploy staging -vvv

如你所见,它使用我们的docker镜像构建云机器,然后基本上将我们的部署工具克隆到这台远程机器上并执行dep deploy命令。

我们监视两个分支,它们是master和staging。在每个分支上,我们运行适当的部署命令(对于staging运行dep deploy staging,对于生产运行dep deploy production)。

如果您的服务器通过IP地址限制ssh访问,您还需要将bitbucket cloud ips列入白名单。它们是:34.199.54.113/32, 34.232.25.90/32, 34.232.119.183/32, 34.236.25.177/32, 35.171.175.212/32, 52.54.90.98/32, 52.202.195.162/32, 52.203.14.55/32, 52.204.96.37/32, 34.218.156.209/32, 34.218.168.212/32, 52.41.219.63/32, 35.155.178.254/32, 35.160.177.10/32, 34.216.18.129/32

现在您需要设置Bitbucket pipelines仓库变量。要这样做,请转到设置 > 管道 > 仓库变量。这里我们需要的唯一变量将是一个名为DEPLOYER_ENV的变量。如果您检查我们的bitbucket-pipelines.yml文件,您将看到我们正在创建app/etc/deployer/env.json,并用系统变量,即我们的DEPLOYER_ENV变量的内容填充它。因此,让我们创建这个变量,并将我们的app/etc/deployer/env.json文件的内容粘贴进去。

Bitbucket Pipelines env variables

最后但同样重要的是,Bitbucket pipelines将ssh进入您的服务器,因此,它必须无密码认证?这意味着什么?我们需要为bitbucket pipelines创建一个ssh密钥。这很简单,转到设置 > 管道 > SSH密钥,然后生成一个新的密钥对。然后将在您的服务器上列出公钥,您就可以开始了。

Bitbucket Key Pair Generation

现在您已准备好使用Bitbucket pipelines运行自动化部署了!

Bitbucket Pipelines deployment

推荐的主机解决方案

我们已经与不同的主机提供商测试了此部署解决方案,但这里是我们偏好的合作伙伴,在这些合作伙伴处流程运行得更好。

JetRails Logo

JetRails为Magento提供的主机服务专注于关键任务主机的五个支柱:速度、安全性、支持、可扩展性和稳定性。他们的平台持续集成最新进展,以确保最佳的主机体验。

网站

在Jetrails上设置deployer

您基本上需要遵循上面描述的所有步骤,并在before_symlink_change配置中提供以下这三行

"before_symlink_change" : [  
  "cd {{release_path}} && find ./ -type f -exec chmod -c 664 {} +",  
  "cd {{release_path}} && find ./ -type d -exec chmod -c 775 {} +",  
  "{{php}} bin/magento cache:flush"  
]

如果您想使用Bitbucket pipelines进行CI/CD,还需要打开一个支持工单,请求在您的服务器上列出Bitbucket Pipelines ips。

定时任务配置

在JR上,我们需要禁用cron作业,并在每次新部署后重新启动它们,以避免重复的cron作业或运行在错误代码版本上的作业。我们无法像在AWS或MageMojo上那样停止和启动cron服务。因此,为了做到这一点,您首先需要在新的部署之前清理crontab。在before_deploy步骤中,您需要添加"crontab -r"命令,这将完全清除crontab。

"before_deploy":[
  "crontab -r"
]

然后,在after_deploy步骤中,您需要添加Magento的cron:install命令。这个命令会为您设置Magento的crontab。

"after_deploy":[  
  "/usr/bin/php7.4 /home/jetrails/mystore.com/html/bin/magento cron:install"  
]

它将在crontab中添加一些内容,如下所示

#~ MAGENTO START aasasasasa4s5a4s5a4s5a4s5187281728121212
* * * * * /usr/bin/php7.4 /home/jetrails/mystore.com/releases/20201228142353/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /home/jetrails/mystore.com/releases/20201228142353/var/log/magento.cron.log
#~ MAGENTO END aasasasasa4s5a4s5a4s5a4s5187281728121212

如果您需要将任何其他自定义cron作业添加到crontab中,您也可以在after_deploy步骤中添加它。例如

"after_deploy":[  
  "/usr/bin/php7.4 /home/jetrails/mystore.com/html/bin/magento cron:install",
  "(crontab -l ; echo "#my command")| crontab -" 
],

my command是您想要添加到crontab中的行。

此外,请勿在预发布环境中启用cron,否则它们将在每次我们将部署到预发布环境时丢弃生产配置。仅在需要测试时手动在预发布环境中启用CRON。不要将其添加到部署脚本中。

在新的生产部署之后,请确保检查cron_schedule表,以查看是否有任何cron作业在部署过程中卡住。

在这个过程中,您应该没有任何停机时间。

MageMojo Stratus Logo

MageMojo Stratus创建了一个独特的托管产品,专门针对优化后的Magento托管。

十年后,MageMojo仍在增长。通过提供无与伦比的最高水平的Magento性能,MageMojo以其行业唯一的15分钟支持服务等级协议,在细分市场中确立了领先地位。

网站

在MageMojo Stratus上设置部署器

您基本上需要遵循上述所有步骤,并且您的app/etc/deployer/env.json配置中的symlink_fullpath选项必须为true(https://magemojo.com/kb/stratus-best-practices/using-symlinks/)。

您还需要在before_deploy步骤中添加在新的部署之前执行的MM Stratus清除缓存命令。

"before_deploy": [
  "/usr/share/stratus/cli cache.all.clear"
]

首先,在您开始新的部署之前,您必须停止Magento cron,以避免cron作业在部署过程中卡住。您可以在MM Stratus面板上这样做。

MM Stratus Cron

然后您可以开始部署。

如果您启用了自动扩展选项,一旦部署完成,您必须重新初始化自动扩展。您也可以在MM stratus面板上这样做。

MM Stratus Auto scaling

这是店铺唯一需要关闭几秒钟的时间,因为服务器正在重启。

然后,一旦您的店铺恢复,您需要再次启用cron。

在接下来的几小时内,请持续检查cron_schedule表中是否有任何cron作业卡住。

要使用Bitbucket管道进行CI/CD,您还需要在MM Stratus面板上对Bitbucket Cloud ip进行白名单。