Shell

    Workflow

    ジョブでは環境とその中で行う処理フローを定義してきましたが、ワークフローはそのジョブをいつ・どんな時に実行するかの制御を行います。例えばそれは

    • いつ
      • 毎週土曜の0時に
      • 1時間おきに
    • どんな時に
      • masterブランチにコミットがプッシュされた時
      • v0.1.0がプッシュされた時
      • 前のワークフローが終わった時
      • 権限を持つ者が承認した時

    のような場合です。

    その前にまずデフォルトの動作の話。以下のような設定の時、ワークフローabは、「いつ」と「どんな時に」どちらも設定していませんが、何かしらコミットがプッシュされた時にどちらも実行されます。

    jobs:
      echo:
        docker:
          - image: alpine
        steps:
          - run: echo foo
    
    workflows:
      a:
        jobs:
          - echo
      b:
        jobs:
          - echo
    

    またjobsに複数のジョブを渡した場合、それぞれのjobは個別に順不同に実行されます。つまり以下の場合bの方が先に実行される可能性があります。

    workflows:
      a:
        jobs:
          - a
          - b

    いつ

    「いつ」を設定するにはtriggersが必要です。もしaを「毎週土曜の0時に」だけ実行されるようにしたい場合以下のように設定します。

    workflows:
      a:
        triggers:
          - schedule:
              cron: "0 0 * * 6"
        jobs:
          - echo
    

    「一時間おきに」も追加したいなら、schedule.cron: "0 0-23 * * *"も追加してあげます。

    これでも良いですが、これはその時存在するすべてのブランチでその時になったら実行されます。もしブランチやタグを指定したい場合はcronと同じ階層にfiltersを置くことができます。

    例えばmasterdevelopブランチだけであれば、

    cron: ...
    filters:
      branches:
        only:
          - master
          - develop

    のようにします。またonlyには正規表現も渡すことができ、マッチしたブランチだけというようなこともできます。

    cron: ...
    filters:
      branches:
        only: /cron.*/
    

    onlyとは逆の意味のignoreというキーを変わりに置くこともできます。

    cron: ...
    filters:
      branches:
        ignore: /master|develop/
    

    タグの場合はtagsbranchesと同じ階層に置きます。タグの場合デフォルトではすべて対象となっていないため、すべてのタグも実行対象にしたい場合(多分ない)、

    cron: ...
    filters:
      tags:
        only: /.*/
    

    のようにします。

    どんな時に

    上記のfiltersでほぼ「どんな時に」の話なのですがこれはトリガー内での話なので、それ単体で設定したい場合はどうすればいいか。それはジョブ毎に設定してあげます。各ジョブにおいてもfiltersを持つことができ、これは上記のものと同じような設定を置けます。

    workflows:
      a:
        jobs:
          - echo:
              filters: ...
    

    「前のワークフローが終わった時」に関してはrequiresという設定を持てます。これは配列で中には他のジョブ名が入ります。例えば値が["foo"]の時その意味は「fooジョブが終わったらコレを実行しろ」という感じになります。

    以下の例のように1つ前のジョブをrequiresで指定することでジョブを狙った通りの順番で実行することができ、最初のジョブに対してフィルターをかけることで対象の指定もできることになります。

    workflows:
      workflow:
        jobs:
          - pre:
              filters:
                branches: /master/
          - main:
              requires:
                - pre
          - suf:
              required:
                - main
    

    他にtype: approvalを各ジョブは持て、これを指定するとワークフローのそのジョブは待機状態で止まります。そのジョブを実行するには権限ある者がワークフローページで「Approve」する必要があります。