使用Acquia pull进行DDEV多站点设置



我刚刚设置了DDEV,通过手动运行ddev import-db --target-db=[db-name]可以进行多站点工作。它工作得很好,但我想弄清楚如何从Acquia获得数据库提取,以便在我可以指定要提取的网站的地方工作。

我有这个脚本,但有没有一种方法可以用DDEV命令来做这件事,会更干净一点?

首先,我将默认值修改为:

environment_variables:
project_id: mysite.dev
uri: mysite.com
db_name: mysite_us
#uri: mysite.ca
#db_name: mysite_canada
#uri: mysite.co.uk
#db_name: mysite_unitedkingdom
# etc etc
db_pull_command:
command: |
# set -x   # You can enable bash debugging output by uncommenting
ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
pushd /var/www/html/.ddev/.downloads >/dev/null
acli remote:drush -n ${project_id} -- sql-dump --extra-dump=--no-tablespaces --uri=${uri}  >${db_name}.sql

然后我写了下面的脚本,我称之为:

./ddev-refresh-db.sh mysite_us mysite.com
#!/bin/bash
site="$1"
uri="$2"
ddev pull acquia
ddev import-db --target-db=${site} --src=.ddev/.downloads/${site}.sql
ddev drush --uri=${uri} cr

然而,这仍然需要我们在运行此命令之前更改默许.aml文件中的站点和URI。

有没有办法将变量传递给ddev pull acquia?还有一种方法可以模拟这个脚本使用真正的DDEV命令所做的事情?

以下是Acquia多站点拉取的更完整答案,拉取所有站点。从DDEV v1.18.0开始,ddev pull本身确实不够健壮,无法拉取多个站点,因为它假设一个数据库和一组文件。这适用于@kelly howard的答案https://stackoverflow.com/a/68553116/215713是不够的。(在她的例子中,她只拉了一个多站点,这对这种情况非常有效。)

但在这里,我们将把所有逻辑放在DDEV自定义命令中,并提取任何命名站点的所有数据库和文件,因此ddev acquiapull <sitename>

将此文件作为.ddev/commands/web/acquiapull放入项目中

#!/bin/bash
###
### This DDEV custom command pulls database and files from
### Acquia DEV environment in a Drupal multisite setup.
###
### Usage: `ddev acquiapull [ --skip-db ] [ --skip-files ] <site1> <site2>`
### Example: `ddev acquiapull subsite1`
###
### This assumes that each subsite has its own database (named for the site)
### and that each subsite has its own files in sites/<sitename>/files
###
### To use it, set up the needed ACQUIA_API_KEY and ACQUIA_API_SECRET
### in global or project config, just as described in
### https://ddev.readthedocs.io/en/stable/users/providers/acquia/
###
acquia_project_id=projectid.dev
tmpdir=/tmp  #inside web container
set -eu -o pipefail
function show_help() {
sed -n 's/^###//p' ${0}
}
while :; do
case ${1:-} in
-h | -? | --help)
show_help
exit
;;
-y|--yes)
SKIP_CONFIRMATION=true
;;
--skip-files)
SKIP_FILES=true
;;
--skip-db)
SKIP_DB=true
;;
--) # End of all options.
shift
break
;;
-?*)
printf 'WARN: Unknown option (ignored): %sn' "$1" >&2
;;
*) # Default case: No more options, so break out of the loop.
break ;;
esac
shift
done

