---
# System prepended metadata

title: Azure DevOps Workshop (Java Container)
tags: [Azure DevOps, Java, Container, Workshop, Azure Pipeline]

---

###### tags: `Workshop` `Azure DevOps` `Azure Pipeline` `Java` `Container`

# Azure DevOps Workshop (Java Container)
In this workshop you would learn how to accerlate developing containerlized Java web.

- [Sample Code](https://github.com/callicoder/spring-boot-websocket-chat-demo.git)：The Sample of chat room which use websocket and using Java container.
- [Azure DevOps Service](https://dev.azure.com/)

## Update

### 2021/03
* 建立組織時，地區不要選擇<span style="color:red"> 東亞 (East Asia)</span>
**[→ 宣佈即將推出的 Azure DevOps 組織的變更，位於東亞](https://docs.microsoft.com/zh-tw/azure/devops/migrate/migration?view=azure-devops)**

## 1/ How DevOps Admin manage Azure DevOps Service

- 介紹組織/專案概念

- Organization Setting
    - User：添加人員至組織中
    - Billing + Azure DevOps Pricing：[Azure DevOps 的定價](https://azure.microsoft.com/zh-tw/pricing/details/devops/azure-devops-services/)
    - Auditing：輸出 log 資料
    - Global Notification：設定全域的通知訊息
    - Azure Active Directory：連結到現有的 AAD

- Create Project
    - Work Item Process
        - [Agile](https://docs.microsoft.com/en-us/azure/devops/boards/work-items/guidance/agile-process?view=azure-devops)([User Story Field](https://docs.microsoft.com/en-us/azure/devops/boards/work-items/guidance/agile-process-workflow?view=azure-devops))
        - [Scrum](https://docs.microsoft.com/en-us/azure/devops/boards/work-items/guidance/scrum-process?view=azure-devops)([PBI Field](https://docs.microsoft.com/en-us/azure/devops/boards/work-items/guidance/scrum-process-workflow?view=azure-devops ))
    - 選擇 Scrum


## 2/ Scrum Planning and Portfolio Management with Azure Boards

- 邀請成員加入專案
    ![](https://i.imgur.com/KkTxdUY.png =450x)

- 使用 Boards 建立 Feature task 和 Product Backlog Item
    - 點選到 Azure Board
    - 在 Feature 視角 建立 Feature task
    - 在 PBI 視角 建立 PBI task
    - PBI：<span style="color:blue">**完成 Azure DevOps Workshop 練習**</span>
    - PBI：<span style="color:blue">**[練習] 首頁標題**</span>

- 切換到 Backlogs 決定 PBI 的 iteration

![](https://i.imgur.com/KvgPQ6o.png)
- 使用 Sprints 來查看目前週期的所有事項
- 根據分別的 Product Backlog Item 定義 Task
    - 在 <span style="color:blue">**完成 Azure DevOps Workshop 練習**</span> 項目下新增：
        - <span style="color:orange">了解 Azure DevOps 基本知識</span>
        - <span style="color:orange">練習 Azure Board</span>
        - <span style="color:orange">push 範例程式碼</span>
        - <span style="color:orange">在 Azure 上建立 ACR</span>
        - <span style="color:orange">建置 CI pipeline</span>
        - <span style="color:orange">在 Azure 上建立 web app service</span>
        - <span style="color:orange">建置 CD pipeline</span>
        - <span style="color:orange">實作 Dashboard</span>
    - 在 <span style="color:blue">**[練習] 首頁標題**</span> 項目下新增
        - <span style="color:orange">修改首頁標題為今日日期</span>
        - <span style="color:orange">撰寫測試案例</span>
    - 改變 Task 狀態

- Queries : query 出所有在 active 狀態的 Task

## 3/ Continuous Integration
- 將 Sample Code 上傳至 Azure Repo
- 到 [Azure Portal](https://ms.portal.azure.com/#home) 上建立 ACR 資源（SKU 使用 standard）
    ![](https://i.imgur.com/NplC6Qe.png =300x)
- ACR 啟用 admin account
![](https://i.imgur.com/4v5gEQd.png)
    - 為何要啟用 admin account：每個 ACR 都包含一個管理使用者帳戶，且預設為停用，系統管理員帳戶具有登錄的完整許可權，在某些案例中，將 image 從 ACR 部署至某些 Azure 服務時，需要系統管理員帳戶，如 Azure App Service for container


- 點選至 Azure Pipeline 建立 CI 流程
    - 使用 Docker container template
    ![](https://i.imgur.com/lmwDPwc.png =500x)
    - 在第一步添加 **bash** 流程
    ![](https://i.imgur.com/8IhwcZ7.png =500x)
    - 選擇 inline 並填入`mvn clean package`
    ![](https://i.imgur.com/VZfyhSu.png)
    - 修改 **Build an image**，選擇先前建立的ACR
    ![](https://i.imgur.com/Ij5FahO.png)
    - 修改 **Push an image**，選擇先前建立的 ACR
    ![](https://i.imgur.com/BAUH8jl.png)
    - <span style="color:red">**若不是使用 Azure Servcie，可參考 [Service Connection 方式設定](https://docs.microsoft.com/en-us/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml)**</span>
    - 選擇 **Ubuntu 1604** 機器
    ![](https://i.imgur.com/Ck8QP0N.png)
    Refer to : [MS hosted agent list](https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml#software)
    
    - 設定 master 更新時，自動啟動 CI 流程
    ![](https://i.imgur.com/Y1uw7bq.png)

## 4/ Continuous Deployment
- 建立 **App Service** 資源
    - 選擇 sku 為 S1
    - 選擇 容器
    - 選擇 已建立的 ACR
- 連結到 *http://{your-app-service-name}.azurewebsites.net* 確認網站正常顯示
![](https://i.imgur.com/q0cA616.png)

- 回到 Azure DevOps 頁面，點選 **Pipeline** > **Release** > **Create New Pipeline**
- 選擇 **Empty Job**
![](https://i.imgur.com/5P0ktT7.png)
- 修改 Stage 名稱
![](https://i.imgur.com/w7XVHgK.png)
- 修改 Release Pipeline 名稱
![](https://i.imgur.com/yaCqubv.png =450x)
- 點選 **Add an artifact** 添加來源
![](https://i.imgur.com/ThBIB44.png =200x)
- 選擇 **Azure Container Registry**，選擇先前建立過的 ACR
![](https://i.imgur.com/XHKcCjM.png =450x)
- 記下 source alias 之後的步驟會使用到
![](https://i.imgur.com/WEl6Dqe.png =500x)
- 練習多添加幾個 Stage
- 修改 Stage 內容
![](https://i.imgur.com/8MlMjCQ.png =450x)
- 點選 **+** 來新增 task
![](https://i.imgur.com/FFRzxzv.png)
- 添加 **Bash** task，選擇 inline 並用以下指令覆蓋
![](https://i.imgur.com/4jom5Ci.png =400x)
```
echo {ACR Login Server}/{ACR Repositories Name}:$(RELEASE.ARTIFACTS.{source alias}.BUILDNUMBER)

```
- 添加 **Azure Web App for Containers** task
![](https://i.imgur.com/VvxSg3H.png =400x)
- 修改 **Azure Web App for Containers** task
![](https://i.imgur.com/SeNqNlr.png)

- 將 Image Name 修改為以下
```
{ACR Login Server}/{ACR Repositories Name}:$(RELEASE.ARTIFACTS.{source alias}.BUILDNUMBER)
```
- Variable 的使用：根據不同的 stage 置換不同的 variable 內容
    - 點選 **variable**
    ![](https://i.imgur.com/AtUIid7.png =400x)
    - 分別填入 ACR、REPO 和 IMAGE_TAG 及其對應的值
    ![](https://i.imgur.com/WJwGLkK.png)
    Scope 可以選擇提供給哪個 Stage 使用
    - 回到 Task，分別將 **Bash** 內的 Scipt 及 **Azure Web App for Containers** 的 Image Name 的值做修改
        - Bash
        ![](https://i.imgur.com/P0qko4N.png)
        - Azure Web App for Containers
        ![](https://i.imgur.com/Rw2M6Oz.png)

- 設定當 ACR 有新的 image 時，自動啟動部屬流程
![](https://i.imgur.com/rMj9gNU.png =250x)
- 將 Continuous deployment trigger **enable**
![](https://i.imgur.com/aY0GVnH.png =400x)

## 5/ 實際開發
- 回到 **Repo**
- 建立分支
![](https://i.imgur.com/McNhUra.png =450x)
- 將分支命名，並連結先前建立的 PBI：<span style="color:blue">**[練習]首頁標題**</span>
![](https://i.imgur.com/r9AN4lU.png =300x)
- 在 dev 中索引到 *src/main/resources/static/index.html*
- 點選 **Edit** ，修改第 15 行
![](https://i.imgur.com/NCDHu1Q.png)
- Commit 時綁定 Task：<span style="color:orange">**[練習]修改首頁標題為今日日期**</span>
![](https://i.imgur.com/m9v78kA.png =400x)
- 此時不會啟動 build，因為是 dev 更新而不是 master
- 選擇 **repo** > **pull request** > **New pull request**
![](https://i.imgur.com/Jigg3HZ.png)
- 確認資料正確，**Reviewers** 可以先填寫自己
![](https://i.imgur.com/G5zAFvq.png)
- 點選 **Approve**，然後 **Complete**
![](https://i.imgur.com/rBJtyF2.png =400x)
- 此時 CI/CD 流程已啟動
## 6/ 撰寫測試案例
- 點選 **Test Plans** > **New Test Plan**
![](https://i.imgur.com/lW0HnOJ.png)
- 填寫細節
![](https://i.imgur.com/Pk7eqyg.png)
- 點選 **New Test Case**
![](https://i.imgur.com/EMydYbp.png =400x)

- 填寫 **Test Case**
![](https://i.imgur.com/xqtTZrC.png)

- 連結 PBI：<span style="color:blue">**[練習]首頁標題**</span>，Add Link > New Exist Item，連結種類為 Tests
![](https://i.imgur.com/Ok21qac.png)
- 再新增一個為 Related，連結 <span style="color:orange">Task：撰寫測試案例</span>
![](https://i.imgur.com/dfY3DKN.png =400x)
- 執行 Test Case
![](https://i.imgur.com/9phhVuo.png)
- 記錄錯誤，填寫 bug 單
![](https://i.imgur.com/878J2zU.png)
![](https://i.imgur.com/1zXFSaM.png)

## 7/ 修改 bug

- 建立分支
- 修改 > 綁定 bug
- 建立 pull request

## FAQ
- 遇到 web socket 無法連線問題，改用 http，不要用 https
- 修改完但沒有變更，用無痕視窗再開一次



## Reference
- [Azur Container Instance Admin Account](https://docs.microsoft.com/zh-tw/azure/container-registry/container-registry-authentication#admin-account)
- [How to Use Variable in Bash](https://docs.microsoft.com/zh-tw/azure/devops/pipelines/tasks/utility/bash?view=azure-devops&viewFallbackFrom=tfs-2017)
- [Getting the latest image tag from ACR Repository](https://stackoverflow.com/questions/59322742/getting-the-latest-image-tag-from-acr-repository)
- [如何從 Azure Pipelines 的 Task 設定一個變數給下一個 Task 使用
](https://blog.miniasp.com/post/2020/02/08/Set-variables-in-scripts-in-Azure-Pipelines)
- [Create test plans and test suites](https://docs.microsoft.com/en-us/azure/devops/test/create-a-test-plan?view=azure-devops)
- [Test Plan / Parameters : Repeat a test with different data](https://docs.microsoft.com/en-us/azure/devops/test/repeat-test-with-different-data?view=azure-devops)
- [Test Plan / Configuration : Test different configurations](https://docs.microsoft.com/en-us/azure/devops/test/test-different-configurations?view=azure-devops)


