imaginationmedia / deployer-magento2
使用deployer.org部署Magento 2网站
Requires
- php: >=7.1
- deployer/dist: ^6.0
- deployer/recipes: ^6.2
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将在服务器上创建此结构
.dep 是deployer用于管理deployer版本和所有最近更改的文件夹。
releases 是我们部署所有新版本的文件夹。它保持我们在 keep_release 设置中定义的版本数量。
shared 是我们存储所有共享文件和目录的文件夹,我们将为当前版本创建符号链接。例如pub/media目录。
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将ssh进入您的服务器,因此,它必须无密码认证?这意味着什么?我们需要为bitbucket pipelines创建一个ssh密钥。这很简单,转到设置 > 管道 > SSH密钥,然后生成一个新的密钥对。然后将在您的服务器上列出公钥,您就可以开始了。
现在您已准备好使用Bitbucket pipelines运行自动化部署了!
推荐的主机解决方案
我们已经与不同的主机提供商测试了此部署解决方案,但这里是我们偏好的合作伙伴,在这些合作伙伴处流程运行得更好。
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创建了一个独特的托管产品,专门针对优化后的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。
在接下来的几小时内,请持续检查cron_schedule表中是否有任何cron作业卡住。
要使用Bitbucket管道进行CI/CD,您还需要在MM Stratus面板上对Bitbucket Cloud ip进行白名单。