﻿# Azure Pipelines 如何指定 Agent 的 PATH 環境變數 (Logging commands)

Azure Pipelines 有個 [Logging commands](https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=powershell&WT.mc_id=DT-MVP-4015686) 可以用來與 Agent 進行溝通，你可以在執行 Pipelines 的過程中，對 Agent 做出許多設定，可以做的事情還蠻多的，而且我之前也寫過好幾篇文章，今天我想專注在「環境變數」這件事情上，尤其是 `PATH` 環境變數。

### 設定環境變數

我們要先理解一下 Azure Pipelines 的運作架構，基本上一個 `Pipeline` (**管線**) 底下可能會有多個 `Agent Jobs` (**代理作業**) (大多只會有一個)，而每個 Agent Job 會有多個 `Tasks` (**作業**)，我們會在 Task 中執行一些命令或工作。每個 Pipeline 都可以啟動一次次的 `Run` (**執行**)，而每次的 Run 都會保留 CI 過程的所有資訊，包含 **執行記錄** (`Logs`) 與 **產出物** (`Artifact`)。

當 Agent 開始執行工作時，它會建立起一個工作目錄，讓你在該目錄先取出原始碼，然後在該目錄進行 CI 或 CD 作業，我們需要設定的「環境變數」其實是每一次 Run (**執行**) 的時候當下的環境變數，你應該不會想要在 Run 的過程中修改掉系統的環境變數，即便你有系統管理員的權限。

我們在多個不同的 Tasks 之間要共用資料，最方便的方式就是透過「環境變數」來暫存一些狀態，當你成功寫入環境變數之後，會讓接下來的每一個 Tasks 都能讀取到這些環境變數。

以下是透過 [Logging commands](https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=powershell&WT.mc_id=DT-MVP-4015686) 寫入一個環境變數的方式，我們假設要寫入一個 `npm_config_yes` 的環境變數，變數值為 `true`：

1.  Command Prompt (命令提示字元)
    
    ```batch
    echo ##vso[task.setvariable variable=npm_config_yes;]true
    ```
    
2.  PowerShell
    
    ```powershell
    Write-Host "##vso[task.setvariable variable=npm_config_yes;]true"
    ```
    
3.  Bash
    
    ```powershell
    #!/bin/bash
    echo "##vso[task.setvariable variable=npm_config_yes;]true"
    ```
    

你可以從上述命令清楚的看出，只要直接在 Console 輸出一個名為 [Logging commands](https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=powershell&WT.mc_id=DT-MVP-4015686) 的訊息，就可以告訴 Azure DevOps 的 Agent 設定一組變數使用。

### 設定 PATH 環境變數

其實在 CI 的過程中，有時候我會希望修改掉 `PATH` 環境變數，讓我接下來的 Tasks 可以使用較短的命令來執行程式，此時你可以用 `task.prependpath` 工作將一個路徑加到 `PATH` 環境變數的最前面，也就是優先權最高的位置！

例如你在 CI 的過程中要自訂 Node.js 的執行檔路徑，那麼你可以這樣設定 PATH 環境變數：

1.  Command Prompt (命令提示字元)
    
    ```batch
    echo ##vso[task.prependpath]$(System.DefaultWorkingDirectory)\Node\node-v16.13.0-win-x64
    ```
    
2.  PowerShell
    
    ```powershell
    Write-Host "##vso[task.prependpath]$(System.DefaultWorkingDirectory)\Node\node-v16.13.0-win-x64"
    ```
    
3.  Bash
    
    ```powershell
    #!/bin/bash
    echo "##vso[task.prependpath]$(System.DefaultWorkingDirectory)\Node\node-v16.13.0-win-x64"
    ```
    

下載 Node.js 的命令如下：

```bash
curl.exe -sSL "https://nodejs.org/dist/v16.13.0/node-v16.13.0-win-x64.zip" -o "node-v16.13.0-win-x64.zip"
7z x "node-v16.13.0-win-x64.zip" -o"$(System.DefaultWorkingDirectory)\Node"
```

### 相關文章

-   [如何有條件的控制 Azure Pipelines 的執行流程](/post/2020/03/21/Conditional-control-task-execution-flow-in-Azure-Pipelines)
-   [如何從 Azure Pipelines 的 Task 設定一個變數給下一個 Task 使用](/post/2020/02/08/Set-variables-in-scripts-in-Azure-Pipelines)
-   [Azure Pipelines 如何指定 IBM Java SDK 8.0 為主要的 JDK 版本](/post/2021/08/23/Azure-Pipelines-using-IBM-Java-SDK-80)

### 相關連結

-   [Logging commands - Azure Pipelines | Microsoft Docs](https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=bash&WT.mc_id=DT-MVP-4015686)
-   [config | npm Docs](https://docs.npmjs.com/cli/v8/using-npm/config)
