Συνεχίζουμε την κριτική μας για ένα υπέροχο εργαλείο για ανάπτυξη για 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
Για παράδειγμα, φτιάχνουμε κάποια γεννήτρια τυχαίων τιμών. Δώστε προσοχή στη σύνταξη της δήλωσης μιας μεταβλητής μέσα σε αυτό το στάδιο· αυτή η λειτουργία εισήχθη.
Στο επόμενο βήμα, περνάμε τη μεταβλητή στο σενάριο, ναι, ναι, δεν είναι δυνατό απευθείας, πρέπει να είναι μέσω ενός επιχειρήματος.
Σενάριο κάτω από spoiler
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
Ή
Bash
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