チーム自動化ルールの一般提供と AB# 検証の改善

GitHub の Azure Boards アプリによる AB# 検証と Team Automation ルールの改善が一般公開されたことをお知らせします。 作業項目へのリンクが無効な場合に通知を受け取ることができるように、AB# 検証が改善されました。 Team Automation ルールでは、子項目の状態に基づいて作業項目の開始と終了/解決を自動化するように各バックログ レベルを構成できるようになりました。

この更新プログラムでは、コード スキャンでのカスタム CodeQL クエリのサポートも導入されています。 これにより、コードベースに固有の問題を特定するために調整された独自のクエリを作成できます。

詳細については、リリース ノートを参照してください。

Azure DevOps 用の GitHub Advanced Security

Azure Boards

Azure Pipelines

Azure DevOps 用の GitHub Advanced Security

Azure DevOps 用の GitHub Advanced Security でカスタム CodeQL クエリがサポートされるようになりました

コード スキャンでのカスタム CodeQL クエリのサポートが導入されたことをお知らせします。 これにより、コードベースに固有の問題を特定するために調整された独自のクエリを作成できます。 これで、カスタム クエリを含むパックを作成して発行し、パイプラインでこれらのクエリを実行し、組織に関連する脆弱性の検出をカスタマイズできるようになりました。

Azure DevOps の GitHub Advanced Security でのコード スキャンにカスタム クエリを使用する方法の詳細については、GitHub Advanced Security for Azure DevOps のコード スキャン アラートを するを参照してください。

私たちはあなたの入力を大切にしています。 ご質問やフィードバックがある場合は、 Developer Community でコミュニティに参加することをお勧めします。

Azure Boards

GitHub 統合 - AB# 検証の強化が一般公開されました

数スプリント前に、GitHub の Azure Boards アプリによって improved AB# 検証 のプレビューが発表されました。 作業項目のリンクの有効性についてユーザーに通知し、プル要求をマージする前に問題を特定して修正できるように、アプリを強化しました。

数週間のテストとフィードバックの後、GitHub と Azure Boards の統合を使用するすべてのユーザーがこの機能を利用できるようになりました。

検証の改善のスクリーンショット。

これは、現在の統合を改善するために作成しているいくつかの機能の最初です。 パブリック ロードマップで計画している他の Azure Boards + GitHub 統合機能 必ず確認してください。

重要

2024 年 8 月 6 日の時点で、GitHub の Azure Boards アプリでは AB# リンクが検証されなくなります。 この変更前と同様に、 AB# 構文を使用して GitHub の pull request、commit、および問題の作業項目をリンクできます。

Team Automation ルールの一般提供

Azure DevOps Service のすべてのお客様に、この機能のリリースをお知らせします。

Note

この機能は、今後 2 ~ 3 週間にわたってロールアウトされます。 2024 年 2 月上旬まで、組織で使用できない場合があります。

これで、各バックログ レベルを構成して、子項目の状態に基づいて作業項目の開始と終了 (または解決) を自動化できるようになりました。 解決しようとしている主なシナリオは 2 つあります。

  • 1 つの子項目がアクティブ化されたら、親をアクティブにします。
  • すべての子項目が閉じられたら、親を閉じます (または解決します)。

これらの設定を有効にするには、チームのバックログ レベルの構成をクリックします。 次に、[ 自動設定 > ルール] タブに移動し バックログに適用できる 2 つの異なるルールを確認します。 各バックログ レベル (要件、機能、エピック) は、チームの作業方法に応じて異なる方法で構成できます。

チーム設定のスクリーンショット。

たとえば、子タスクがアクティブに設定されている場合は、親ユーザー ストーリーをアクティブにします。 次に、すべてのタスクが完了したら、[ユーザー ストーリー] を [終了] に設定します。

ユーザー ストーリーを終了するデモを行う GIF。

この機能の詳細については、こちらのブログ記事 ドキュメント および を参照してください

この機能は、この開発者コミュニティの提案チケット 基づいて優先順位が付されました。

Azure Pipelines

1 月 31 日より前に非推奨のタスクを更新する

非推奨のタスクは、2024 年 1 月 31 日に廃止されます。 これらのタスクを使用しているパイプラインを特定するために、推奨される代替手段を含む警告メッセージが含まれています。 2024 年 1 月 31 日より前に、新しいタスク バージョンまたは代替手段を使用するようにパイプラインを更新することをお勧めします。

タスク固有の非推奨の警告のスクリーンショット。

非推奨のタスクに関連する以前のお知らせを参照してください。

Microsoft ホステッド エージェントで PowerShell 7.4 を使用する

Microsoft でホストされているすべてのエージェントは、1 月 28 日から PowerShell 7.2 LTS から PowerShell 7.4 LTS への使用を開始します。 PowerShell 7.4 の新機能および PowerShell 7.4 の一般提供を参照してください。

重大な変更をメモし、それに応じてスクリプトを更新します。

新しい Azure サービス接続シークレットは 3 か月で期限切れになります

Azure DevOps が secret を作成する Azure サービス接続では、シークレットの有効期限は 2 年ではなく 3 か月になります。

シークレットをローテーションする必要をなくすには、代わりにサービス接続を変換Workload ID フェデレーションを使用します。 次のサンプル スクリプトを使用して、複数の Azure サービス接続をワークロード ID フェデレーションにすばやく変換できます。

#!/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)'"
}

次のステップ

Note

これらの機能は、今後 2 ~ 3 週間にわたってロールアウトされます。

Azure DevOps に向かい、見てみましょう。

フィードバックの提供方法

これらの機能に関するご意見をお聞かせください。 ヘルプ メニューを使用して、問題を報告したり、提案を提供したりします。

ご提案の送信

Stack Overflow のコミュニティからアドバイスや質問に回答してもらうこともできます。

よろしくお願いします。

Dan Hellem