Χρήση μεταβλητών σε αγωγούς 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

Σενάριο κάτω από 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. Στο επόμενο βήμα, χρησιμοποιώντας τη σύνταξη μεταβλητής συστήματος, μπορούμε να το δούμε.

Χρήση μεταβλητών σε αγωγούς Azure DevOps

Το παράδειγμα είναι αρκετά απλό, αλλά η λειτουργικότητα μας ανοίγει καλές ευκαιρίες, πέρα ​​από την προηγούμενη άρθρο, όταν μπορούμε να δημιουργήσουμε μια εικονική μηχανή στο πρώτο στάδιο της δοκιμής, κάνουμε μερικούς περαιτέρω χειρισμούς με αυτήν και αρκετούς παράλληλα. Και το τελευταίο στάδιο είναι να το καταστρέψεις. Τώρα εκτελούμε αυτόματα ελέγχους του προϊόντος κάθε φορά σε νέες εικονικές μηχανές. Λαμβάνοντας υπόψη ότι ζουν για περίπου 10 λεπτά, κοστίζει μια δεκάρα.

Στο επόμενο άρθρο, εάν χρειαστεί, θα μιλήσω για τους αγωγούς YAML· υπήρξαν πολλές ενδιαφέρουσες καινοτομίες εκεί τελευταία.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο