关于 scripting
scripting 是用于在 Shell 脚本和 CI/CD 工作流中自动执行 Acquia CLI(acli)命令的技能。内容涵盖非交互执行、认证、错误处理、重试和日志记录,以编程方式管理 Acquia Cloud 资源。
主要功能
- 01非交互式 acli 命令
- 02Shell 与 CI/CD 自动化
- 03API 密钥认证
- 04错误处理与重试模式
- 05日志记录与通知
适用场景
- 01定时执行 Acquia 部署
- 02在 CI/CD 流水线运行 acli
- 03清理多个环境的缓存
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ acquia/ acquia-skills --skill scripting安装后在 Claude Code 中输入/scripting确认已加载。
详细介绍
使用 Acquia CLI 编写脚本与自动化
适用于:
- 在 Shell 脚本中自动运行 acli 命令
- 将 acli 集成到 CI/CD 流水线中
- 以非交互方式运行 acli
在脚本、CI/CD 流水线和自动化工作流中使用 acli,以编程方式管理 Acquia Cloud 资源。
非交互式命令
所有 acli 命令都可以通过提供选项以非交互方式运行。这对于脚本和 CI/CD 至关重要。
基本模式
# Interactive - prompts for missing information
acli ide:create
# Non-interactive - provides all info upfront
acli ide:create \
--application=abc123 \
--label="Automated IDE"
常用选项
# No prompts - fails if info is missing
acli <command> --no-interaction
# Don't wait for async operations
acli <command> --no-wait
# Skip confirmations
acli <command> --yes
简单自动化示例
示例 1:按计划部署
#!/bin/bash
# deploy.sh - Deploy to staging nightly
BRANCH="develop"
ENVIRONMENT="staging"
ENV_ID="<environment-id>"
acli api:environments:code-switch $ENV_ID $BRANCH
# Verify Drupal status
acli remote:drush status
MEO(V3)订阅: 将
api:environments:code-switch行替换为acli api:v3:environments:create-deployment $ENV_ID true $BRANCH(参见 MEO Deployments)。同样,acli remote:drush cr也有由 API 驱动的对应命令acli api:v3:environments:clear-caches <environmentId> <domains>(参见 MEO Environments)。
通过 cron 运行:
# crontab -e
# Deploy every night at 2am
0 2 * * * /path/to/deploy.sh >> /tmp/deploy.log 2>&1
示例 2:清除缓存工作流
#!/bin/bash
# cache-clear.sh - Clear caches across environments
set -e # Exit on any error
acli remote:drush cr
echo "Caches cleared!"
CI/CD 集成
GitHub Actions
在推送到 main 时部署:
# .github/workflows/deploy.yml
name: Deploy to Acquia
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install acli
run: |
curl -fsSL https://github.com/acquia/cli/releases/latest/download/acli \
-o /usr/local/bin/acli
chmod +x /usr/local/bin/acli
- name: Authenticate
env:
ACQUIA_KEY: ${{ secrets.ACQUIA_KEY }}
ACQUIA_SECRET: ${{ secrets.ACQUIA_SECRET }}
run: |
mkdir -p ~/.acquia
cat > ~/.acquia/credentials.json <<EOF
{
"acquia-cloud-api": {
"key": "$ACQUIA_KEY",
"secret": "$ACQUIA_SECRET"
}
}
EOF
- name: Deploy to production
run: |
acli api:environments:code-switch ${{ vars.ACQUIA_PROD_ENV_ID }} main
GitLab CI/CD
# .gitlab-ci.yml
deploy_production:
stage: deploy
image: ubuntu:latest
before_script:
- curl -fsSL https://github.com/acquia/cli/releases/latest/download/acli \
-o /usr/local/bin/acli
- chmod +x /usr/local/bin/acli
- mkdir -p ~/.acquia
- |
cat > ~/.acquia/credentials.json <<EOF
{
"acquia-cloud-api": {
"key": "$ACQUIA_KEY",
"secret": "$ACQUIA_SECRET"
}
}
EOF
script:
- acli api:environments:code-switch $ACQUIA_PROD_ENV_ID $CI_COMMIT_BRANCH
only:
- main
错误处理
检查退出代码
#!/bin/bash
acli ide:create --application=abc123
if [ $? -eq 0 ]; then
echo "IDE created successfully"
else
echo "IDE creation failed"
exit 1
fi
妥善处理错误
#!/bin/bash
set -e # Exit on first error
trap 'echo "Error occurred on line $LINENO"' ERR
acli api:environments:code-switch $ENV_ID main
echo "Deploy successful!"
重试逻辑
#!/bin/bash
retry_count=0
max_retries=3
while [ $retry_count -lt $max_retries ]; do
if acli remote:drush updatedb; then
echo "Database updates completed"
exit 0
fi
retry_count=$((retry_count + 1))
if [ $retry_count -lt $max_retries ]; then
echo "Attempt $retry_count failed. Retrying..."
sleep 10
fi
done
echo "Failed after $max_retries attempts"
exit 1
日志记录与监控
记录输出
#!/bin/bash
LOGFILE="/var/log/acli-deploy.log"
{
echo "=== Deploy started at $(date) ==="
acli api:environments:code-switch $ENV_ID main
echo "=== Deploy finished at $(date) ==="
} >> $LOGFILE 2>&1
发送通知
#!/bin/bash
SLACK_WEBHOOK="$SLACK_WEBHOOK_URL"
send_slack() {
curl -X POST $SLACK_WEBHOOK \
-H 'Content-Type: application/json' \
-d "{
\"text\": \"Acquia deployment: $1\",
\"channel\": \"#deployments\"
}"
}
if acli api:environments:code-switch $ENV_ID main; then
send_slack "✓ Production deployment successful"
else
send_slack "✗ Production deployment failed"
exit 1
fi
进阶:API 密钥身份验证
在服务器上进行自动化时,请使用 API 密钥,而不是浏览器身份验证。
生成 API 凭据
在 Acquia Cloud UI 中:
- 前往 Settings → API Tokens
- 生成新令牌
- 复制 Key 和 Secret
配合 acli 使用
# Method 1: Environment variables
export ACQUIA_KEY="your-key-here"
export ACQUIA_SECRET="your-secret-here"
acli api:applications:list
# Method 2: Credentials file
mkdir -p ~/.acquia
cat > ~/.acquia/credentials.json <<EOF
{
"acquia-cloud-api": {
"key": "your-key-here",
"secret": "your-secret-here"
}
}
EOF
acli api:applications:list
安全管理凭据
# Option 1: AWS Secrets Manager
aws secretsmanager get-secret-value --secret-id acquia-cli-key
# Option 2: HashiCorp Vault
vault kv get secret/acquia/cli-key
# Option 3: GitHub Secrets (for Actions)
# Set ACQUIA_KEY and ACQUIA_SECRET as repository secrets
最佳实践
- 使用
--no-interaction— 在脚本中始终传入此选项,以防提示阻塞进程。 - 使用
set -e— 遇到任何错误时立即退出,以免失败后仍悄然继续运行。 - 安全存储凭据 — 使用环境变量或密钥管理器,切勿硬编码。
- 使用
app:task-wait— 执行异步操作后,等待其完成再进行下一步。
故障排除
CI 中身份验证失败
设置 ACLI_NO_INTERACTION 环境变量并显式提供凭据:
export ACLI_NO_INTERACTION=1
export ACLI_KEY=your-api-key
export ACLI_SECRET=your-api-secret
acli api:applications:list
命令挂起并等待输入
在脚本中始终传入 --no-interaction:
acli ide:create --application=abc123 --label="CI IDE" --no-interaction
退出代码未正确传递
在脚本顶部使用 set -e:
#!/bin/bash
set -e
acli auth:login --no-interaction
acli api:environments:code-switch $ENV_ID main
评论
支持 Markdown