我们正在使用 Jenkins 为 drupal 网站进行 CI/CD。现在,我们需要运行 drush 命令,这些命令应仅在单个实例中运行。
为此,我们创建了 elastic beanstalk 配置脚本,其中参数 leader_only 为 true,但它在部署时仍在所有实例中运行 drush 命令,而不是在一个实例中运行。
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/drushcmd.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
. /opt/elasticbeanstalk/support/envvars
cd /usr/local/bin
sudo cp /usr/bin/composer.phar /usr/local/bin/composer
sudo ln -s /usr/local/bin/composer /usr/bin/composer
composer --version
git clone https://github.com/drush-ops/drush.git /usr/local/src/drush
cd /usr/local/src/drush
git checkout 7.0.0-alpha5
sudo ln -s /usr/local/src/drush/drush /usr/bin/drush
composer install
export DRUSH_PHP=/usr/bin/php7
drush --version
container_commands:
001customize:
command: "/opt/elasticbeanstalk/hooks/appdeploy/post/drushcmd.sh"
leader_only: true
ignoreErrors: true
答案1
很难直接说出发生了什么,但我相信发生的事情是,经过 2-3 次部署后,ELB 环境中的多个实例包含该文件,因为在部署过程中同一个实例没有被选为领导者。
您需要drushcmd.sh
在创建文件之前删除所有实例上的文件 - 您正在多个实例上创建该文件。
通过删除(无论是否存在)所有实例上的文件,您可以确保该文件仅存在于一个实例 - 领导者上。
container_commands:
001_delete_deployment_hook:
command: "rm -f /opt/elasticbeanstalk/hooks/appdeploy/post/drushcmd.sh"
ignoreErrors: true
002_create_deployment_hook:
command: "/opt/elasticbeanstalk/hooks/appdeploy/post/drushcmd.sh"
leader_only: true
ignoreErrors: true
注意如何001_delete_deployment_hook
确保leader_only
我们删除所有实例