Azure Pipelines のステージ、ジョブおよびステップの実行順序

Azure Pipelines の依存関係(dependsOn)を色々といじくって、挙動を確認します。
基本的に、依存関係(dependsOn)は明示してあげるのが良さそうです。

## 前提
- YAMLパイプラインを対象とします。
- 2024/5時点の確認結果となります。

## まとめ

|項目|dependsOn未指定|dependsOnを明示的に指定|dependOnを空にする|
|-|-|-|-|
|ステージ(stages)|YAMLの記載順序で実行される|dependsOnに指定したステージの実行終了を待つ|バラバラに実行される|
|ジョブ(jobs)|バラバラに実行される|dependsOnに指定したジョブの実行終了を待つ|バラバラに実行される|
|ステップ(steps)|YAMLの記載順序で実行される<br>※dependsOnは指定できない|N/A<br>※dependsOnは指定できない|N/A<br>※dependsOnは指定できない|


## ステージ(stages)

### 何も指定しなかった場合
<details><summary>YAML</summary>

```yaml: azure-pipeline.yaml
trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Stage_1
  jobs:
  - job: Job_1
    steps:
    - bash: echo "step 1-1"; sleep 1; exit $(( RANDOM % 2))

- stage: Stage_2
  jobs:
  - job: Job_2
    steps:
    - bash: echo "step 2-1"; sleep 1; exit $(( RANDOM % 2))

- stage: Stage_3
  jobs:
  - job: Job_3
    steps:
    - bash: echo "step 3-1"; sleep 1; exit $(( RANDOM % 2))

- stage: Stage_4
  jobs:
  - job: Job_4
    steps:
    - bash: echo "step 4-1"; sleep 1; exit $(( RANDOM % 2))
```
</details>

- 記載されている順序で実行される。

```mermaid
graph LR
  subgraph ST1[Stage_1]
    JB1("Job_1")
  end

  subgraph ST2[Stage_2]
    JB2("Job_2")
  end

  subgraph ST3[Stage_3]
    JB3("Job_3")
  end

  subgraph ST4[Stage_4]
    JB4("Job_4")
  end

  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,ST2,ST3,ST4,JB1,JB2,JB3,JB4 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  classDef SKIP fill:#eee,color:#fff,stroke:#000

  ST1 --> ST2
  ST2 --> ST3
  ST3 --> ST4
    
```
- 前のステージ内のジョブがエラー終了となった場合、後続のステージは実行されない。
```mermaid
graph LR
  subgraph ST1[Stage_1]
    JB1("Job_1")
  end

  subgraph ST2[Stage_2]
    JB2("Job_2")
  end

  subgraph ST3[Stage_3]
    JB3("Job_3")
  end

  subgraph ST4[Stage_4]
    JB4("Job_4")
  end

  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,ST2,JB1,JB2 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  class ST2,JB2 ABNRML
  
  classDef SKIP fill:#eee,color:#000,stroke:#000
  class ST3,JB3,ST4,JB4 SKIP

  ST1 --> ST2
  ST2 --> ST3
  ST3 --> ST4
    
```
- エラーとなったジョブを再実行し、正常終了した場合、後続のステージも実行される。




#### 依存関係を空にした場合
<details><summary>YAML</summary>

```yaml: azure-pipeline.yaml
trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Stage_1
  jobs:
  - job: Job_1
    steps:
    - bash: echo "step 1-1"; sleep 1; exit 0

- stage: Stage_2
  dependsOn: []
  jobs:
  - job: Job_2
    steps:
    - bash: echo "step 2-1"; sleep 1; exit 0

- stage: Stage_3
  dependsOn: []
  jobs:
  - job: Job_3
    steps:
    - bash: echo "step 3-1"; sleep 1; exit 0

- stage: Stage_4
  dependsOn: []
  jobs:
  - job: Job_4
    steps:
    - bash: echo "step 4-1"; sleep 1; exit 0
```
</details>

