使用 Travis CI / Azure PipeLines 發佈 Artifact 到 Dropbox

Last updated on

2019 iT 邦幫忙鐵人賽 🔗文章補完計劃,從零開始建立自動化發佈的流水線 持續發佈篇

在前面 持續整合(Continuous Integration, CI) 的文章,初步介紹概念與 Travis CI / Azure Pipeline 的設定方式後,接著要來嘗試持續部署 (Continuous Deployment, CD)/持續交付 (Continuous Delivery, CD) 的實作。

在這一篇,將試著透過 Travis CI 與 Azure Pipeline 兩種工具,將程式進行自動化測試、建置、並將其建置出來 Artifact 放置於 Dropbx。

吉米: 既然,可以運用 CI Server 自動建置、自動測試、發訊息,那再接下來,應該就是自動發佈了吧。

Eric: 沒錯,不過發佈類型不同,設定也有所差異。

吉米: 可以先介紹一下安裝檔的發佈嗎?

Eric: 好啊。

由於先前使用的 CI Server 全部是現有的雲端服務,或是自行架構在 Azure 的虛擬機器。

所以期望 CI Server 也可以將檔案,自動發佈到網路空間,以下,筆者試著將軟體發佈到 DropBox 之中。

將軟體發佈到 Dropbox

開啟 Dropbox 存取權限

檔案上傳到 Dropbox 時,筆者運用 andreafabrizi 在 GitHub ,所分享的 Dropbox-Uploader 🔗 ,以簡化介接 Dropbox API 的工作量。

Dropbox-Uploader by andreafabrizi GitHub
Dropbox-Uploader by andreafabrizi GitHub

首先,先到 Dorpbox Developers 🔗,會看到以下的畫面

2023 年 Dropbox Developer 首頁
2023 年 Dropbox Developer 首頁

在成功註冊/登入後,首先,我們必須在 Dropbox 建立 app 專案,讓 Dropbx 開放權限,允許應用程式呼叫 Dropbox API。

應用程式控制台 (2018)
應用程式控制台 (2018)
應用程式控制台 (2023)
應用程式控制台 (2023)

📝 資訊補充 📝

Choose an API 的部份,Dropbox 在 2020 年調整 OAuth2 的授權類型,讓授權的方式更加的多樣化與自由。

相關資料請見:Now Available: Scoped apps and enhanced permissions 🔗Migrating App Permissions and Access Tokens 🔗

按下 Create app 後,創立一個提供 CI Server 使用的 API 存取權限。

建立 Dropbox app (2018)
建立 Dropbox app (2018)
建立 Dropbox app (2023)
建立 Dropbox app (2023)

完成建立後,直接到 OAuth 2 的區域取得 Token 值,這會用在 Dropbox_Uploader.sh 之中。

Dropbox app 的組態設定畫面 (2018)
Dropbox app 的組態設定畫面 (2018)

要注意的是,dropbox_uploader.sh 中,是將先前取得的 Dropbox OAuth2 的 Token 另存檔案。但這情況不適合用在 CI Server ,所以對 dropbox_uploader.sh 進行部份修改。

# step 1
# 到 #Default values 增加 Token
OAUTH_ACCESS_TOKEN=73x2khI0WgMAAAAAAACQT9o8kMlODtz48GhinV9sq2lRCZq8RzIpLMBkVb2575wy

# Step 2
# 將 SETUP 區域的部份 mark 掉

並將修改後的 dropbox_upload.sh 放到 Repository 的目錄下。

使用 Travis CI 發佈檔案

Travis CI 提供許多現成的發佈方式,例如 GitHub Release, AWS S3, Azure Web App, NPM, …… ,但由於我們要將程式發佈到 DropBox 之中,所以使用 Custom Deploy

deploy:
  provider: script
  script: bash scripts/deploy.sh
  on:
    branch: master

在 yaml 指令中,看到 bash scipts/deploy.sh 這個指令。它的意思是,要去執行 scripts 這個資料夾中,deploy.sh 這個 shell 檔案。

依 Travis CI 建議的做法,是比軟好的方式,但筆者則是採用另一程做法。直接在 .travis.ymlscript 區段,執行上傳的動作。

language: csharp
solution: IronmanDemo.sln

mono: none
dotnet: 2.1.300

script:
    - dotnet restore
    - dotnet build --configuration Release
    - dotnet test Calculate.Tests/Calculate.Tests.csproj
    # 上傳到 dropbox 的檔案清單
    - bash dropbox_uploader.sh upload IronmanDemo/bin/Release 2019Ironman/Travis
使用 Travis CI 把檔案發佈到 Dropbox
使用 Travis CI 把檔案發佈到 Dropbox

使用 Azure Pipeline 發佈檔案

在 Azure Pipeline 的部份,筆者參考官方文件 🔗的說明,宣告使用 Shell script 方式執行 dropbox-uploader.sh

- task: ShellScript@2
  inputs:
    scriptPath:
    #args: '' # Optional
    #disableAutoCwd: false # Optional
    #cwd: '' # Optional
    #failOnStandardError: false

先將 dropbox-uploader.sh 放到 repository 之中。

再到 azure-pipeline.yml 中,加入 dropbox-uploader.sh 的調用。執行 dropbox-uploader.sh 上傳所需的參數,放到 args 的位置。

說個題外話,當初實作時,沒有注意到參數要使用 args,試了很多次,才發現這個錯誤。

- task: ShellScript@2
  inputs:
    scriptPath: .\dropbox_uploader.sh 
    args: upload IronmanDemo/bin 2019Ironman/AzureDevOps
使用 Azure Pipeline 把檔案發佈到 Dropbox
使用 Azure Pipeline 把檔案發佈到 Dropbox
吉米: 透過 shell script 的操作,CI Server 的運用,就更加靈活。

Eric: 是啊,也要謝謝 andreafabrizi 分享上傳 dropbox 的 shell,大量簡化了與 Dropbox API 串接的工程。

吉米: 真的。剛剛看了一下 dropbox 的說明文件,如果都自己來,那工可就多了。

參考資料


Series
從零開始建立自動化發佈的流水線