Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Servizi di Azure DevOps
Questa guida consente di eseguire la migrazione da Travis ad Azure Pipelines. Illustra come convertire una configurazione Travis in una configurazione di Azure Pipelines.
Differenze principali
Travis e Azure Pipelines differiscono in molti modi, tra cui:
Le compilazioni travis hanno fasi, processi e fasi, mentre Azure Pipelines prevede passaggi disposti ed eseguiti in qualsiasi ordine o raggruppamento scelto.
Azure Pipelines consente di archiviare le definizioni e i passaggi dei processi in file YAML separati nello stesso repository o in un repository diverso. Questo approccio consente di condividere i passaggi tra più pipeline.
Azure Pipelines offre pieno supporto alla costruzione e sperimentazione sui sistemi operativi Linux, Windows e macOS gestiti da Microsoft. Per altre informazioni sugli agenti ospitati, vedere Agenti ospitati da Microsoft.
Prerequisiti
- Un account GitHub in cui è possibile creare un repository. Crearne una gratuitamente.
- Un'organizzazione di Azure DevOps. Crearne una gratuitamente. Se il team ha già un'organizzazione di Azure DevOps, assicurarsi di essere un amministratore del progetto Azure DevOps che si vuole usare.
- Possibilità di eseguire pipeline negli agenti ospitati da Microsoft. È possibile acquistare un job parallelo oppure richiedere un livello gratuito.
- Conoscenza di base di Azure Pipelines. Se non si ha familiarità con Azure Pipelines, vedere gli articoli seguenti per altre informazioni su Azure Pipelines e su come funziona prima di avviare la migrazione:
Lingua
Travis usa la language parola chiave per identificare l'ambiente di compilazione prerequisito da configurare per il tuo progetto. Ad esempio, per selezionare Node.js 16.x:
.travis.yml
language: node_js
node_js:
- 22
Gli agenti ospitati da Microsoft includono gli SDK per molte lingue per impostazione predefinita. Per usare una versione specifica della lingua, potrebbe essere necessario usare un'attività di selezione della lingua per configurare l'ambiente.
Ad esempio, per selezionare Node.js 16.x:
azure-pipelines.yml
steps:
- task: UseNode@1
inputs:
version: '22.x'
Associazioni linguistiche
La language parola chiave in Travis CI funziona sia come versione degli strumenti di linguaggio da usare che come segnale implicito che vengono eseguiti molti passaggi di compilazione. In Azure Pipelines specificare i comandi da eseguire.
Ecco una guida alla traduzione dalla language parola chiave ai comandi eseguiti automaticamente per le lingue più usate:
| Lingua | Comandi |
|---|---|
ccpp |
./configuremakemake install |
csharp |
nuget restore [solution.sln]msbuild /p:Configuration=Release [solution.sln] |
clojure |
lein depslein test |
go |
go get -t -v ./...make
ogo test |
javagroovy |
Gradle:gradle assemblegradle checkMaven: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -Vmvn test -BAnt: ant test |
node_js |
npm install
onpm cioyarnnpm test |
objective-cswift |
pod install
obundle exec pod installxcodebuild -scheme [scheme] build test \| xcpretty |
perl |
cpanm --quiet --installdeps --notest .Build.PL: perl ./Build.pl./Build testMakefile.PL: perl Makefile.PLmake testMakefile: make test |
php |
phpunit |
python |
pip install -r requirements.txt |
ruby |
bundle install --jobs=3 --retry=3rake |
È possibile abilitare linguaggi meno comuni, ma richiedono un altro passaggio di installazione delle dipendenze o un'esecuzione all'interno di un contenitore Docker:
| Lingua | Comandi |
|---|---|
crystal |
docker run -v $(pwd):/src -w /src crystallang/crystal shards installdocker run -v $(pwd):/src -w /src crystallang/crystal crystal spec |
d |
sudo wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.listsudo apt-get updatesudo apt-get -y --allow-unauthenticated install --reinstall d-apt-keyringsudo apt-get updatesudo apt-get install dmd-compiler dubdub test --compiler=dmd |
dart |
wget https://dl-ssl.google.com/linux/linux_signing_key.pub -O - \| sudo apt-key add -wget https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list -O /etc/apt/sources.list.d/dart_stable.listsudo apt-get updatesudo apt-get install dart/usr/lib/dart/bin/pub get/usr/lib/dart/bin/pub run test |
erlang |
sudo apt-get install rebarrebar get-depsrebar compilerebar skip_deps=true eunit |
elixir |
sudo apt-get install elixirmix local.rebar --forcemix local.hex --forcemix deps.getmix test |
haskell |
sudo apt-get install cabal-installcabal install --only-dependencies --enable-testscabal configure --enable-testscabal buildcabal test |
haxe |
sudo apt-get install haxeyes \| haxelib install [hxml]haxe [hxml] |
julia |
sudo apt-get install juliajulia -e "using Pkg; Pkg.build(); end"julia --check-bounds=yes -e "Pkg; Pkg.test(coverage=true); end" |
nix |
docker run -v $(pwd):/src -w /src nixos/nix nix-build |
perl6 |
sudo apt-get install rakudoPERL6LIB=lib prove -v -r --exec=perl6 t/ |
rust |
curl -sSf https://sh.rustup.rs | sh -s -- -ycargo build --verbosecargo test --verbose |
scala |
echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | /etc/apt/sources.list.d/sbt.listsudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823sudo apt-get updatesudo apt-get install sbtsbt ++2.11.6 test |
smalltalk |
docker run -v $(pwd):/src -w /src hpiswa/smalltalkci smalltalkci |
Selezioni di più lingue
È anche possibile configurare un ambiente che supporta la creazione di applicazioni diverse in più lingue. Ad esempio, per garantire che l'ambiente di compilazione sia destinato a sia Node.JS 16.x, che Ruby 3.2 o versione superiore.
azure-pipelines.yml
steps:
- task: UseNode@1
inputs:
version: '8.x'
- task: UseRubyVersion@0
inputs:
versionSpec: '>= 3.2'
Fasi
In Travis i passaggi vengono definiti in un set fisso di fasi denominate, ad before_install esempio o before_script. Azure Pipelines non ha fasi predefinite e i passaggi possono essere raggruppati, nominati e organizzati in qualsiasi modo che abbia senso per la pipeline.
Ad esempio:
.travis.yml
before_install:
- npm install -g bower
install:
- npm install
- bower install
script:
- npm run build
- npm test
azure-pipelines.yml
steps:
- script: npm install -g bower
- script: npm install
- script: bower install
- script: npm run build
- script: npm test
In alternativa, i passaggi possono essere raggruppati e facoltativamente denominati:
azure-pipelines.yml
steps:
- script: |
npm install -g bower
npm install
bower install
displayName: 'Install dependencies'
- script: npm run build
- script: npm test
Attività in parallelo
Travis fornisce il parallelismo consentendo di definire una fase, ovvero un gruppo di processi eseguiti in parallelo. Una costruzione Travis può avere più fasi; una volta completati tutti i processi in una fase, viene avviata la fase successiva.
Con Azure Pipelines è possibile rendere ogni passaggio o fase dipendente da qualsiasi altro passaggio. In questo modo, è possibile specificare i passaggi eseguiti in modo seriale e quali possono essere eseguiti in parallelo. Quindi è possibile aprire un ventaglio con più passaggi eseguiti in parallelo dopo il completamento di un passaggio, per poi richiudere il ventaglio con un singolo passaggio che viene eseguito successivamente. Questo modello offre opzioni per definire flussi di lavoro complessi, se necessario. Per il momento, ecco un semplice esempio:
Ad esempio, per eseguire uno script di compilazione, al termine dell'esecuzione degli unit test e dei test di integrazione in parallelo e al termine di tutti i test, creare un pacchetto degli artefatti e quindi eseguire la distribuzione in fase di pre-produzione:
.travis.yml
jobs:
include:
- stage: build
script: ./build.sh
- stage: test
script: ./test.sh unit_tests
- script: ./test.sh integration_tests
- stage: package
script: ./package.sh
- stage: deploy
script: ./deploy.sh pre_prod
azure-pipelines.yml
jobs:
- job: build
steps:
- script: ./build.sh
- job: test1
dependsOn: build
steps:
- script: ./test.sh unit_tests
- job: test2
dependsOn: build
steps:
- script: ./test.sh integration_tests
- job: package
dependsOn:
- test1
- test2
script: ./package.sh
- job: deploy
dependsOn: package
steps:
- script: ./deploy.sh pre_prod
Esecuzione parallela avanzata
In Azure Pipelines sono disponibili altre opzioni e si controlla il modo in cui si orchestra la pipeline.
Ad esempio, un team ha un set di test unitari a esecuzione rapida e un altro set di test di integrazione più lenti. Il team vuole iniziare a creare il file .ZIP per un rilascio non appena le unità sono completate perché forniscono un'elevata certezza che il build offra un buon pacchetto. Ma prima di eseguire la distribuzione in fase di pre-produzione, vogliono attendere il superamento di tutti i test:
In Azure Pipelines è possibile farlo in questo modo:
azure-pipelines.yml
jobs:
- job: build
steps:
- script: ./build.sh
- job: test1
dependsOn: build
steps:
- script: ./test.sh unit_tests
- job: test2
dependsOn: build
steps:
- script: ./test.sh integration_tests
- job: package
dependsOn: test1
script: ./package.sh
- job: deploy
dependsOn:
- test1
- test2
- package
steps:
- script: ./deploy.sh pre_prod
Riutilizzo dei passaggi
In Travis è possibile usare matrici per eseguire più esecuzioni in una singola configurazione. In Azure Pipelines è possibile usare matrici nello stesso modo, ma è anche possibile implementare il riutilizzo della configurazione con i modelli.
Esempio: Variabile di ambiente in una matrice
Uno dei modi più comuni per eseguire diverse compilazioni con una leggera variazione consiste nel modificare l'esecuzione usando le variabili di ambiente. Ad esempio, lo script di compilazione può cercare la presenza di una variabile di ambiente e modificare la modalità di compilazione del software o il modo in cui testa il software.
Usare una matrice per eseguire una configurazione di compilazione più volte, una volta per ogni valore nella variabile di ambiente. Ad esempio, eseguire uno script specificato tre volte, ogni volta con un'impostazione diversa per una variabile di ambiente:
.travis.yml
os: osx
env:
jobs:
- MY_ENVIRONMENT_VARIABLE: 'one'
- MY_ENVIRONMENT_VARIABLE: 'two'
- MY_ENVIRONMENT_VARIABLE: 'three'
script: echo $MY_ENVIRONMENT_VARIABLE
azure-pipelines.yml
pool:
vmImage: 'macOS-latest'
strategy:
matrix:
set_env_to_one:
MY_ENVIRONMENT_VARIABLE: 'one'
set_env_to_two:
MY_ENVIRONMENT_VARIABLE: 'two'
set_env_to_three:
MY_ENVIRONMENT_VARIABLE: 'three'
steps:
- script: echo $(MY_ENVIRONMENT_VARIABLE)
Esempio: Versioni del linguaggio in una matrice
Un altro scenario comune consiste nello svolgere operazioni in diversi ambienti linguistici. Travis supporta una definizione implicita usando la language parola chiave , mentre Azure Pipelines prevede un'attività esplicita per definire come configurare tale versione del linguaggio.
È possibile usare le opzioni della matrice di variabili di ambiente in Azure Pipelines per abilitare una matrice per versioni diverse del linguaggio. Ad esempio, è possibile impostare una variabile di ambiente in ogni variabile matrice corrispondente alla versione del linguaggio che si vuole usare, quindi nel primo passaggio usare tale variabile di ambiente per eseguire l'attività di configurazione della lingua:
.travis.yml
os: linux
jobs:
include:
- rvm: 2.3.7
- rvm: 2.4.4
- rvm: 2.5.1
script: ruby --version
azure-pipelines.yml
vmImage: 'ubuntu-latest'
strategy:
matrix:
ruby 2.3:
ruby_version: '2.3.7'
ruby 2.4:
ruby_version: '2.4.4'
ruby 2.5:
ruby_version: '2.5.1'
steps:
- task: UseRubyVersion@0
inputs:
versionSpec: $(ruby_version)
- script: ruby --version
Esempio: Sistemi operativi all'interno di una matrice
È anche comune eseguire compilazioni in più sistemi operativi. Travis supporta questa definizione usando la os parola chiave , mentre Azure Pipelines consente di configurare il sistema operativo selezionando il pool in cui eseguire usando la vmImage parola chiave .
Ad esempio, è possibile impostare una variabile di ambiente in ogni variabile di matrice che corrisponde all'immagine del sistema operativo che si vuole usare. Imposta quindi il pool di macchine sulla variabile impostata:
.travis.yml
jobs:
include:
- os: linux
- os: windows
- os: osx
script: echo Hello, world!
azure-pipelines.yml
strategy:
matrix:
linux:
imageName: 'ubuntu-latest'
mac:
imageName: 'macOS-latest'
windows:
imageName: 'windows-latest'
pool:
vmImage: $(imageName)
steps:
- script: echo Hello, world!
Gestione del successo e del fallimento
Travis consente di specificare i passaggi eseguiti quando la compilazione ha esito positivo, usando la after_success fase o quando la compilazione ha esito negativo, usando la after_failure fase . Usando Azure Pipelines, è possibile definire condizioni di esito positivo e negativo in base al risultato di qualsiasi passaggio, che consente pipeline più flessibili e potenti.
.travis.yml
build: ./build.sh
after_success: echo Success
after_failure: echo Failed
azure-pipelines.yml
steps:
- script: ./build.sh
- script: echo Success
condition: succeeded()
- script: echo Failed
condition: failed()
Gestione avanzata degli errori e delle operazioni riuscite
In Azure Pipelines è possibile programmare un set flessibile di dipendenze e condizioni per il controllo del flusso tra processi.
È possibile configurare i processi per l'esecuzione in base all'esito positivo o negativo dei processi precedenti o in base alle variabili di ambiente.
È anche possibile configurare i processi per l'esecuzione sempre, indipendentemente dall'esito positivo di altri processi.
Ad esempio, se si vuole eseguire uno script quando la compilazione ha esito negativo, ma solo se è in esecuzione come compilazione nel ramo principale:
azure-pipelines.yml
jobs:
- job: build
steps:
- script: ./build.sh
- job: alert
dependsOn: build
condition: and(failed(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
steps:
- script: ./sound_the_alarms.sh
Variabili predefinite
Sia Travis che Azure Pipelines impostano più variabili di ambiente per facilitare l'ispezione e l'interazione con l'ambiente di esecuzione del sistema CI.
Nella maggior parte dei casi, una variabile di Azure Pipelines corrisponde alla variabile di ambiente in Travis. Di seguito è riportato un elenco delle variabili di ambiente comunemente usate in Travis e delle relative analogie in Azure Pipelines:
| Travis | Azure Pipelines | Descrizione |
|---|---|---|
CI=true oppure TRAVIS=true |
TF_BUILD=True |
Indica che la compilazione è in esecuzione nel sistema CI; utile per gli script destinati anche all'esecuzione in locale durante lo sviluppo. |
TRAVIS_BRANCH |
Compilazioni CI:BUILD_SOURCEBRANCHCompilazioni delle richieste pull SYSTEM_PULLREQUEST_TARGETBRANCH |
Il nome del ramo per cui è in coda la build o il nome del ramo a cui è destinata la richiesta di pull. |
TRAVIS_BUILD_DIR |
BUILD_SOURCESDIRECTORY |
Posizione della sorgente estratta e della directory di lavoro predefinita. |
TRAVIS_BUILD_NUMBER |
BUILD_BUILDID |
Identificatore numerico univoco per la chiamata di compilazione corrente. |
TRAVIS_COMMIT |
Compilazioni CI:BUILD_SOURCEVERSION |
ID commit attualmente in fase di compilazione. |
TRAVIS_COMMIT |
Compilazioni delle richieste pullgit rev-parse HEAD^2 |
Per le compilazioni di convalida delle richieste pull, Azure Pipelines imposta BUILD_SOURCEVERSION il commit di merge risultante della richiesta pull in main. Questo comando identifica il commit della richiesta pull stesso. |
TRAVIS_COMMIT_MESSAGE |
BUILD_SOURCEVERSIONMESSAGE |
Messaggio di log del commit in fase di compilazione. |
TRAVIS_EVENT_TYPE |
BUILD_REASON |
Motivo per cui il build è in coda; una mappa dei valori si trova nella tabella "motivi del build" qui sotto. |
TRAVIS_JOB_NAME |
AGENT_JOBNAME |
Nome del lavoro corrente, se specificato. |
TRAVIS_OS_NAME |
AGENT_OS |
Sistema operativo su cui è in esecuzione il processo; una mappa dei valori si trova nella tabella "sistemi operativi" riportata di seguito. |
TRAVIS_PULL_REQUEST |
Azure Repos:SYSTEM_PULLREQUEST_PULLREQUESTIDGitHub: SYSTEM_PULLREQUEST_PULLREQUESTNUMBER |
Il numero della richiesta pull che ha attivato questa compilazione. Per le compilazioni di GitHub, si tratta di un identificatore univoco che non è il numero di pull request. |
TRAVIS_PULL_REQUEST_BRANCH |
SYSTEM_PULLREQUEST_SOURCEBRANCH |
Nome del ramo da cui ha avuto origine la pull request. |
TRAVIS_PULL_REQUEST_SHA |
Compilazioni delle richieste pullgit rev-parse HEAD^2 |
Per le compilazioni di convalida delle richieste pull, Azure Pipelines imposta BUILD_SOURCEVERSION il commit di merge risultante della richiesta pull in main. Questo comando identifica il commit della richiesta pull stesso. |
TRAVIS_PULL_REQUEST_SLUG |
Nome del repository con fork, se la pull request è stata originata in un fork. In Azure Pipelines non esiste alcuna analogia. | |
TRAVIS_REPO_SLUG |
BUILD_REPOSITORY_NAME |
Nome del repository per cui è configurata la compilazione. |
TRAVIS_TEST_RESULT |
AGENT_JOBSTATUS |
Travis imposta questo valore su 0 se tutti i passaggi precedenti hanno esito positivo (restituire 0). Per Azure Pipelines, verificare che AGENT_JOBSTATUS=Succeeded. |
TRAVIS_TAG |
BUILD_SOURCEBRANCH |
Se questa compilazione viene accodata dalla creazione di un tag, questo valore è il nome del tag. Per Azure Pipelines, BUILD_SOURCEBRANCH è impostato sul nome di riferimento Git completo, come ad esempio refs/tags/tag_name. |
TRAVIS_BUILD_STAGE_NAME |
Il nome del palco di Travis. Come abbiamo visto in precedenza, Azure Pipelines gestisce il controllo dei flussi usando i job. È possibile fare riferimento a AGENT_JOBNAME. |
Motivi di compilazione:
La TRAVIS_EVENT_TYPE variabile contiene valori che eseguono il mapping ai valori forniti dalla variabile Azure Pipelines BUILD_REASON :
| Travis | Azure Pipelines | Descrizione |
|---|---|---|
push |
IndividualCI |
La build è una integrazione continua derivante da un push. |
pull_request |
PullRequest |
La compilazione è stata messa in coda per convalidare una richiesta pull. |
api |
Manual |
La build è stata accodata dall'API REST o da una richiesta manuale nella pagina web. |
cron |
Schedule |
La compilazione è stata pianificata. |
Sistemi operativi:
La TRAVIS_OS_NAME variabile contiene valori che eseguono il mapping ai valori forniti dalla variabile Azure Pipelines AGENT_OS :
| Travis | Azure Pipelines | Descrizione |
|---|---|---|
linux |
Linux |
La compilazione è in esecuzione in Linux. |
osx |
Darwin |
La compilazione è in esecuzione in macOS. |
windows |
Windows_NT |
La compilazione è in esecuzione in Windows. |
Per altre informazioni, vedere Variabili di ambiente predefinite.
Se non è disponibile alcuna variabile per i dati necessari, usare un comando shell per ottenerlo. Ad esempio, un buon sostituto di una variabile di ambiente contenente l'ID commit della richiesta pull compilata consiste nell'eseguire un comando Git: git rev-parse HEAD^2.
Creazione di rami specifici
Per impostazione predefinita, travis e Azure Pipelines eseguono compilazioni CI in tutti i rami. Analogamente, entrambi i sistemi consentono di limitare queste compilazioni a rami specifici. In Azure Pipelines l'elenco dei rami da compilare deve essere elencato nell'elenco include e i rami da non compilare devono essere elencati nell'elenco di esclusione. Sono supportati caratteri jolly.
Ad esempio, per creare solo il ramo principale e quelli che iniziano con la parola «releases»:
.travis.yml
branches:
only:
- main
- /^releases.*/
azure-pipelines.yml
trigger:
branches:
include:
- main
- releases*
Caching dell'output
Travis supporta la memorizzazione nella cache delle dipendenze e dell'output di compilazione intermedio per migliorare i tempi di costruzione. Azure Pipelines non supporta la memorizzazione nella cache dell'output intermedio della compilazione, ma offre l'integrazione con Azure Artifacts per l'archiviazione delle dipendenze.
Moduli secondari Git
Travis e Azure Pipelines clonano entrambi i repository Git in modo ricorsivo per impostazione predefinita. Questa impostazione predefinita indica che l'agente clona i moduli secondari, utile perché i moduli secondari in genere contengono dipendenze. Tuttavia, la clonazione aggiuntiva richiede tempo aggiuntivo. Se non sono necessarie le dipendenze, disabilitare la clonazione dei moduli secondari:
.travis.yml
git:
submodules: false
azure-pipelines.yml
checkout:
submodules: false