drupal - DDEV 多站点设置与 Acquia pull

标签 drupal ddev acquia

我刚刚完成 DDEV 设置,并且通过手动运行 ddev import-db --target-db=[db-name] 实现多站点工作。它工作得很好,但我想弄清楚如何从 Acquia 获取数据库拉取,以便我可以指定要从中拉取的站点。

我有这个脚本,但有没有办法使用 DDEV 命令来做到这一点,会更干净一点?

首先我将 acquia.yaml 修改为:

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

但是,这仍然需要我们在运行此命令之前更改 acquia.yaml 文件中的站点和 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): %s\n' "$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

关于drupal - DDEV 多站点设置与 Acquia pull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68501566/

相关文章:

javascript - Vanilla JS 相当于 jQuery $.once()?

php - Acquia Dev Desktop 2 极慢

css - 提交按钮顶部的图像图标

facebook - 如何将我的 Facebook 评论发布到我的 Drupal 网站?

drupal - 允许非站点管理员通过管理员菜单访问清除缓存,Drupal 6

ssh - 当我尝试在 `ddev auth ssh` 之后在 DDEV web 容器中使用 ssh 时,ssh key 似乎不起作用, "too many authentication failures"

selenium - 在 DDEV 容器内使用 Behat Drupal Extension 运行 selenium 测试

ddev - 如何在 DDEV Web 容器中添加和使用 nvm?

drupal - Acquia Dev Desktop 安装后步骤出现问题