Skip to content

Latest commit

 

History

History
537 lines (395 loc) · 19.5 KB

Tasks.md

File metadata and controls

537 lines (395 loc) · 19.5 KB

タスク

タスクはRocketeerの重要なコンセプトの一つです。これまであなたが見てきたコマンドのほとんどは、裏では事前に定義されたタスクを使っています。Rocketeer\Tasks\SetupRocketeer\Tasks\Deploy のようにです。それらの多くはRocketeerによってすでに定義されていますが、Rocketeerに、同じようにあなたのサーバーでカスタムした動作をさせるタスクをあなた自身で追加できます。

一つのタスクは以下の三つから一つのことができます。

  • 最新リリースフォルダで動作する単純な一行のコマンド。composer installや一行コマンドを寄せ集めたコマンドなど.
  • より高度な動作を許容するRocketeerのコアヘルパへのアクセスを与えるクロージャー。
  • そして、最後は完全に快適なコントロールが与えられるRocketeer\Abstracts\AbstractTaskを継承したクラス。すべてのカスタムメイドのタスクは少なくとも一つexecuteメソッドを保つ必要があります。以上です。

_これは意図的にですが、_レベルごとに、あとちょっとのコントロールと快適さをあなたに与えてくれます。もしあなたがクロージャーが与えてくれるものよりもコントロールを必要とするならば、多分クラスが必要なのです。


Rocketeerのタスク内でのフック

多くのユーザーがやるであろうことは、すでにある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つのヘルパがあります。runInFolderrunForCurrentReleaseです。最初のものは、フォルダにある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');