Azure Resource Manager 服務連線的工作負載身分識別同盟正式推出

我們很高興宣佈工作負載身分識別同盟現已在 Azure Pipelines 中正式推出! 您可以享受簡化的體驗,而不需要在 Azure 服務連線中管理秘密和憑證。

透過此更新,我們也會在增強的 GitHub 與 Azure Boards 整合中預覽新功能。 您現在可以直接連結至 GitHub 提取要求或認可。 不要再切換視窗或複製/貼上。 只要選取您想要的存放庫、尋找所需的提取要求或認可,並加以連結!

請參閱版本資訊,以深入了解這些功能。

一般

適用於 Azure DevOps 的 GitHub 進階安全性

Azure Boards

Azure Pipelines

Azure Repos

Azure Artifacts

一般

替代認證淘汰的最終通知

替代認證於 2020 年 3 月正式淘汰,但一些現有的使用者被祖父持續使用現有的替代認證。 自 2024 年 1 月起,我們已完全取代所有替代認證。若要避免任何潛在的中斷,請切換至我們提供的其中一個 可用驗證機制 ,例如個人存取令牌或受控識別。

Azure Devops OAuth 自助式秘密輪替

每五年更新 Azure DevOps OAuth 應用程式的客戶端密碼以確保持續產生使用 Azure DevOps API 所需的存取和重新整理令牌。 當您的用戶端密碼即將到期時,您現在可以獨立產生新的密碼,為您的小組提供管理它的自由,而不需要依賴客戶支援。 這項排程秘密輪替的彈性可讓客戶因密碼過期而等待更換時,將潛在的中斷時間降到最低。

Screenshot of Select a geography.

在您可以在這裡透過您的設定檔存取的每個 Azure DevOps 應用程式頁面中尋找這項新功能。 在 Azure DevOps OAuth 指南深入了解這個新步驟。

適用於 Azure DevOps 的 GitHub 進階安全性

警示詳細數據檢視中現在可用的代碼段

程式代碼掃描和秘密掃描警示的警示詳細數據頁面現在會顯示代碼段,這些代碼段會標示警示發生所在的一或多行程序代碼。 若要移至 Azure DevOps 存放庫中的原始檔,請按下代碼段上方的檔名。

Screenshot of case-sensitive middleware path.

警示概觀中顯示的截斷秘密

截斷的任何偵測到秘密的最後六個字元現在會顯示在秘密警示概觀畫面中。 如果您有相同秘密類型的多個秘密公開,這項功能會很有説明,可讓您快速識別特定秘密所在的位置。

Screenshot of secret alerts list.

已針對程式代碼掃描警示新增更多警示嚴重性

現在有新的警示嚴重性,來自 CodeQL quality 查詢的警示結果為 ErrorWarningNote 嚴重性。 每個品質警示嚴重性都有自己的徽章和色彩,以表示縮放嚴重性。 您也可以篩選每個嚴重性,類似於lowcritical安全性警示的嚴重性規模。

Screenshot of code scanning alerts list and severity filter.

適用於 Azure DevOps 的 GitHub 進階安全性所需的連結 Azure 訂用帳戶

如果您先前針對 Azure DevOps 組織中沒有連結 Azure 訂用帳戶的存放庫啟用進階安全性,您可能會注意到這些存放庫上會自動停用進階安全性。 若要重新啟用進階安全性,請將相關聯的 Azure 訂用帳戶新增至組織。 如需如何新增或變更訂用帳戶的詳細資訊,請參閱 變更 Azure 訂用帳戶

進階 安全性 API 更新

最近隨附進階 安全性 API 的各種更新:

  • GET Alerts API 現在支援新的參數 ModifiedSince,以傳回累加式警示清單,並只傳回自此日期以來修改的警示。 如需詳細資訊,請參閱 警示 - 清單
  • GET SARIFs API 現在會傳回特定的上傳錯誤,以協助您針對任何 SARIF 上傳失敗進行疑難解答。 如需詳細資訊,請參閱 SARIF
  • 有兩個新的端點可以擷取或更新組織或專案的進階安全性啟用狀態。 這兩個端點都會傳回已啟用進階安全性的存放庫清單。 如需詳細資訊,請參閱 組織 - 啟用專案 - 啟用
  • 有兩個新的端點可擷取您組織或專案作用中認可者計數的估計值,以反映預估的進階安全性計量使用量可能花費什麼。 如需詳細資訊,請參閱 組織計量使用量估計專案計量使用量估計

進階安全性許可權現在會永久顯示

在過去,如果已啟用進階安全性,則三個進階安全性許可權位只會以每個存放庫可指派的許可權的形式出現。 現在,這些許可權預設 可在 [存放庫 > 安全性 許可權] 窗格中取得,而且可以指派,而不需要啟用進階安全性。

Screenshot of Advanced Security permissions.

Azure Boards

您有兩個選項可將工作專案與 GitHub 提取要求或認可連線。 您可以在提取要求中使用 AB# 語法,也可以直接從工作項目連結它。 目前,此程式牽涉到複製 GitHub 提取要求的 URL,並在新增連結時貼上它。 這需要開啟多個視窗,並在 GitHub 與 Azure DevOps 之間切換。

在此短期衝刺中,我們很高興在連結至 GitHub 提取要求或認可時啟用搜尋功能,以宣佈增強的體驗。 搜尋並選取所需的存放庫,然後向下切入以尋找並連結至特定提取要求或認可。 不再需要多個視窗變更和複製/貼上 (雖然您仍然有該選項)。

Gif to demo add link.

注意

這項功能僅適用於 New Boards Hub 預覽版。

如果您想要取得此功能的存取權,請直接傳送電子郵件給您的組織名稱(dev.azure.com/{organization name})。

新的 Boards 中樞改善

在此版本中,我們引進了 New Boards Hub 預覽版的一系列增強功能,著重於輔助功能和頁面重排。

以下是調適型最多 400% 縮放的頁面重排變更範例。

Gif to demo new boards hub improvements.

此外,我們已跨工作專案窗體、面板和待辦專案頁面推出效能增強功能。 透過這些變更,您可以預期 New Boards 符合以舊版面板設定的效能標準。

開發和部署控制件

我們現在會根據您的項目設定方式,從工作專案中移除開發和/或部署控件。 例如,您可以設定項目設定來關閉 Repos 和/或 Pipelines。

Screenshots of DevOps services.

當您移至工作專案時,表單中將會隱藏對應的開發和部署控制項。

Screenshots of related work.

如果您決定將 GitHub 存放庫連線至 Azure Boards,則會顯示 GitHub 存放庫的開發控制件。

Screenshots of development control .

Azure Pipelines

Azure Resource Manager 服務連線的工作負載身分識別同盟現已正式推出

在 9 月,我們 宣佈 能夠在不使用秘密的情況下設定 Azure 服務連線。 此後,許多客戶都採用這項功能,我們很高興宣佈這項功能現已正式推出。

如果您尚未使用工作負載身分識別同盟,您可以利用下列方式沒有過期秘密的免費 Azure 服務連線:

若要使用工作負載身分識別同盟建立新的 Azure 服務連線,請在 Azure 服務聯機建立體驗中選取 [工作負載身分識別同盟][自動]:

Screenshot of Workload identity federation (automatic).

若要轉換先前建立的 Azure 服務連線,請在選取連線之後選取 [轉換] 動作:

Screenshot of Convert action.

若要轉換多個服務連線,您可以使用自動化,例如此 PowerShell 文稿:

#!/usr/bin/env pwsh
<# 
.SYNOPSIS 
    Convert multiple Azure Resource Manager service connection(s) to use Workload identity federation

.LINK
    https://aka.ms/azdo-rm-workload-identity-conversion

.EXAMPLE
    ./convert_azurerm_service_connection_to_oidc_simple.ps1 -Project <project> -OrganizationUrl https://dev.azure.com/<organization>
