Го продолжуваме нашиот преглед на прекрасна алатка за развој за Windows и повеќе, Azure DevOps. Овој пат, бидејќи многу страдав со променливите на животната средина, решив да го ставам целото искуство во една статија.
Поаѓајќи од фактот дека тие имаат различна синтакса за секоја средина за извршување, завршувајќи со недостаток на стандардна способност за пренос на променливи од една фаза на гасоводот во друга.
Ќе направам резервација дека главните примери ќе бидат на Release Pipelines, бидејќи YAML сè уште не стигнал до таму и ми треба функционалноста на многу фази и многу артефакти. Ова, се чини, стана достапно во обичните цевководи, што практично ги изедначува по функционалност. Во Pipelines YAML, додадовме мал графички совет за приказ на текстот со параметри што може да се постават. Многу е погодно; не мора да ја поминувате документацијата за секој модул. Но, ова ќе го опишам во следната статија, но засега еве слика од самата иновација.
Складирање и употреба
Да почнеме со фактот дека имаме стандардни променливи во системот. Тие започнуваат, во зависност од нивното потекло, со зборовите 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 на целните машини, треба да го пренесете ова преку аргумент до скриптата користејќи
Истите закони не важат за вашите сопствени променливи; овде веќе сте одговорни за синтаксата. Променливите може да се постават локално во секоја задача.
Или глобално до продавницата за променливи, а потоа поврзете ги од продавницата. Многу удобно.
Како бонус, ако променливите се многу тајни, тие можат да се складираат во облакот Azure во складиште наречено Azure Vault; можете да го поврзете Vault со проектот во Библиотеката.
Во принцип, сè е јасно со променливите; во цевководи тие сè уште можат да се постават рачно за секое лансирање; во пуштањето нема таква функционалност. Можете повторно да видите што префрлате на гасоводот во дневниците за иницијализација на агентот, но имајте на ум дека тие се веќе таму во конвертирана форма.
Динамички променливи
Забавата започнува кога сакаме да добиеме некоја вредност во една фаза и да ја пренесеме во следната.
Не ни беше обезбедена таква функционалност. Но, нашите раце не се за досада и со помош на 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
На пример, правиме некој генератор на случајни вредности. Обрнете внимание на синтаксата на декларирање на променлива во оваа фаза; оваа функционалност беше воведена.
Во следниот чекор, ја пренесуваме променливата на скриптата, да, да, тоа не е можно директно, мора да биде преку аргумент.
Скрипта под спојлер
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. Во следниот чекор, користејќи ја синтаксата на системската променлива, можеме да ја разгледаме.
Примерот е прилично едноставен, но функционалноста ни отвора добри можности, покрај мојата претходна
Во следната статија, доколку е потребно, ќе зборувам за цевководи YAML; таму во последно време имаше доста интересни иновации.
Извор: www.habr.com