• 152 Words

    buildflow の dynamic task

    buildflow というツールを開発しているので buildflow というタグをつけて何回かに分けてブログを書きます。 この記事では buildflow の dynamic task という機能について説明します。 dynamic task では task.items の値でループを回し、複数の task を動的に生成できます。 勿論 task.items はオプションなので、指定しなければ普通の task として扱われます。 task.items を指定する場合、 map か list か、それらを返す Tengo script でないといけません。 --- phases: - name: main tasks: - name: "list {{.Item.Key}} {{.Item.Value.name}}" command: command: "echo {{.Item.Key}} {{.Item.Value.name}} {{.Item.Value.age}}" items: - name: foo age: 10 - name: bar age: 20 上記の設定は dynamic task を使わないとこうなります。 --- phases: - name: main tasks: - name: "list 0 foo" command: command: "echo 0 foo 10" - name: "list 1 bar" command: command: "echo 1 bar 20" パラメータ Item は Key, Value を持ち、 Items が map の場合、それぞれ map の key, value が渡され、 list の場合、 index と value が渡されます。
    • 69 Words

    buildflow の task の input, output という機能

    buildflow というツールを開発しているので buildflow というタグをつけて何回かに分けてブログを書きます。 この記事では buildflow の task の input, output という機能について説明します。 task の input, output は Tengo script で task のパラメータを整形する機能です。 task の command.command や write_file.template など、幾つかの設定では Go の text/template が使えますが、 text/template は複雑なロジックを記述したりするのには向いていません。 そこで task の input で Tengo script を使って必要なデータの整形を行うことで、 template は比較的きれいな状態に保つことが出来ます。 これは MVC モデルで View とロジックを分離するみたいな考え方と似ているかもしれません。 output ではコマンドの実行結果を整形することが出来ます。 例えばコマンドの標準出力をユニークな文字列のリストにしたり出来ます。 task.input は task.when が評価されたあと、 task の command などが実行される前に評価されます。 つまり、 task.when や task.dependency で同じ task の input の結果を参照は出来ません。
    • 41 Words

    buildflow で設定ファイルを分割する

    buildflow というツールを開発しているので buildflow というタグをつけて何回かに分けてブログを書こうかなと思います。 この記事では buildflow の設定ファイルを分割する方法について説明します。 buildflow では一部の設定項目について他のファイルのパスを指定して読み込むということが出来ます。 1 つのファイルに全部の設定を書いていると、ファイルが大きくなってメンテナンス性が悪くなったり、 コードオーナーが曖昧になったりするので、そういう場合は分割すると良いでしょう。 コードオーナーが異なる複数のサービスで共通の設定ファイルを用いる場合、ファイルを分割して GitHub の CODEOWNERS を設定するのもよいでしょう。 あまりないかもしれませんが、ファイルを分割すると同じファイルを読み込んで再利用も出来ます。 また、 Tengo script を独立したファイルに分割すると、 test が可能になります。 Tengo script をテストするためのツールとして tengo-tester というツールも開発しているので、そちらをお使いください。 以下のようなファイル読み込みの設定があります。 phase.import task.import: task.input_file task.output_file task.when_file command.command_file command.env[].value_file write_file.template_file ファイルのパスは、絶対パスか、実行中の build の設定ファイルが存在するディレクトリからの相対パスになります。
    • 197 Words

    buildflow の script や template に渡される parameter

    buildflow というツールを開発しているので buildflow というタグをつけて何回かに分けてブログを書こうと思います。 この記事では buildflow の Tengo script やテンプレートにパラメータとして渡される変数について紹介します。 buildflow では Tengo script はテンプレートが使える設定項目が多くあります。それらの設定には共通のフォーマットのパラメータが渡されます。 PR: Pull Request の情報: GitHub API のレスポンス body Files: Pull Request で更新されたファイルの一覧: GitHub API のレスポンス body Phases: 対象の Phase よりも前の Phase の結果 Phase: 対象の Phase Tasks: 対象の Phase の Task の結果 Task: 対象の Task Item: dynamic task のパラメータとして渡される Meta: 設定 meta Phase Status: Phase の実行結果 succeeded failed skipped Tasks: Phase の task の実行結果 Meta: phase の 設定 meta Task
    • 149 Words

    buildflow の task の設定項目

    buildflow というツールを開発しているので buildflow というタグをつけて何回かに分けてブログを書こうと思います。 この記事では buildflow の task の基本的な設定項目などについて説明します。 数が多いので、個々の設定の詳細はまた別の記事に書きます。 task には幾つか type がありますが、全ての type に共通するパラメータが以下になります。 name: task 名。 unique である必要はない。 Go の text/template が使える when: task を実行するか否か。 真偽値か Tengo script when_file で外部ファイルを読み込める dependency: task の依存関係の定義。 task 名のリストか、 Tengo script items: dynamic task の設定。 loop を使って複数の task を動的に生成できる 任意の list か map か、 Tengo script input: Tengo script で task のコマンドのパラメータを生成できる input_file で外部ファイルを読み込める output: Tengo script で task の実行結果を整形できる。他の task が参照して挙動を変えたりできる output_file で外部ファイルを読み込める meta: ユーザーが自由にパラメータを定義できる map 上記の設定は name 以外はオプションです。
    • 127 Words

    buildflow の build, phase, task について

    buildflow というツールを開発しているので buildflow というタグをつけて何回かに分けてブログを書こうと思います。 この記事では buildflow の概念である build, phase, task について書きたいと思います。 buildflow には Build, Phase, Task という概念があります。 CircleCI の Pipeline, Workflow, Job みたいなものと思ってもらえるとよいと思います。 $ buildflow run で 1 つの build が実行されます。 build は複数の phase からなり、 phase が 1 つずつ順に実行されます。 phase は複数の task からなり、 task が全て終了すると、その phase も終了となります。 task は並列に実行したり、依存関係を定義したりできます。 task では外部コマンドを実行したりできます。 設定ファイルでは phases, tasks をそれぞれ配列で指定します。 --- phases: - name: setup tasks: - name: hello command: command: echo hello - name: foo command: command: echo foo - name: build tasks: - name: hello command: command: echo hello - name: foo command: command: echo foo dependency: - hello - name: post build tasks: - name: hello command: command: echo hello 上の例では 3 つの phase setup, build, post build が順に実行されます。 デフォルトではどれかの phase が失敗するとそれ以降の phase は実行されません(この挙動は変えられます)。
    • 73 Words

    buildflow での Tengo の使い方

    buildflow というツールを開発しているので buildflow というタグをつけて何回かに分けてブログを書こうかなと思います。 この記事では buildflow で Tengo というスクリプト言語をどのように使っているか書きたいと思います。 https://github.com/d5/tengo buildflow の設定では task.when や task.dependency, task.input などで Tengo script が使えますが、 1 つの共通のルールがあります。 result という変数を宣言し、 script の実行結果をその変数に持たせるというルールです。 これは Tengo の仕様とかではなく、 buildflow 特有のルールです。 もっとも単純な例だと次のような感じです。 result := true task.input, output などだと result の値が Task.Input, Task.Output として参照できるようになります。 --- phases: - name: main tasks: - name: hello input: |result := { foo: "bar" } command: command: 'echo "{{.Task.Input.foo}}"' when: "result := true" Tengo の標準ライブラリ Tengo には標準ライブラリがあります。 buildflow では全ての標準ライブラリが使えます。
    • 210 Words

    buildflow というワークフローエンジンのようなタスクランナーのようなツールを作っている

    buildflow というツールを開発しているので紹介します。 buildflow というタグをつけて何回かに分けてブログを書こうかなと思います。 1本目のこの記事では どんなツールか Hello World 特徴 について簡単に説明します。 どんなツールか https://github.com/suzuki-shunsuke/buildflow ワークフローを実行するための CLI ツールです。 ワークフローエンジンと言うと Airflow とか Azkaban, Argo Workflows のようなツールをイメージするかと思いますが、 それらとは目的も機能も違います。 一部の CI サービスではワークフローのローカル実行をサポートしてたりしますが、そんなイメージで良いかもしれません。 buildflow では task と task の依存関係を設定ファイルに定義し、コマンドを実行するとローカルでタスクが実行されます。 そういうとタスクランナーといったほうがいいのかもしれませんが、個別のタスクを指定して実行するような機能はないので、タスクランナーとも違う気がします。 CI サービス上で実行することを目的として開発しています(汎用的なツールなので他の目的でも使えるとは思います)。 Hello World まだどんなツールかピンと来てない人もいるかもしれないので、簡単な Hello World をやってみましょう。 GitHub Releases からバイナリをダウンロードしてください。 次のような設定ファイル .buildflow.yaml を用意します。 --- phases: - name: main tasks: - name: hello command: command: echo hello 次のコマンドを実行すると task が実行されます。 $ buildflow run ============== = Phase: main = ============== 07:50:46UTC | hello | + /bin/sh -c echo hello 07:50:46UTC | hello | 07:50:46UTC | hello | hello 07:50:46UTC | hello | ================ = Phase Result: main = ================ status: succeeded task: hello status: succeeded exit code: 0 start time: 2020-10-17T07:50:46Z end time: 2020-10-17T07:50:46Z duration: 4.
    • 444 Words

    github-comment - GitHub にコメントを投稿する CLI

    GitHub の issue や pull request, commit にコメントを投稿する CLI ツールを作りました(結構前の話ですが)。 https://github.com/suzuki-shunsuke/github-comment このブログの執筆時点で最新は v1.5.0 です。 Go 製なので、 GitHub Releases からダウンロードしてくれば簡単にインストールできます。 想定している主な用途は、 CI/CD の 結果をコメントで通知することで DX を向上することです。 例えば CI がこけたらこけたコマンドとエラーメッセージを通知するなどです。 github-comment には init: 設定ファイルの雛形を生成する post: コメントを投稿する exec: 外部コマンドを実行し、その結果を元にコメントを投稿する という 3 つのサブコマンドがあります。 コメントの投稿には GitHub の Access Token が必要です。 コマンドライン引数 -token でも渡せますが、環境変数として設定しましょう。 $ export GITHUB_TOKEN=xxx # GITHUB_ACCESS_TOKEN も可 post コマンド こんな感じでコメントを投稿できます。 $ github-comment post -org suzuki-shunsuke -repo github-comment -pr 1 -template test パラメータの数が多いですが、いくつかの Platform では環境変数から自動でパラメータを補完してくれます。
    • 86 Words

    clap - 簡単にツールをインストールするためのツールを作った

    多分車輪の再生産だとは思いますが、簡単にツールをインストールするための CLI ツールを作りました。 tarball や zip をダウンロードして展開して指定したパスにインストールするツールです。 https://github.com/suzuki-shunsuke/clap Go で書かれています。 ツールの名前(clap)には特別な意味や理由はなく、なんとなくです。 CI で何かしらのツールをインストールすることがままあって、そのためのシェルスクリプトを都度書くのが割と面倒なのでツール化しました。 このブログを書いている時点でバージョンは v0.1.0-1 で、最低限の機能しかありませんが、9割型ニーズを満たせるかなと思います。 使い方は以下のようになっています。 $ clap <URL> <インストールするファイルのアーカイブ内での相対パス>:<インストール先> [<インストールするファイルのアーカイブ内での相対パス>:<インストール先>...] 例えば conftest を /usr/local/bin にインストールする場合次のようになります。 CONFTEST_VERSION=0.18.2 clap install https://github.com/instrumenta/conftest/releases/download/v${CONFTEST_VERSION}/conftest_${CONFTEST_VERSION}_Linux_x86_64.tar.gz conftest:/usr/local/bin/conftest chmod a+x /usr/local/bin/conftest パーミッションの付与はやってくれないので必要に応じてやってください。 ファイルの圧縮形式は URL から自動で判別してくれます。 上記の conftest のインストールを今までは次のようなシェルスクリプトを書いていました。 #!/usr/bin/env bash set -eu CONFTEST_VERSION=0.18.2 dirpath=$(mktemp -d) pushd "$dirpath" TARFILE=conftest_${CONFTEST_VERSION}_Linux_x86_64.tar.gz curl -OL https://github.com/instrumenta/conftest/releases/download/v${CONFTEST_VERSION}/${TARFILE} tar xvzf $TARFILE mv conftest /usr/local/bin/conftest chmod a+x /usr/local/bin/conftest popd rm -R "$dirpath" 地味に面倒ですね。これをツール毎に書いて、しかも圧縮形式によって微妙に変えないといけません。