Користење на променливи во нафтоводите на Azure DevOps

Го продолжуваме нашиот преглед на прекрасна алатка за развој за Windows и повеќе, Azure DevOps. Овој пат, бидејќи многу страдав со променливите на животната средина, решив да го ставам целото искуство во една статија.

Поаѓајќи од фактот дека тие имаат различна синтакса за секоја средина за извршување, завршувајќи со недостаток на стандардна способност за пренос на променливи од една фаза на гасоводот во друга.

Ќе направам резервација дека главните примери ќе бидат на Release Pipelines, бидејќи YAML сè уште не стигнал до таму и ми треба функционалноста на многу фази и многу артефакти. Ова, се чини, стана достапно во обичните цевководи, што практично ги изедначува по функционалност. Во Pipelines YAML, додадовме мал графички совет за приказ на текстот со параметри што може да се постават. Многу е погодно; не мора да ја поминувате документацијата за секој модул. Но, ова ќе го опишам во следната статија, но засега еве слика од самата иновација.

Користење на променливи во нафтоводите на Azure DevOps

Складирање и употреба

Да почнеме со фактот дека имаме стандардни променливи во системот. Тие започнуваат, во зависност од нивното потекло, со зборовите Release, System итн. Целосната листа (како што се испоставува, не) е достапна на документација. Целата шизофренија со синтакса е илустрирана со пример од документацијата подолу. Истата променлива има три претстави, во зависност од тоа каде ја нарекуваме.

steps:
 - bash: echo This script could use $SYSTEM_ACCESSTOKEN
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  - powershell: Write-Host "This is a script that could use $env:SYSTEM_ACCESSTOKEN"
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

Ако поставите променлива на агентот на кој се извршува задачата, таа е $(System.AccessToken). Ако сакате да го користите во скрипта за powershell на истиот агент, таа веќе ќе биде $env:SYSTEM_ACCESSTOKEN. Ако, не дај Боже, сакате да ја користите оваа променлива на некој оддалечен домаќин користејќи ја задачата PowerShell на целните машини, треба да го пренесете ова преку аргумент до скриптата користејќи моите пари. Со bash е поедноставно, можете едноставно да го пренесете внатре користејќи го аргументот и синтаксата $SYSTEM_ACCESSTOKEN.

Истите закони не важат за вашите сопствени променливи; овде веќе сте одговорни за синтаксата. Променливите може да се постават локално во секоја задача.

Користење на променливи во нафтоводите на Azure DevOps

Или глобално до продавницата за променливи, а потоа поврзете ги од продавницата. Многу удобно.

Користење на променливи во нафтоводите на Azure DevOps

Како бонус, ако променливите се многу тајни, тие можат да се складираат во облакот Azure во складиште наречено Azure Vault; можете да го поврзете Vault со проектот во Библиотеката.

Користење на променливи во нафтоводите на Azure DevOps

Во принцип, сè е јасно со променливите; во цевководи тие сè уште можат да се постават рачно за секое лансирање; во пуштањето нема таква функционалност. Можете повторно да видите што префрлате на гасоводот во дневниците за иницијализација на агентот, но имајте на ум дека тие се веќе таму во конвертирана форма.

Користење на променливи во нафтоводите на Azure DevOps

Динамички променливи

Забавата започнува кога сакаме да добиеме некоја вредност во една фаза и да ја пренесеме во следната.

Користење на променливи во нафтоводите на Azure DevOps

Не ни беше обезбедена таква функционалност. Но, нашите раце не се за досада и со помош на Google се најде решение. Фала му на Бога, Azure DevOps има API што ни овозможува да направиме малку повеќе од она што беше прикажано во интерфејсот.

Значи, ќе ни треба повик за ажурирање на глобалните променливи, што ќе го направиме директно од цевководот. Адресата е преземена од променливите на околината, истите за кои нема ниту збор во документацијата, како што беше споменато претходно. Можете сами да ги поставите или, уште повеќе, да ги хардкодирате ако ја затворат продавницата.

$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID)  )

Ја поставивме празната вредност на променливата што сакаме да ја пренесеме, поставивме Scope - Release

Користење на променливи во нафтоводите на Azure DevOps

На пример, правиме некој генератор на случајни вредности. Обрнете внимание на синтаксата на декларирање на променлива во оваа фаза; оваа функционалност беше воведена.

Користење на променливи во нафтоводите на Azure DevOps

Во следниот чекор, ја пренесуваме променливата на скриптата, да, да, тоа не е можно директно, мора да биде преку аргумент.

Користење на променливи во нафтоводите на Azure DevOps

Скрипта под спојлер

PowerShell

#Script requires stageVar variable in release variables set to Release scope

param ( [string] $expVar )
#region variables
$ReleaseVariableName = 'StageVar'
$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID)  )
#endregion


#region Get Release Definition
Write-Host "URL: $releaseurl"
$Release = Invoke-RestMethod -Uri $releaseurl -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
#endregion

#region Output current Release Pipeline
Write-Output ('Release Pipeline variables output: {0}' -f $($Release.variables | ConvertTo-Json -Depth 10))
#endregion


#region Update StageVar with new value
$release.variables.($ReleaseVariableName).value = "$expVar"
#endregion

#region update release pipeline
Write-Output ('Updating Release Definition')
$json = @($release) | ConvertTo-Json -Depth 99
Invoke-RestMethod -Uri $releaseurl -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
#endregion

#region Get updated Release Definition
Write-Output ('Get updated Release Definition')
Write-Host "URL: $releaseurl"
$Release = Invoke-RestMethod -Uri $releaseurl -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
#endregion

#region Output Updated Release Pipeline
Write-Output ('Updated Release Pipeline variables output: {0}' -f $($Release.variables | ConvertTo-Json -Depth 10))
#endregion

Или

Баш

INPUT_VAR=$1
RELEASE_VAR=$2

echo Test ID: ${INPUT_VAR}

RELEASE_URL="${SYSTEM_TEAMFOUNDATIONSERVERURI}${SYSTEM_TEAMPROJECTID}/_apis/release/releases/${RELEASE_RELEASEID}?api-version=5.0"

echo release url: $RELEASE_URL

RELEASE_JSON=$(curl -H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" $RELEASE_URL)

OUTPUT=`jq ''.variables.${RELEASE_VAR}.value' = '"${INPUT_VAR}"'' <<< $RELEASE_JSON`

curl -H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" -H "Content-Type: application/json" -X PUT -d "$OUTPUT" $RELEASE_URL

Накратко, нашата скрипта ја зема променливата myVar како влез и го користи API за да ја стави вредноста на оваа променлива во stageVar. Во следниот чекор, користејќи ја синтаксата на системската променлива, можеме да ја разгледаме.

Користење на променливи во нафтоводите на Azure DevOps

Примерот е прилично едноставен, но функционалноста ни отвора добри можности, покрај мојата претходна статии, кога можеме да создадеме виртуелна машина во првата фаза од тестирањето, да извршиме некои дополнителни манипулации со неа и неколку паралелно. И последната фаза е да се уништи. Сега правиме автоматски тестови на производот секој пат на свежи виртуелни машини. Со оглед на тоа дека живеат околу 10 минути, тоа чини еден денар.

Во следната статија, доколку е потребно, ќе зборувам за цевководи YAML; таму во последно време имаше доста интересни иновации.

Извор: www.habr.com

Додадете коментар