- 実行順序は不定。
    ```mermaid
    graph LR
        First("Stage_1<br>何番目に実行されるかは不定")
        B("Stage_2<br>何番目に実行されるかは不定")
        C("Stage_3<br>何番目に実行されるかは不定")
        D("Stage_4<br>何番目に実行されるかは不定")
    ```
- いずれかのステージ内のジョブがエラー終了となった場合でも、他のステージは実行される。
```mermaid
graph LR
  subgraph ST1[Stage_1]
    JB1("Job_1")
  end

  subgraph ST2[Stage_2]
    JB2("Job_2")
  end

  subgraph ST3[Stage_3]
    JB3("Job_3")
  end

  subgraph ST4[Stage_4]
    JB4("Job_4")
  end

  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,ST2,JB1,JB2,ST3,JB3,ST4,JB4 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  class ST2,JB2 ABNRML

  ST1
  ST2
  ST3
  ST4
```



#### 依存関係を明示した場合

<details><summary>YAML</summary>

```yaml: azure-pipeline.yaml
trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Stage_1
  jobs:
  - job: Job_1
    steps:
    - bash: echo "step 1-1"; sleep 1; exit 0

- stage: Stage_2
  dependsOn:
  - Stage_1
  jobs:
  - job: Job_2
    steps:
    - bash: echo "step 2-1"; sleep 1; exit 0

- stage: Stage_3
  dependsOn:
  - Stage_1
  jobs:
  - job: Job_3
    steps:
    - bash: echo "step 3-1"; sleep 1; exit 0

- stage: Stage_4
  dependsOn:
  - Stage_2
  - Stage_3
  jobs:
  - job: Job_4
    steps:
    - bash: echo "step 4-1"; sleep 1; exit 0
```
</details>

- 依存関係(dpendsOnに指定されたステージ)の実行後に実行される。
    ```mermaid
    graph LR
        First("Stage_1<br>1番目に実行")-->B("Stage_2<br>2番目に実行")
        First-->C("Stage_3<br>2番目に実行")
        B-->D("Stage_4<br>Stage_3と4が終わったら実行")
        C-->D
    ```
- 前のステージ内のジョブがエラー終了となった場合、後続のステージは実行されない。
  (例: Stage_1がエラーとなった場合、Stage_3および4は実行されない。)

- 前のステージ内のジョブがエラー終了となった場合、後続のステージは実行されない。
    ```mermaid
    graph LR
        First("Stage_1<br>1番目に実行")-->B("Stage_2<br>エラー")
        First-->C("Stage_3<br>2番目に実行")
        B-->D("Stage_4<br>実行されない")
        C-->D
    ```

## ジョブ(jobs)

### 何も指定しなかった場合
<details><summary>YAML</summary>

```yaml: azure-pipeline.yaml
trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Stage_1
  jobs:
  - job: Job_1
    steps:
    - bash: echo "step 1-1-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_2
    steps:
    - bash: echo "step 1-2-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_3
    steps:
    - bash: echo "step 1-3-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_4
    steps:
    - bash: echo "step 1-4-1"; sleep 1; exit $(( RANDOM % 2))

```
</details>

- 実行順序は不定。

```mermaid
graph LR
  subgraph ST1[Stage_1]
    JB1("Job_1")
    JB2("Job_2")
    JB3("Job_3")
    JB4("Job_4")
  end


  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,ST2,ST3,ST4,JB1,JB2,JB3,JB4 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  classDef SKIP fill:#eee,color:#fff,stroke:#000

```
- いずれかのジョブがエラー終了となった場合でも、他のジョブは実行される。

```mermaid
graph LR
  subgraph ST1[Stage_1]
    JB1("Job_1")
    JB2("Job_2")
    JB3("Job_3")
    JB4("Job_4")
  end


  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,JB1,JB3,JB4 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  class JB2 ABNRML
  
  classDef SKIP fill:#eee,color:#fff,stroke:#000

```




#### 依存関係を空にした場合
未指定時と同じ。

<details><summary>YAML</summary>

