タスクはRocketeerの重要なコンセプトの一つです。これまであなたが見てきたコマンドのほとんどは、裏では事前に定義されたタスクを使っています。Rocketeer\Tasks\Setup や Rocketeer\Tasks\Deploy のようにです。それらの多くはRocketeerによってすでに定義されていますが、Rocketeerに、同じようにあなたのサーバーでカスタムした動作をさせるタスクをあなた自身で追加できます。
一つのタスクは以下の三つから一つのことができます。
- 最新リリースフォルダで動作する単純な一行のコマンド。
composer install
や一行コマンドを寄せ集めたコマンドなど. - より高度な動作を許容するRocketeerのコアヘルパへのアクセスを与えるクロージャー。
- そして、最後は完全に快適なコントロールが与えられる
Rocketeer\Abstracts\AbstractTask
を継承したクラス。すべてのカスタムメイドのタスクは少なくとも一つexecute
メソッドを保つ必要があります。以上です。
_これは意図的にですが、_レベルごとに、あとちょっとのコントロールと快適さをあなたに与えてくれます。もしあなたがクロージャーが与えてくれるものよりもコントロールを必要とするならば、多分クラスが必要なのです。
多くのユーザーがやるであろうことは、すでにあるRocketeerのタスクに、フックをすることです。Rocketeerは、- 最低限 -タスク実行の前と後に実行可能なビルトインのイベントシステムを提供しています。
Rocketeerの設定ファイルのhooks.php
ファイルで、任意のタスクにフックすることができます。その書式はとっても簡単です。以下に、上で述べた三つのタイプのタスクでの例を示します。
<?php
'after' => array(
'setup' => array(
// Commands
'composer install',
// Actual Tasks classes
'Rocketeer\Tasks\Cleanup',
'MyNamespace\MyTaskClass',
// Closures
function($task) {
$tests = $task->runForCurrentRelease('phpunit --coverage-html=tests/coverage');
if ($tests) {
$task->command->info('Tests ran perfectly dude !');
} else {
$task->command->error('Aw man, tests failed and stuff');
}
},
),
?>
Rocketeerは、また、あなたが使えるファサードも提供します。これは、クロージャーを使うと汚れてしまうなどの、設定ファイルに何かを入れたくない時に、特に有用です。
Rocketeerは、次の2つのことを許容します。すべてのフックを含んだ.rocketeer/events.php
ファイルの作成。または、複数のクラスでクラスごとに1ファイルにするなど多数のファイルがあるならば、単純に.rocketeer/events/
フォルダを作成して、各々のタスクを中にいれると、Rocketeerは自動的にロードします。
<?php
use Rocketeer\Facades\Rocketeer;
Rocketeer::before('deploy', function($task) {
$task->command->info('Sup guys');
});
Rocketeer::after(['update', 'deploy'], array(
'composer install',
'bower install'
));
Rocketeer::after('deploy', 'MyClass');
?>
第一引数には、作用させたいタスク名(または、タスク名の配列)を与え、つづいてあなたのタスクを指定します。再度になりますが、あなたは、3つのタイプのタスクを使えます。文字列、クロージャ、クラスです。
Rocketeerはまた、タスクランニングシステムとあわせて独自タスクの作成、管理、実行も提供します。これらは、.rocketeer/tasks.php
ファイルに入れるか、もし多数ある場合には、それらが自動的にロードされる./rocketeer/tasks/
フォルダに入れることができます。
<?php
Rocketeer::task('composer', 'composer install');
Rocketeer::task('composer', array(
'composer self-update',
'composer install',
));
Rocketeer::task('phpunit', function ($task) {
return $task->runForCurrentRelease('phpunit');
}, 'Runs the PHPUnit tests');
?>
task
メソッドは3つの引数をとります。タスク名、実行内容(1行コマンド, クロージャ, クラス)、そして、何をするかの説明です。
これらのタスクは、自動的にRocketeerに登録されます。これらは、php rocketeer composer
などのようにCLIを使うか、ファサードを使って実行することができます。
Rocketeer::execute('composer');
Rocketeer::execute(['composer', 'phpunit']);
<?php
namespace MyTasks;
class Migrate extends \Rocketeer\Abstracts\AbstractTask
{
/**
* Description of the Task
*
* @var string
*/
protected $description = 'Migrates the database';
/**
* Executes the Task
*
* @return void
*/
public function execute()
{
$this->explainer->line('Running migrations');
return $this->runForCurrentRelease('php artisan migrate --seed');
}
}
?>
クラスは、自動的にRocketeerに登録されないので、登録は手動で行う必要があります。次のいずれかで行います。設定ファイルを使って、tasks.custom
配列の中で。
'custom' => array(
'MyTasks\Migrate',
),
または、ファサードで。
Rocketeer::add('MyTasks\Migrate');
そしてほら!ジャーン!
タスクが定義されたら、それはコマンドラインとファサードの2箇所に配置されます。
もし、タスク名composer
で登録したら、例えば、次のように実行できます。
$ php rocketeer composer
もしくはPHPコード(tasks.php
の中)で。
Rocketeer::execute('composer');
タスクの配列を渡すことで、複数のタスクを実行できます。Rocketeerは渡したものを常に処理することを覚えておくことはとても重要です。これは、タスクと考えられるものを何でも渡せることを意味します。
- コマンド文字列
- クロージャー
- タスク名
- タスクのクラス
<?php
Rocketeer::execute(array(
'my-task',
'composer install',
'Rocketeer\Tasks\Deploy',
function ($task) {
return $task->run('ls');
},
));
?>
ローカルサーバー上で何かを実行するような快適さをもってコマンド郡をローカルで実行する必要のあるような場合。これは実タスククラスでのみ実現できます。ローカルプロパティをtrueに設定することのみでできます。
class MyTask extends Rocketeer\Abstracts\AbstractTask
{
protected $local = true;
}
これにより、Rocketeerは、すべての呼び出しをLocalConnection
に委任します。これは、任意のConnectionクラスと同じように振る舞いますが、ローカルシステム上で実行されます。これは、デプロイの準備に有用で、Primer
タスクが動作する方法です。
タスクのコアメソッドは、run
メソッドです。これは、ほぼ全ての他のヘルパーの下に位置します。
これは単にリモートサーバーでコマンドを実行し出力を返します。
<?php
$folders = $this->run('ls');
?>
また、実行するコマンドの配列を渡すことも可能です。これは重要なので気を止めておいてください。
全てのrun
からの呼び出しは、自己完結型です。このようになります。(pwd
は、カレントフォルダを返します。)
<?php
// Returns /
$this->run('cd first-folder');
$folder = $this->run('pwd');
// Returns /first-folder/
$folder = $this->run(array(
'cd first-folder',
'pwd',
));
?>
フォルダにある複数のタスクを自動的に実行するためには、2つのヘルパがあります。runInFolder
とrunForCurrentRelease
です。最初のものは、フォルダにある1つ以上のタスクを実行します。もう一方はカレントリリースのフォルダある1つ以上のタスクを実行します。
<?php
$this->run(array(
'cd /home/www/website/releases/123456789',
'ls',
));
// Is the same as
$this->runInFolder('releases/123456789', 'ls');
// Is the same as
$this->runForCurrentRelease('ls');
?>
2,3のフォルダ・ファイルを操作する方法も存在します。 これらはとても基本的で抽象的な低レベルなbashコマンドたちですが、しかし、これらは有用です。
<?php
$this->move('folder/file.php', 'new-folder/file.php');
$array = $this->listContents('folder');
$boolean = $this->fileExists('file.php');
$boolean = $this->fileExists('folder');
$this->createFolder('folder');
$this->removeFolder('folder');
$this->symlink('folder-a', 'folder-b');
$phpunit = $this->which('phpunit', 'vendor/bin/phpunit'); // Second argument is fallback
?>
いくつかのメソッドは、Rocketeerの別のタスクで使われ、独自のタスクをつくるのに使うことができます。それら全ては、カレントのリリースに関連付けされます。
<?php
// Run tests
$boolean = $this->runTests();
$boolean = $this->runTests('--stop-on-failure');
// Run migrations
$this->runMigrations();
$this->runMigrations(true); // Seeds the database too
// Run Composer
$this->runComposer();
// Set folders as web-writtable
$this->setPermissions('public/images/users');
?>
タスクはまたRocketeerの他のクラスにアクセスすることができます。他のタスクを呼び出すことが可能です。
<?php
$this->executeTask('Rollback');
そして、他のクラスのメソッドを呼び出すことができます。すべてのタスクとストラテジは連なるコアクラスとそのメソッドにアクセスします。
- command は、現在実行されているコマンドのオプションや引数を加えるためのインスタンスです。
- scm は、(git, SVNといった)カレントSCMのバイナリのインスタンスです。
- rocketeer は、カレントアプリケーションおよびその設定を取得を司ります。
- connections はカレント接続/ステージ/サーバーおよびそれぞれの資格情報を取得するハンドルです。
- remote は、
run
メソッドを使用しているクラスでのサーバーへのエントリポイントです。 - explainer は、出力の表示を司ります。たとえば、タスクの中で進行を表示するなどで使います。
- paths で、ローカルおよびリモートのパスを見つけます。
- releasesManager は、リリースおよびそのパスを扱います。
- localStorage クラスは、ローカルストレージのファイル更新を保持し、リモートサーバーの状態と資格情報を追跡します。
- builder は、タスクとストラテジをその場で構築するのに使用します。
- queue は、あなたのタスク中のキューの中でタスクを実行させるのに使用します。
- tasks はタスクおよびそのイベントの登録を扱います。これは、Rocketeerのファサードに隠蔽されたクラスです。
それぞれのサービスに存在するメソッドのリストは、APIドキュメントより直接見ることができます。 これらのタスクは、自動的にRocketeerに登録されます。これらは、プロパティとしてアクセスされます。例えば、カレントリリースのフォルダーを取得するには以下のようにします。
$folder $task->releasesManager->getCurrentReleasePath('some/folder');