# Map sitename to database name
function target_db_name() {
site_name=$1
echo $site_name
}
# Map sitename to files dir
function target_files_dir() {
site_name=$1
echo "sites/${site_name}/files"
}
# Get the files from upstream and load them.
function files_pull() {
set -x   # You can enable bash debugging output by uncommenting
set -eu -o pipefail
site_name=$1
files_dir=$(target_files_dir $1)
mkdir -p ${DDEV_DOCROOT}/${files_dir}/
echo "Using drush rsync to update files for ${site_name}..."
drush rsync --alias-path=~/.drush -q -y -r ${DDEV_DOCROOT} --verbose @${acquia_project_id}:${files_dir}/ ${DDEV_DOCROOT}/${files_dir}/
}
# Get the db from upstream and load it
function db_pull() {
set -x   # You can enable bash debugging output by uncommenting
set -eu -o pipefail
site_name=$1
target_db=$(target_db_name ${site_name})
rm -rf ${tmpdir}/*.sql ${tmpdir}/*.sql.gz
echo "Downloading ${site_name} database..."
acli pull:db -n --on-demand --no-import -- ${acquia_project_id} ${site_name}
mv ${tmpdir}/*.sql.gz ${tmpdir}/${site_name}.sql.gz
echo "Loading ${site_name} into database '${target_db}'..."
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS ${target_db}; GRANT ALL ON ${target_db}.* TO 'db'@'%'"
gunzip ${tmpdir}/${site_name}.sql.gz
mysql -uroot -proot ${target_db} <${tmpdir}/${site_name}.sql
drush -r root --uri=${site_name} cr
}
# Handle initial authentication via Acquia secrets and ssh
function authenticate() {
if [ -z "${ACQUIA_API_KEY:-}" ] || [ -z "${ACQUIA_API_SECRET:-}" ]; then echo "Please make sure you have set ACQUIA_API_KEY and ACQUIA_API_SECRET in your project or global config" && exit 1; fi
if ! command -v drush >/dev/null; then echo "Please make sure your project contains drush, ddev composer require drush/drush" && exit 1; fi
ssh-add -l >/dev/null || (echo "Please 'ddev auth ssh' before running this command." && exit 1)
acli auth:login -n --key="${ACQUIA_API_KEY}" --secret="${ACQUIA_API_SECRET}"
acli remote:aliases:download -n >/dev/null
}
# Main script
authenticate || (printf "Failed to authenticate" && exit $?)
if [ $# -eq 0 ]; then
show_help
exit 1
fi
if [ "${SKIP_CONFIRMATION:-}" != "true" ]; then
echo "This will overwrite your database and files for sites $*. OK?"
select yn in "Yes" "No"; do
case $yn in
Yes ) break;;
No ) exit;;
esac
done
fi
for subsite in $*; do
echo "Pulling subsite: $subsite"
if [ "${SKIP_DB:-}" != "true" ]; then
db_pull ${subsite} || (printf "Failed to pull db for ${subsite}" && exit $?)
else
echo "Skipping db pull for ${subsite}"
fi
if [ "${SKIP_FILES:-}" != "true" ]; then
files_pull ${subsite} || (printf "Failed to pull files for ${subsite}" && exit $?)
else
echo "Skipping files pull for ${subsite}"
fi
done

感谢@rfay的指导,我在.ddev/providers中为每个国家/地区设置了一组文件。每一个都是这样的结构:

environment_variables:
uri: mysite.be
db_name: belgium
auth_command:
command: |
<no changes>
db_pull_command:
command: |
# set -x   # You can enable bash debugging output by uncommenting
ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
pushd /var/www/html/.ddev/.downloads >/dev/null
acli remote:drush -n ${ACQUIA_PROJECT_ID} -- sql-dump --extra-dump=--no-tablespaces --uri=${uri}  >${db_name}.sql

然后,我在.ddev/commands/host中创建了一个自定义命令,其中包含我的脚本内容。真实的剧本中有更多的案例覆盖所有国家。

#!/usr/bin/env bash
## Description: Refresh a database from Acquia and run post-db commands
## Usage: refresh-db [dbname]
## Example: "ddev refresh-db france"
site="$1"
case $site in
canada)
uri="mysite.ca"
;;
australia)
uri="mysite.com.au"
;;
belgium)
uri="mysite.be"
;;
brazil)
uri="mysite.com.br"
;;
*)
site="db"
uri="mysite.com"
;;
esac
ddev pull ${site} -y 2>/dev/null # suppress pull failed message since it really didn't
ddev import-db --target-db=${site} --src=${DDEV_APPROOT}/.ddev/.downloads/${site}.sql
ddev drush --uri=${uri} cr
ddev drush --uri=${uri} -y pmu simplesamlphp_auth
ddev drush --uri=${uri} -y config-set system.performance css.preprocess 0
ddev drush --uri=${uri} -y config-set system.performance js.preprocess 0

我试图按照建议在db_pull_command期间处理数据库导入,但我无法通过数据库权限错误来导入尚未使用ddev导入数据库导入的数据库。然而,使用自定义命令,我还可以合并后数据库导入步骤,如果通过config.yaml.完成,这些步骤通常只针对默认数据库运行

我做的另一个更改是将项目ID移动到global_config.yaml文件中的web环境设置中。这样,如果我们想更改要从中提取的环境,我们只需在那里编辑项目ID,而不必编辑提供程序文件。

我没有为开源项目做出贡献的经验,但如果这对其他人有帮助,我很乐意与某人合作,在文档上或文档所属的任何地方进行拉取请求。

我将继续进行一般的回答,但当您解决了这个问题时,您可以添加一个完整的答案。(我无法访问Acquia多站点。)

你走在了正确的轨道上,但你可以在pull脚本中完成所有这些。您遇到的问题是ddev只假设一个数据库,而您有多个数据库。

以下是您无罪释放的策略

  1. 创建所有数据库。您可以使用mysql -e "CREATE DATABASE IF NOT EXISTS <dbname>;,使用多行或for循环
  2. 拉取所有数据库。您可以使用单独的acli行或使用for循环来完成此操作
  3. 使用mysql命令导入不是主数据库的数据库。mysql <dbname> < <dbname.sql同样,这可以是几行或一个for循环。(您也可以只导入主数据库,它将由ddev重新导入,如果它不太大,不会造成任何伤害。)

谢谢你提出的好问题,我希望你能在这里给出完整的答案。您的回答也可以纳入https://ddev.readthedocs.io/en/stable/users/providers/acquia/-你可以点击右上角的铅笔链接进行公关。

最新更新