從 Travis 遷移至 Azure Pipelines
Azure DevOps Services
本指南的目的是要協助您從 Travis 遷移至 Azure Pipelines。 本指南說明如何從 Travis 設定轉譯為 Azure Pipelines 設定。
我們需要您的協助,才能讓本指南變得更好! 提交批註或直接參與您的變更。
主要差異
Travis 與 Azure Pipelines 之間有許多差異,包括:
Travis 組建具有 階段 、 作業 和 階段 ,而 Azure Pipelines 有可依您選擇的任意順序或群組排列和執行的步驟。
Azure Pipelines 可讓作業定義和步驟儲存在相同或不同存放庫中的個別 YAML 檔案中,讓步驟可在多個管線之間共用。
Azure Pipelines 提供在 Microsoft 管理的 Linux、Windows 和 macOS 映射上建置和測試的完整支援。 如需託管代理程式的詳細資訊,請參閱 Microsoft 裝載的 代理程式。
必要條件
- 您可以在其中建立存放庫的 GitHub 帳戶。 免費建立一個。
- Azure DevOps 組織。 免費建立一個。 如果您的小組已經有一個,請確定您是您想要使用的 Azure DevOps 專案的系統管理員。
- 能夠在 Microsoft 裝載的代理程式上執行管線。 您可以購買 平行作業 ,也可以 要求免費層 。
- Azure Pipelines 的基本知識。 如果您不熟悉 Azure Pipelines,請參閱下列內容以深入瞭解 Azure Pipelines,以及開始移轉之前的運作方式:
語言
Travis 會使用 language
關鍵字來識別為組建設定的必要條件建置環境。 例如,若要選取 Node.JS 16.x:
.travis.yml
language: node_js
node_js:
- 16
根據預設,Microsoft 裝載的 代理套裝程式含多種語言的 SDK。 若要使用特定語言版本,您可能需要使用 語言選取工作 來設定環境。
例如,若要選取 Node.JS 16.x:
azure-pipelines.yml
steps:
- task: UseNode@1
inputs:
version: '16.x'
語言對應
language
Travis 中的 關鍵字表示使用的語言工具版本,以及隱含執行許多建置步驟。 在 Azure Pipelines 中,您必須指定您想要執行的命令。
以下是從 language
關鍵字到針對最常使用語言自動執行的命令的翻譯指南:
語言 | 命令 |
---|---|
c cpp |
./configure make make install |
csharp |
nuget restore [solution.sln] msbuild /p:Configuration=Release [solution.sln] |
clojure |
lein deps lein test |
go |
go get -t -v ./... make orgo test |
java groovy |
Gradle :gradle assemble gradle check Maven : mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V mvn test -B 螞蟻 : ant test |
node_js |
npm install 或 或 npm ci yarn npm test |
objective-c swift |
pod install orbundle exec pod install xcodebuild -scheme [scheme] build test \| xcpretty |
perl |
cpanm --quiet --installdeps --notest . Build.PL : perl ./Build.pl ./Build test Makefile.PL: perl Makefile.PL make test Makefile : make test |
php |
phpunit |
python |
pip install -r requirements.txt |
ruby |
bundle install --jobs=3 --retry=3 rake |
此外,可以啟用較不常見的語言,但需要在 Docker 容器內執行另一個相依性安裝步驟:
語言 | 命令 |
---|---|
crystal |
docker run -v $(pwd):/src -w /src crystallang/crystal shards install docker 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.list sudo apt-get update sudo apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring sudo apt-get update sudo apt-get install dmd-compiler dub dub 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.list sudo apt-get update sudo apt-get install dart /usr/lib/dart/bin/pub get /usr/lib/dart/bin/pub run test |
erlang |
sudo apt-get install rebar rebar get-deps rebar compile rebar skip_deps=true eunit |
elixir |
sudo apt-get install elixir mix local.rebar --force mix local.hex --force mix deps.get mix test |
haskell |
sudo apt-get install cabal-install cabal install --only-dependencies --enable-tests cabal configure --enable-tests cabal build cabal test |
haxe |
sudo apt-get install haxe yes \| haxelib install [hxml] haxe [hxml] |
julia |
sudo apt-get install julia julia -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 rakudo PERL6LIB=lib prove -v -r --exec=perl6 t/ |
rust |
curl -sSf https://sh.rustup.rs | sh -s -- -y cargo build --verbose cargo test --verbose |
scala |
echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | /etc/apt/sources.list.d/sbt.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823 sudo apt-get update sudo apt-get install sbt sbt ++2.11.6 test |
smalltalk |
docker run -v $(pwd):/src -w /src hpiswa/smalltalkci smalltalkci |
多種語言選擇
您也可以設定支援以多種語言建置不同應用程式的環境。 例如,若要確保建置環境以 Node.JS 16.x 和 Ruby 3.2 或更高版本為目標:
azure-pipelines.yml
steps:
- task: UseNode@1
inputs:
version: '8.x'
- task: UseRubyVersion@0
inputs:
versionSpec: '>= 3.2'
階段
在 Travis 中,步驟是在一組固定的具名階段中定義,例如 before_install
或 before_script
。 Azure Pipelines 沒有具名階段,而且步驟可以分組、命名及組織管線的任何方式。
例如:
.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
或者,步驟可以分組在一起,並選擇性地命名:
azure-pipelines.yml
steps:
- script: |
npm install -g bower
npm install
bower install
displayName: 'Install dependencies'
- script: npm run build
- script: npm test
平行作業
Travis 可讓您定義階段,也就是平行執行的作業群組,以提供平行處理原則。 Travis 組建可以有多個階段;一旦階段中的所有作業都已完成,下一個階段就會開始。
使用 Azure Pipelines,您可以讓每個步驟或階段都相依于任何其他步驟。 如此一來,您可以指定以序列方式執行哪些步驟,以及可以平行執行的步驟。 因此,您可以在完成一個步驟之後平行執行多個步驟,然後使用之後執行的單一步驟來回扇出。 此模型可讓您視需要定義複雜工作流程的選項。 目前,以下是一個簡單的範例:
例如,若要執行組建腳本,然後在完成時同時執行單元測試和整合測試,並在所有測試完成後封裝成品,然後執行部署至生產階段前:
.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
進階平行執行
在 Azure Pipelines 中,您有更多選項可控制管線的協調方式。
例如,小組有一組快速執行的單元測試,以及另一組且較慢的整合測試。 小組想要在單元完成時立即開始建立發行的 .ZIP 檔案,因為它們提供建置提供良好套件的高信賴度。 但在部署至生產階段前之前,他們想要等到所有測試都通過:
在 Azure Pipelines 中,他們可以透過下列方式執行此動作:
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
步驟重複使用
在 Travis 中,您可以使用矩陣跨單一組態執行多個執行。 在 Azure Pipelines 中,您可以使用相同方式的矩陣,但您也可以使用範本 來實作 組態重複使用。
範例:矩陣中的環境變數
使用環境變數變更執行數個組建的最常見方式之一是變更執行。 例如,您的組建腳本可以尋找環境變數的存在,並變更軟體的建置方式,或測試方式。
您可以使用矩陣,針對環境變數中的每個值執行一次組建組態數次。 例如,若要執行指定的腳本三次,每次都有環境變數的不同設定:
.travis.yml
os: osx
env:
matrix:
- 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)
範例:矩陣中的語言版本
另一個常見案例是針對數個不同的語言環境執行。 Travis 支援使用 關鍵字的 language
隱含定義,而 Azure Pipelines 預期有明確的工作定義如何設定該語言版本。
您可以使用 Azure Pipelines 中的環境變數矩陣選項來啟用不同語言版本的矩陣。 例如,您可以在每個對應至您想要使用之語言版本的矩陣變數中設定環境變數,然後在第一個步驟中,使用該環境變數來執行語言設定工作:
.travis.yml
os: linux
matrix:
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
範例:矩陣內的作業系統
在多個作業系統中執行組建也很常見。 Travis 使用 os
關鍵字支援此定義,而 Azure Pipelines 可讓您選取要使用 關鍵字在 中 vmImage
執行的集區來設定作業系統。
例如,您可以在每個矩陣變數中設定環境變數,以對應至您想要使用的作業系統映射。 然後,您可以將電腦集區設定為您已設定的變數:
.travis.yml
matrix:
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!
成功和失敗處理
Travis 可讓您指定在建置成功、使用 after_success
階段或建置失敗時,使用 after_failure
階段執行的步驟。 透過 Azure Pipelines,您可以根據任何步驟的結果來定義成功和失敗狀況,以啟用更有彈性且功能強大的管線。
.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()
進階成功和失敗處理
在 Azure Pipelines 中,您可以針對作業之間的流程式控制制,設計一組彈性的相依性和條件。
您可以設定作業,根據先前作業的成功或失敗,或根據環境變數執行。
您甚至可以將作業設定為一律執行,而不論其他作業是否成功。
例如,如果您想要在建置失敗時執行腳本,但前提是它以主要分支上的組建的形式執行:
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
預先定義的變數
Travis 和 Azure Pipelines 都會設定多個環境變數,讓您能夠檢查 CI 系統的執行環境並與其互動。
在大部分情況下,Azure Pipelines 變數會比對 Travis 中的環境變數。 以下是 Travis 中常用的環境變數清單,以及其在 Azure Pipelines 中的類比:
崔維斯 | Azure Pipelines | 描述 |
---|---|---|
CI=true 或 TRAVIS=true |
TF_BUILD=True |
指出您的組建正在 CI 系統中執行;適用于也打算在開發期間在本機執行的腳本。 |
TRAVIS_BRANCH |
CI 組建 :BUILD_SOURCEBRANCH 提取要求組建 : SYSTEM_PULLREQUEST_TARGETBRANCH |
組建已排入佇列的分支名稱,或提取要求的目標分支名稱。 |
TRAVIS_BUILD_DIR |
BUILD_SOURCESDIRECTORY |
取出來源和預設工作目錄的位置。 |
TRAVIS_BUILD_NUMBER |
BUILD_BUILDID |
目前組建調用的唯一數值識別碼。 |
TRAVIS_COMMIT |
CI 組建 :BUILD_SOURCEVERSION |
目前正在建置的認可識別碼。 |
TRAVIS_COMMIT |
提取要求組建 :git rev-parse HEAD^2 |
針對提取要求驗證組建,Azure Pipelines 會將提取要求產生的合併認可設定 BUILD_SOURCEVERSION 為 main;此命令會識別提取要求認可本身。 |
TRAVIS_COMMIT_MESSAGE |
BUILD_SOURCEVERSIONMESSAGE |
正在建置之認可的記錄訊息。 |
TRAVIS_EVENT_TYPE |
BUILD_REASON |
組建排入佇列的原因;值的對應位於下方的「建置原因」表格中。 |
TRAVIS_JOB_NAME |
AGENT_JOBNAME |
如果指定,則為目前作業的名稱。 |
TRAVIS_OS_NAME |
AGENT_OS |
執行作業的作業系統;值的對應位於下方的「作業系統」表格中。 |
TRAVIS_PULL_REQUEST |
Azure Repos :SYSTEM_PULLREQUEST_PULLREQUESTID GitHub: SYSTEM_PULLREQUEST_PULLREQUESTNUMBER |
觸發此組建的提取要求編號。 (針對 GitHub 組建,這是非 提取要求編號的唯一識別碼 。 |
TRAVIS_PULL_REQUEST_BRANCH |
SYSTEM_PULLREQUEST_SOURCEBRANCH |
提取要求產生所在分支的名稱。 |
TRAVIS_PULL_REQUEST_SHA |
提取要求組建 :git rev-parse HEAD^2 |
針對提取要求驗證組建,Azure Pipelines 會將提取要求產生的合併認可設定 BUILD_SOURCEVERSION 為 main;此命令會識別提取要求認可本身。 |
TRAVIS_PULL_REQUEST_SLUG |
如果提取要求源自分支,則為分支存放庫的名稱。 Azure Pipelines 中沒有類似此專案。 | |
TRAVIS_REPO_SLUG |
BUILD_REPOSITORY_NAME |
此組建設定的存放庫名稱。 |
TRAVIS_TEST_RESULT |
AGENT_JOBSTATUS |
Travis 會將此值設定為 0 ,如果所有先前的步驟都成功 (傳 0 回 )。 針對 Azure Pipelines,請檢查該 AGENT_JOBSTATUS=Succeeded 。 |
TRAVIS_TAG |
BUILD_SOURCEBRANCH |
如果建立標記來排入此組建佇列,則這是該標籤的名稱。 針對 Azure Pipelines,會 BUILD_SOURCEBRANCH 設定為完整的 Git 參考名稱,例如 refs/tags/tag_name 。 |
TRAVIS_BUILD_STAGE_NAME |
Travis 中階段的名稱。 如先前所見,Azure Pipelines 會使用工作處理流程式控制制。 您可以參考 AGENT_JOBNAME 。 |
建置 原因:
變數 TRAVIS_EVENT_TYPE
包含值,這些值會對應至 Azure Pipelines BUILD_REASON
變數所提供的值:
崔維斯 | Azure Pipelines | 描述 |
---|---|---|
push |
IndividualCI |
組建是從推送進行的持續整合組建。 |
pull_request |
PullRequest |
組建已排入佇列以驗證提取要求。 |
api |
Manual |
組建已由 REST API 或網頁上的手動要求排入佇列。 |
cron |
Schedule |
組建已排程。 |
作業系統 :
變數 TRAVIS_OS_NAME
包含值,這些值會對應至 Azure Pipelines AGENT_OS
變數所提供的值:
崔維斯 | Azure Pipelines | 描述 |
---|---|---|
linux |
Linux |
組建正在 Linux 上執行。 |
osx |
Darwin |
組建正在 macOS 上執行。 |
windows |
Windows_NT |
組建正在 Windows 上執行。 |
若要深入瞭解,請參閱 預先定義的環境變數 。
如果沒有所需的資料變數,您可以使用殼層命令來取得它。 例如,建置之提取要求認可識別碼的環境變數替代方式是執行 git 命令: git rev-parse HEAD^2
。
建置特定分支
根據預設,Travis 和 Azure Pipelines 都會在所有分支上執行 CI 組建。 同樣地,這兩個系統都可讓您將這些組建限制為特定分支。 在 Azure Pipelines 中,要建置的分支清單應該列在 include
清單中,而不要 建置的分支 應該列在 'exclude list' 中。 支援萬用字元。
例如,只建置 main 分支,以及開頭為 「releases」 一詞的分支:
.travis.yml
branches:
only:
- main
- /^releases.*/
azure-pipelines.yml
trigger:
branches:
include:
- main
- releases*
輸出快取
Travis 支援快取相依性和中繼建置輸出,以改善建置時間。 Azure Pipelines 不支援快取中繼組建輸出,但會提供與 Azure Artifacts 的整合,以用於相依性儲存體。
Git 子模組
Travis 和 Azure Pipelines 預設都會「以遞迴方式」複製 git 存放庫。 這表示代理程式會複製子模組,這非常有用,因為子模組通常包含相依性。 不過,額外的複製需要時間,因此如果您不需要相依性,則可以停用複製子模組:
.travis.yml
git:
submodules: false
azure-pipelines.yml
checkout:
submodules: false
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應