```yaml: azure-pipeline.yaml
trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Stage_1
  jobs:
  - job: Job_1
    steps:
    - bash: echo "step 1-1-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_2
    dependsOn: []
    steps:
    - bash: echo "step 1-2-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_3
    dependsOn: []
    steps:
    - bash: echo "step 1-3-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_4
    dependsOn: []
    steps:
    - bash: echo "step 1-4-1"; sleep 1; exit $(( RANDOM % 2))

```
</details>





#### 依存関係を明示した場合

<details><summary>YAML</summary>

```yaml: azure-pipeline.yaml
trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Stage_1
  jobs:
  - job: Job_1
    steps:
    - bash: echo "step 1-1-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_2
    dependsOn: 
    - Job_1
    steps:
    - bash: echo "step 1-2-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_3
    dependsOn: 
    - Job_1
    steps:
    - bash: echo "step 1-3-1"; sleep 1; exit $(( RANDOM % 2))

  - job: Job_4
    dependsOn:
    - Job_2
    - Job_3
    steps:
    - bash: echo "step 1-4-1"; sleep 1; exit $(( RANDOM % 2))
```
</details>

- 依存関係(dpendsOnに指定されたジョブ)の実行後に実行される。
```mermaid
graph LR
  subgraph ST1[Stage_1]
    JB1("Job_1")
    JB2("Job_2")
    JB3("Job_3")
    JB4("Job_4")
  end


  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,JB1,JB2,JB3,JB4 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  
  classDef SKIP fill:#eee,color:#fff,stroke:#000

  JB1 --> JB2
  JB1 --> JB3
  JB2 --> JB4
  JB3 --> JB4

```
- 前のジョブがエラー終了となった場合、後続のジョブは実行されない。
  (例: Job_2がエラーとなった場合、Job_4は実行されない。)

```mermaid
graph LR
  subgraph ST1[Stage_1]
    JB1("Job_1")
    JB2("Job_2")
    JB3("Job_3")
    JB4("Job_4")
  end


  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,JB1,JB3 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  class JB2 ABNRML
  
  classDef SKIP fill:#eee,color:#000,stroke:#000
  class JB4 SKIP

  JB1 --> JB2
  JB1 --> JB3
  JB2 --> JB4
  JB3 --> JB4

```


## ステップ(steps)

### 依存関係(dependOn)はない
<details><summary>YAML</summary>

```yaml: azure-pipeline.yaml
trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Stage_1
  jobs:
  - job: Job_1
    steps:
    - bash: echo "step 1-1"; sleep 1; exit $(( RANDOM % 2))
    - bash: echo "step 1-2"; sleep 1; exit $(( RANDOM % 2))
    - bash: echo "step 1-3"; sleep 1; exit $(( RANDOM % 2))
    - bash: echo "step 1-4"; sleep 1; exit $(( RANDOM % 2))

```
</details>

- 記載されている順序で実行される。

```mermaid
graph LR
  subgraph ST1[Stage_1]
    subgraph JB1["Job_1"]
      STP1("Step_1")
      STP2("Step_2")
      STP3("Step_3")
      STP4("Step_4")
    end
  end

  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,JB1,STP1,STP2,STP3,STP4 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  classDef SKIP fill:#eee,color:#fff,stroke:#000

  STP1 --> STP2
  STP2 --> STP3
  STP3 --> STP4
    
```
- 前のステップがエラー終了となった場合、後続のステップは実行されない。
```mermaid
graph LR
  subgraph ST1[Stage_1]
    subgraph JB1["Job_1"]
      STP1("Step_1")
      STP2("Step_2")
      STP3("Step_3")
      STP4("Step_4")
    end
  end

  classDef NRML fill:#0f0,color:#000,stroke:#000
  class ST1,JB1,STP1 NRML

  classDef ABNRML fill:#f00,color:#fff,stroke:#000
  class STP2 ABNRML
  
  classDef SKIP fill:#eee,color:#000,stroke:#000
  class STP3,STP4 SKIP

  STP1 --> STP2
  STP2 --> STP3
  STP3 --> STP4
    
```