#> 
#Requires -Version 7.3

param ( 
    [parameter(Mandatory=$true,HelpMessage="Name of the Azure DevOps Project")]
    [string]
    [ValidateNotNullOrEmpty()]
    $Project,

    [parameter(Mandatory=$true,HelpMessage="Url of the Azure DevOps Organization")]
    [uri]
    [ValidateNotNullOrEmpty()]
    $OrganizationUrl
) 
$apiVersion = "7.1"
$PSNativeCommandArgumentPassing = "Standard" 

#-----------------------------------------------------------
# Log in to Azure
$azdoResource = "499b84ac-1321-427f-aa17-267ca6975798"
az login --allow-no-subscriptions --scope ${azdoResource}/.default
$OrganizationUrl = $OrganizationUrl.ToString().Trim('/')

#-----------------------------------------------------------
# Retrieve the service connection
$getApiUrl = "${OrganizationUrl}/${Project}/_apis/serviceendpoint/endpoints?authSchemes=ServicePrincipal&type=azurerm&includeFailed=false&includeDetails=true&api-version=${apiVersion}"
az rest --resource $azdoResource -u "${getApiUrl} " -m GET --query "sort_by(value[?authorization.scheme=='ServicePrincipal' && data.creationMode=='Automatic' && !(isShared && serviceEndpointProjectReferences[0].projectReference.name!='${Project}')],&name)" -o json `
        | Tee-Object -Variable rawResponse | ConvertFrom-Json | Tee-Object -Variable serviceEndpoints | Format-List | Out-String | Write-Debug
if (!$serviceEndpoints -or ($serviceEndpoints.count-eq 0)) {
    Write-Warning "No convertible service connections found"
    exit 1
}

foreach ($serviceEndpoint in $serviceEndpoints) {
    # Prompt user to confirm conversion
    $choices = @(
        [System.Management.Automation.Host.ChoiceDescription]::new("&Convert", "Converting service connection '$($serviceEndpoint.name)'...")
        [System.Management.Automation.Host.ChoiceDescription]::new("&Skip", "Skipping service connection '$($serviceEndpoint.name)'...")
        [System.Management.Automation.Host.ChoiceDescription]::new("&Exit", "Exit script")
    )
    $prompt = $serviceEndpoint.isShared ? "Convert shared service connection '$($serviceEndpoint.name)'?" : "Convert service connection '$($serviceEndpoint.name)'?"
    $decision = $Host.UI.PromptForChoice([string]::Empty, $prompt, $choices, $serviceEndpoint.isShared ? 1 : 0)

    if ($decision -eq 0) {

        Write-Host "$($choices[$decision].HelpMessage)"
    } elseif ($decision -eq 1) {
        Write-Host "$($PSStyle.Formatting.Warning)$($choices[$decision].HelpMessage)$($PSStyle.Reset)"
        continue 
    } elseif ($decision -ge 2) {
        Write-Host "$($PSStyle.Formatting.Warning)$($choices[$decision].HelpMessage)$($PSStyle.Reset)"
        exit 
    }

    # Prepare request body
    $serviceEndpoint.authorization.scheme = "WorkloadIdentityFederation"
    $serviceEndpoint.data.PSObject.Properties.Remove('revertSchemeDeadline')
    $serviceEndpoint | ConvertTo-Json -Depth 4 | Write-Debug
    $serviceEndpoint | ConvertTo-Json -Depth 4 -Compress | Set-Variable serviceEndpointRequest
    $putApiUrl = "${OrganizationUrl}/${Project}/_apis/serviceendpoint/endpoints/$($serviceEndpoint.id)?operation=ConvertAuthenticationScheme&api-version=${apiVersion}"
    # Convert service connection
    az rest -u "${putApiUrl} " -m PUT -b $serviceEndpointRequest --headers content-type=application/json --resource $azdoResource -o json `
            | ConvertFrom-Json | Set-Variable updatedServiceEndpoint
    
    $updatedServiceEndpoint | ConvertTo-Json -Depth 4 | Write-Debug
    if (!$updatedServiceEndpoint) {
        Write-Debug "Empty response"
        Write-Error "Failed to convert service connection '$($serviceEndpoint.name)'"
        exit 1
    }
    Write-Host "Successfully converted service connection '$($serviceEndpoint.name)'"
}

