lullabot / robo-acquia
Acquia Cloud API 的 Robo 任务运行器。
Requires
- php: >=7.1.0
- consolidation/robo: >=1.0
- typhonius/acquia-php-sdk-v2: ^3.1.0
Requires (Dev)
- enlightn/security-checker: ^1.10
- friendsofphp/php-cs-fixer: ^2.15
- maglnet/composer-require-checker: ^3.8
- php-coveralls/php-coveralls: ^2.1
- phpmd/phpmd: ^2.7
- phpro/grumphp: ^1.16
- phpunit/phpunit: ^9.6
- roave/security-advisories: dev-master
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2024-09-04 21:23:48 UTC
README
此 Composer 包将 Robo 任务运行器与 Acquia Cloud API v2 PHP SDK 整合,以便在 Robo 或 Drush 中运行 Acquia CLI 任务。如果您尚未使用 Robo 或 Drush 并且希望有一个命令行工具来与 Acquia Cloud API 交互,则建议您使用acquia_cli。
安装
从您项目的 composer 根目录中,需要此库
$ composer require lullabot/robo-acquia
在 Robofile.php 中的使用
首先,生成一个 Acquia Cloud API 令牌。完成后,您应该在安全的地方存储该令牌,以便在命令中检索它。为了说明本文档的目的,我们将使用项目根目录中的 robo.yml。
./robo.yml
acquia: key: 'd0697bfc-7f56-4942-9205-b5686bf5b3f5' secret: 'D5UfO/4FfNBWn4+0cUwpLOoFzfP7Qqib4AoY+wYGsKE='
您可能需要指定自定义的配置 yml 并设置适当的权限,以便无权限的用户无法读取密钥/秘密。
然后,在我们的 RoboFile.php 中,我们可以添加一个新命令来打印任务列表。
./RoboFile.php
<?php use Consolidation\OutputFormatters\StructuredData\UnstructuredListData; class RoboFile extends \Robo\Tasks { use Lullabot\RoboAcquia\LoadRoboAcquiaTasks; private $acquiaKey; private $acquiaSecret; private $acquiaApplicationUuid; public function __construct() { $this->acquiaKey = \Robo\Robo::Config()->get('acquia.key'); $this->acquiaSecret = \Robo\Robo::Config()->get('acquia.secret'); $this->acquiaApplicationUuid = '[your-acquia-application-uuid]'; } /** * List out tasks. * * @return \Consolidation\OutputFormatters\StructuredData\UnstructuredListData * * @command acquia:task-list */ public function acquiaTaskList() { $response = $this->taskAcquiaCloudApiStack($this->acquiaKey, $this->acquiaSecret) ->tasks($this->acquiaApplicationUuid) ->run(); $tasks = []; foreach ($response['result'] as $task) { /* @var \AcquiaCloudApi\Response\TaskResponse $task */ $tasks[$task->uuid] = sprintf('%s: %s', $task->name, $task->status); } return new UnstructuredListData($tasks); } }
运行此命令应生成任务列表
➜ vendor/bin/robo acquia:task-list
[Lullabot\RoboAcquia\AcquiaCloudApiStack] tasks ["[your-acquia-application-uuid]"]
cd7ed2f4-fd8c-46d2-bc63-a14d9abed6e1: 'CodeSwitched: completed'
14a981c6-eeb0-46df-b965-ce4d74e5214b: 'VarnishCleared: completed'
d3dcafab-89db-4e72-abd2-d2448a0408dc: 'CodeSwitched: completed'
6e73e741-6d2a-475f-a3b8-1ed29563c71d: 'DatabaseBackupCreated: completed'
08417f0b-3957-470e-8400-f39b090bf269: 'DatabaseBackupCreated: completed'
2967397d-e7b0-4155-8107-6eae3818a39f: 'DatabaseBackupCreated: completed'
d26ea593-d863-4bcd-8178-d6566b8cad88: 'DatabaseBackupCreated: completed'
f82374db-7695-49e2-b15b-45c0e3311c36: 'DatabaseBackupCreated: completed'
e4b03419-4300-411e-89f8-e015a7e3a9ab: 'DatabaseBackupCreated: completed'
ee4b0286-7e7c-4e51-a7cc-d9690b9778b3: 'DatabaseBackupCreated: completed'
0308b62b-aa1c-4fd3-8437-61f30625cc9a: 'DatabaseBackupCreated: completed'
5a1e7f71-926f-4d16-8874-e257952223a1: 'DatabaseBackupCreated: completed'
db4e3e35-cd74-4350-8474-cdc09e1dcbeb: 'DatabaseBackupCreated: completed'
55debdad-7bf4-4da5-a293-899bd7f96203: 'DatabaseBackupCreated: completed'
e158de43-336e-4f58-8203-779ea6f4bf7d: 'DatabaseBackupCreated: completed'
等待任务完成
许多 Acquia Cloud API 操作会在后台排队执行长时间运行的任务。不幸的是,API 不会响应任务 ID,以允许对任务执行的程序化监控。Acquia Robo 任务提供了一种基本的解决方案。这种方法并不是万无一失的,因为程序不能确定它找到并监控的任务确实是触发的确切任务。如果您有一个繁忙的 Acquia 任务队列,并且存在 Acquia 任务与当前运行命令列表不匹配的风险,请不要使用此方法。
如果您仍然在这里,以下是您等待任务完成的方法。在这个例子中,我们将使用 Robo 等待备份完成和代码部署发生后再继续。
<?php use Lullabot\RoboAcquia\AcquiaTaskWatcher; use Lullabot\RoboAcquia\LoadRoboAcquiaTasks; class RoboFile extends \Robo\Tasks { use LoadRoboAcquiaTasks; private $acquiaKey; private $acquiaSecret; private $acquiaApplicationUuid; public function __construct() { $this->acquiaKey = \Robo\Robo::Config()->get('acquia.key'); $this->acquiaSecret = \Robo\Robo::Config()->get('acquia.secret'); $this->acquiaApplicationUuid = '[your-acquia-application-uuid]'; } /** * Perform a code deploy. * * @param string $env_uuid * The Acquia environment UUID to deploy to. * @param string $branch * The tag or branch to deploy. Prefix a tag with tags/, e.g. tags/[tag]. * @param string $database_name * The name of the database to backup. Defaults to www. * * @return \Robo\Result * * @command acquia:deploy */ public function deploy($env_uuid, $branch, $database_name = 'www') { $stack = $this->taskAcquiaCloudApiStack($this->acquiaKey, $this->acquiaSecret); // Simple waitForTaskCompletion with no callback. This will wait quietly // before proceeding to the next item in the stack. $stack->createDatabaseBackup($env_uuid, $database_name) ->waitForTaskCompletion($this->acquiaApplicationUuid, AcquiaTaskWatcher::DATABASE_BACKUP_CREATED); // Deploy code and provide feedback with a callback. This will print a // message and provide feedback with a dot every 3 seconds. Once // complete, it will provide a confirmation dialog before continuing. $callback = function ($result) { static $i = 0; if ($i === 0) { $this->output()->write("\nWaiting for task completion."); } $i++; // Print a dot every 3 seconds. if ($i % 3 === 0) { $this->output()->write('.'); } // If result is empty, that means the job is complete. if (empty($result[0]->status)) { $this->writeln("\nTask completion detected!"); if (!$this->confirm('Would you like to continue?')) { throw new \Robo\Exception\TaskExitException(static::class, 'Cancelled.', \Robo\Result::EXITCODE_USER_CANCEL); } } }; $stack->switchCode($env_uuid, $branch) ->waitForTaskCompletion($this->acquiaApplicationUuid, AcquiaTaskWatcher::CODE_SWITCHED, 240, $callback); // Run the stack of Acquia tasks now. $result = $stack->run(); if ($result->wasSuccessful()) { $this->yell("Backup created and code deployed!"); } return $result; } }
致谢
此 Robo 任务运行器由 Lullabot 为 Digital Services Georgia 开发。