์ฐ๋ฆฌ๋ Windows ๋ฐ ๊ธฐํ ๊ฐ๋ฐ์ ์ํ ํ๋ฅญํ ๋๊ตฌ์ธ Azure DevOps์ ๋ํ ๊ฒํ ๋ฅผ ๊ณ์ํฉ๋๋ค. ์ด๋ฒ์๋ ํ๊ฒฝ๋ณ์๋ก ์ธํด ๋ง์ ๊ณ ๋ฏผ์ ํ๋ค๊ฐ ๊ทธ ๋ชจ๋ ๊ฒฝํ์ ํ ๊ธ์ ๋ด๊ธฐ๋ก ํ์ต๋๋ค.
๊ฐ ์คํ ํ๊ฒฝ์ ๋ํด ์๋ก ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์๋ค๋ ์ฌ์ค์์ ์์ํ์ฌ ํ์ดํ๋ผ์ธ์ ํ ๋จ๊ณ์์ ๋ค๋ฅธ ๋จ๊ณ๋ก ๋ณ์๋ฅผ ์ ์กํ๋ ํ์ค ๊ธฐ๋ฅ์ด ๋ถ์กฑํ๋ค๋ ์ฌ์ค๋ก ๋๋ฉ๋๋ค.
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) )
์ ์กํ๋ ค๋ ๋ณ์์ ๋น ๊ฐ์ ์ค์ ํ๊ณ ๋ฒ์ - ๋ฆด๋ฆฌ์ค๋ฅผ ์ค์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์์์ ๊ฐ ์์ฑ๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค. ์ด ๋จ๊ณ ๋ด์์ ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ตฌ๋ฌธ์ ์ฃผ์ํ์ธ์. ์ด ๊ธฐ๋ฅ์ด ๋์
๋์์ต๋๋ค.
๋ค์ ๋จ๊ณ์์๋ ๋ณ์๋ฅผ ์คํฌ๋ฆฝํธ์ ์ ๋ฌํฉ๋๋ค. ์, ์, ์ง์ ์ ์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ๋ฉฐ ์ธ์๋ฅผ ํตํด ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค.
์คํฌ์ผ๋ฌ ์๋ ์คํฌ๋ฆฝํธ
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 ํ์ดํ๋ผ์ธ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ต๊ทผ์๋ ํฅ๋ฏธ๋ก์ด ํ์ ์ด ๋ง์ด ์์์ต๋๋ค.
์ถ์ฒ : habr.com