如需詳細資訊,請瀏覽我們的

Pipelines 代理程式會更突出地顯示資源使用率問題

去年 10 月 ,我們新增了追蹤 Pipelines 代理程式記憶體和磁碟空間使用量的能力。

為了讓客戶知道,他們可能有資源限制,例如其代理程式的記憶體或磁碟空間限制,我們讓資源限制更加明顯:

Screenshot of Limited memory and disk space warning.

如果您看到上述任何訊息,這可能是因為工作使用比代理程序維度更多的資源來造成代理程式無法回應,而且管線作業失敗:

“我們不再聽到經紀人的聽證會”

在這種情況下,啟用 詳細資訊記錄 以取得更精細的資源使用率訊息,並追蹤代理程序資源用盡的位置。 如果您使用自我裝載代理程式,請確定您的代理程式有足夠的資源。

節點 6 工作執行器的頻外安裝

Azure Pipelines 提供兩個版本的代理程序套件:

  • vsts-agent-* 套件支援使用節點 6 來執行的工作。
  • pipelines-agent-* 套件不支援需要節點 6 執行的工作。

建立自我裝載代理程式的客戶可以從管線代理程式發行頁面下載這些代理程式。 代理程式隨附的 Node 版本可用來執行工作。 請參閱 節點執行器版本

在代理程式註冊之後,從 pipelines-agent-* 套件安裝的代理程式現在會下載未隨附於代理程式的節點版本,而且不會在組織設定的「工作限制」下封鎖。 這可讓客戶使用 pipelines-agent-* 代理程式套件,並在組織設定中使用「工作限制」來控制 Node 6 的安裝。

延遲核准

核准 可用來在部署上註銷。 不過,有一種情況是授與核准的時間,以及部署應該開始的時間不相符。 例如,針對您檢閱的特定部署,您知道它是超出界限的部署。 想像一下,它不能立即繼續,而是應該在夜間進行。

為了涵蓋這類案例,我們新增了延後 YAML 管線核准的選項。 現在,您可以核准管線執行,並指定核准何時生效。

Screenshot of approve a pipeline run.

當您選取 [延遲核准] 時,您可以設定核准生效的時間。

Screenshot of Defer approval.

Screenshot of after_approval_deferred.

核准會在檢查面板中顯示為延遲。 延遲到時間之後,核准就會生效。

Screenshot of approval is effective.

排序核准和檢查

使用此短期衝刺,您可以指定核准和檢查執行的順序。

核准 並檢查可讓您控制部署至生產環境。 例如,您可以指定只允許在存放庫分支上 main 執行的管線使用生產ARM服務連線。 此外,您可以要求人工核准,而且系統通過效能檢查。

直到今天為止,所有核准和檢查都會以平行方式執行,但獨佔鎖定除外。 這表示如果您的部署程式需要經過效能檢查,才能獲得手動核准,您就無法在 Azure Pipelines 中強制執行此動作。 您必須依賴核准指示和內部程式檔。

在此短期衝刺中,我們引進了 核准 和檢查中的排序。 現在有五種 核准 和檢查類別:

  1. 靜態檢查:分支控件、必要範本和評估成品
  2. 動態檢查核准
  3. 動態檢查:核准、叫用 Azure 函式、叫用 REST API、上班時間、查詢 Azure 監視器警示
  4. 動態檢查核准
  5. 獨佔鎖定

Screenshot of add check.

訂單也會顯示在 [核准 和檢查] 索引標籤中。

Screenshot of approvals and checks tab.

