WerckerでオリジナルのStepを導入する

このエントリーはOracle Cloudアドベントカレンダーの14日目です。

WerckerはOracleが提供するCI/CDサービスです。元々はオランダ発のスタートアップだったWercker社が提供していたサービスでしたが、2017年にOracleが買収し、その後継続してサービスが提供されています。

Werckerは全てのCI/CDパイプラインをコンテナで実行する仕組みになっており、ユーザーが任意のコンテナをパイプラインに組み込むことが可能です。 これにより、パイプラインで実行する処理内容を自由にカスタマイズできるようになっています。

このエントリーでは、簡単なサンプルを題材に、Werckerでオリジナルの処理をパイプラインに組み込む方法を書きたいと思います。

題材

Docker公式のWhalesayというコンテナを使って、クジラにセリフを喋らせる(標準出力に表示する)処理をパイプラインで実行してみます。

手順

では手順を書いていきます。

Stepを作る

Werckerのパイプラインで実行される処理は、Stepという最小単位で構成されています。Stepはおおよそシェルのコマンドを1回実行するのに相当する処理に当たります。

ここでは、Whalesayコンテナ上で実行する処理を定義するStepを作成します。

まず、Stepの作成に必要なファイルをホストするリポジトリGitHub上に用意しておきます。たとえば、wercker-step-whalesayなどの名前でリポジトリを作成します。

必要なファイルは以下の3つです。これらを作成して上記リポジトリにPushしていきます。

ファイル名 役割
run.sh Stepで実行する処理のエントリーポイントとなるスクリプト
step.yml Stepの仕様(名前や指定可能な変数など)を定義するymlファイル
wercker.yml Stepをビルドして、Werckerサービスに登録ときに利用される、ビルド定義ファイル

それぞれ、以下のような内容です。

run.sh
Step処理が実行されるときこのスクリプトがキックされます。中身はクジラに喋らせるコマンドを実行しているだけです。
$WERCKER_WHALESAY_MESSAGEは、Stepを使うときに指定した変数を環境変数から拾ってきています。

#!/bin/sh
cowsay $WERCKER_WHALESAY_MESSAGE

step.yml
ステップの仕様を定義します。名前はwhalesay、massageという変数を文字列で指定する、などといった内容が書いてあります。
指定した変数の値は、WERCKER<Step名><変数名>という形式の環境変数から取得できます。run.shでは、そうやってメッセージを拾っています。

name: whalesay 
version: 1.0.0
summary: whalesay
properties:
- name: message
  type: string
  required: true

wercker.yml
Stepの作成自体もWerckerのパイプラインで行うのですが、これはそのパイプラインの定義です。run.shのチェックとWerckerサービスへの登録を行います。
このパイプラインが正常に完了すれば、以降任意のパイプラインで利用可能なStepとして登録されます。

box: docker/whalesay

build:
  steps:
  - shellcheck:
      files: run.sh

publish:
  steps:
  - internal/publish-step:
      owner: hhiroshell
      # private: true

以上のファイルをリポジトリにPushしたら、Werckerでこのリポジトリに紐付いたApplicationsを作成してください。Applicationの作成は右上の"Add Application"から。基本デフォルトの設定でウィザードを流すだけなので、迷わないと思います。

f:id:charlier_shoe:20181217011249p:plain

次に、Workfrowタブでワークフローを作成します。Workflowタブを選択すると、デフォルトのBuildパイプラインがあるだけのフローが表示されています。

f:id:charlier_shoe:20181217011337p:plain

この画面の下の方にある"Add new pipeline"ボタンをクリックし、以下の設定でPipelineを作成します。

  • Name: publish
  • YML Pipeline name: publish
  • Hook type: Default

次にbuildパイプラインの右の[+]マークをクリックし、publishpパイプラインを追加します。"Execute Pipeline"でpublishを選択し、他の項目は全てデフォルトでOKです。

f:id:charlier_shoe:20181217011446p:plain

Runsタブを選択し画面下方のリンクからWorkflowを起動します。正常に終了したら、画面右上のアバターをクリックし、更にYour profileを選択します。Stepsの中にwhalesayが表示されていればStepの作成、登録は完了です。

f:id:charlier_shoe:20181217011509p:plain

whalesayステップの内容を開くと、以下のような説明が表示されます。

f:id:charlier_shoe:20181217011533p:plain

Stepを使う

それでは、作成したwhalesayステップを実際に使ってみます。新たなGitHubリポジトリを作成し、以下のファイルをPushしてください。

wercker.yml
デフォルトのpipelineであるbuildの中で、shalesayステップを呼び出しています。
変数messageの値をクジラが喋ってくれるはず。

build:
  box: docker/whalesay
  steps:
  - hhiroshell/whalesay@1.0.0:
      message: "hello whalesay !!"

先ほどと同様に、このリポジトリに紐付いたApplicationを作成します。今回はbuildパイプラインしかありませんので、ワークフローの編集は不要です。

最後にワークフローを実行してみます。

正常に終了したら、実行結果のbuildパイプラインに当たる部分をクリックし、その詳細情報にアクセスします。

f:id:charlier_shoe:20181217011550p:plain

whalesayというStepの部分を展開すると、そのStepの処理での標準出力の内容が表示されます。クジラが喋っていれば成功です。

f:id:charlier_shoe:20181217011604p:plain

まとめ

以上で、whalesayというコンテナをパイプラインに組み込んで、クジラに喋らせるコマンドを実行するStepを走らせることができました。

これと同じ要領で、任意のコンテナをパイプライン内で使うことが可能です。もちろん自作のコンテナを組み込んでStepとして実行することができますので、やろうと思えばほとんどどんなことでもできることになります。

以下は、TerraformをStepで実行してAWS環境の操作を行っている例です。ご参考までに、引用させていただきます。

TerraformとWerckerとAWS Organizationsで始めるステージング・開発環境構築

本エントリーは以上です。