在每個類別內,檢查會以平行方式執行。 也就是說,如果您有叫用 Azure 函式檢查和上班時間檢查,它們會同時執行。

Screenshot of checks for deploy.

檢查類別會逐一執行,如果一個失敗,則不會執行其餘檢查。 這表示如果您有分支控件檢查和核准,如果 Branch 控件失敗,則核准也會失敗。 因此,不會傳送不需要的電子郵件。

Screenshot of checks for deploy fail.

您可以在執行所有動態檢查、使用動態檢查核准之後,或在進行動態檢查之前,先進行手動驗證,再使用動態檢查核准,在部署上註銷。

編輯 YAML 管線時,預設會驗證並儲存

不正確的 YAML 管線可能會導致浪費時間和精力。 為了改善管線編輯生產力,我們正在變更編輯器中的 [ 儲存 ] 按鈕,以執行 YAML 驗證。

Screenshot of new button.

Screenshot of validate and save.

如果您的管線發生錯誤,您仍然可以儲存它。

Screenshot of pipeline is valid.

Screenshot of errors detected.

我們也改善了 驗證 體驗,因此您可以在更容易了解的清單中看到錯誤。

Screenshot of errors list.

Azure Repos

防止未經授權的使用者將管線設定為建置原則

防止未經授權的使用者將管線設定為建置原則

之前,當您新增組建原則時,可以設定從下拉式清單中執行任何管線(包括您沒有 佇列組建許可權的 管線)。 同樣地,即使已設定為執行您沒有 佇列組建許可權的 管線,您也可以編輯現有的建置原則。

現在,我們正在防止用戶這麼做。 如果使用者拒絕 將指定管線的組建 許可權排入佇列,則在新增組建原則時,該管線會在下拉式清單中顯示為已停用(灰色)。

請參閱下圖,其中顯示名為「沙盒」的管線,其中 佇列組建 許可權遭到拒絕。

Screenshot of permissions for Sandbox.

請參閱下圖,其中顯示當具有拒絕 佇列組建 許可權的用戶嘗試新增組建原則時,下拉式清單中名為「沙盒」的管線已停用(灰色)。

Screenshot of add build policy.

當設定為執行名為 「Sandbox」 的管線的組建原則已經存在時,沒有 佇列組建 許可權的使用者將無法編輯或檢視建置原則。 下圖顯示此案例。

Screenshot of build validation.

當使用者嘗試刪除這類原則時,會顯示要求刪除確認的快顯對話方塊。

Screenshot of confirm deletion.

這些變更也適用於任何導致建立或編輯建置原則的 API 呼叫。 當其中任何一個動作都是使用沒有 佇列組建 許可權的使用者身分識別來執行時,呼叫將會失敗傳回適當的錯誤碼,以及錯誤訊息,指出 “TFS.WebApi.Exception: TF401027: 您需要此管線的 QueueBuild 許可權來執行此動作。」。

使用沒有佇列組建許可權的 來刪除透過 user identity API 完成的建置原則將會成功,而且不會完成任何警告或預防(不會變更透過 API 刪除的方式)。

Azure Artifacts

Rust Crates 的支援已正式推出

從 2024 年 2 月 16 日起,Rust Crates 支援將成為 Azure Artifacts 的正式推出功能。 系統會使用適用於其他支援通訊協定的相同定價模式來啟用計費計量。

npm 稽核的 Azure Artifacts 支援

Azure Artifacts 現在支援 npm auditnpm audit fix 命令。 此功能可讓用戶藉由自動更新不安全的套件版本來分析和修正其專案的弱點。 若要深入瞭解, 請使用 npm 稽核來偵測並修正套件弱點

下一步

注意

這些功能將在未來兩到三周內推出。

前往 Azure DevOps 並查看。

如何提供意見反應

我們很樂意聽到您對於這些功能的看法。 使用說明功能表來回報問題或提供建議。

Make a suggestion

您也可以在 Stack Overflow 上的社群取得建議和您的問題。

感謝您!

丹·海雷姆