通過 Azure Pipelines 實現持續集成之docker容器化

来源:https://www.cnblogs.com/weihanli/archive/2019/03/03/10464507.html
-Advertisement-
Play Games

通過 Azure Pipelines 實現持續集成之docker容器化 Intro Azure DevOps Pipeline 現在對於公開的項目完全免費,這對於開源項目來講無疑是個巨大的好消息,在 Github 的 Marketplace 里有個 Azure Pipeline,就是微軟的 Azur ...


通過 Azure Pipelines 實現持續集成之docker容器化

Intro

Azure DevOps Pipeline 現在對於公開的項目完全免費,這對於開源項目來講無疑是個巨大的好消息,在 Github 的 Marketplace 里有個 Azure Pipeline,就是微軟的 Azure DevOps Pipeline。

實現 Docker 容器化的持續集成

實現的目標:

  • push 代碼自動打包 docker 鏡像並上傳至docker hub
  • ssh 自動部署到虛擬機上

有了docker image 之後後面就可以按照自己的需求加以定製了,比如通過ssh部署到伺服器或者進行服務通知等。

新建 Pipeline

可以在 Azure 的 devops 新建一個 pipelines 的項目來專門管理 Github 上的pipeline

新建一個pipeline

第一次使用的話,會需要進行授權

授權之後就可以選擇 Github 上的項目了,選擇要配置的項目

可以基於模板創建也可以選擇下麵基於已有的 yaml 文件創建

Azure pipeline config

這裡提供一份示例,源代碼在這裡

# Docker image
# Build a Docker image to deploy, run, or push to a container registry.
# Add steps that use Docker Compose, tag images, push to a registry, run an image, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

pool:
  vmImage: 'Ubuntu 16.04'

variables:
  imageName: '$(dockerId)/activityreservation'

steps:

- script: |
    docker build -f Dockerfile -t $(imageName) .
    docker login -u $(dockerId) -p $(pswd)
    docker push $(imageName)

pipeline 配置解析

  1. agent pool 配置

通過 vmImage 來指定要用來執行 build 任務的 agent

pool:
  vmImage: 'Ubuntu 16.04'
  1. variables

可以通過 variables 來指定一些全局變數,這裡我用了一個 imageName 的變數來設置 docker 鏡像的名稱

variables:
  imageName: 'activityreservation'
  1. 敏感信息的存儲

要上傳 docker 鏡像,我這裡是直接上傳到 docker hub 上,需要 docker 的用戶名以及密碼,pipeline 可以設置一些不配置在 pipeline 配置文件里的其它配置,一些敏感信息就可以這樣配置來保證安全訪問

可以將 pipeline 獨有的一些配置放在 Pipeline Variables 里,一些比較通用的,別的 pipeline 也會使用的變數可以放到一個 Variable groups,然後在 pipeline 的 variables 里 link 一下對應的 Variable Group 就可以使用 group 里配置的變數了,我把 docker 的 username 和 password 配置在了一個 docker 的 Variable Group 里。

pipeline settings

  1. docker 鏡像的打包以及上傳

配置 pipeline 的 step,step 對應的就是需要 build agent 去執行的task

steps:

- script: |
    docker build -f Dockerfile -t $(imageName) .
    docker login -u $(dockerId) -p $(pswd)
    docker push $(imageName)

配置上面的腳本我們就可以自動 build 並 push docker 鏡像了。

build 完成之後再去 docker hub 上查看對應的 docker 鏡像就會發現 docker 鏡像已經更新了。

在 vm 上自動部署 docker 鏡像

首先要在 pipeline 上新建一個 SSH 的 Service Connection

steps:

- script: |
    docker build -f Dockerfile -t $(imageName) .
    docker login -u $(dockerId) -p $(pswd)
    docker push $(imageName)

- task: SSH
  displayName: 'Run shell inline on remote machine'
  inputs:
    sshEndpoint: 'weihanli-vm'
    runOptions: inline

    inline: |
     containers=$(docker ps -q --filter name=activityreservation)
     if test -n "$containers"; then
      docker stop $(docker ps -q --filter name=activityreservation) >> /dev/null 2>&1
      rc=$?
      if [[ $rc != 0 ]];
      then
       echo 'failed to stop container...'
       exit $rc;
      fi
     fi
     
     containers1=$(docker ps -q -a --filter name=activityreservation)
     if test -n "$containers1"; then
      docker rm $(docker ps -q -a --filter name=activityreservation) >> /dev/null 2>&1
      rc=$?
      if [[ $rc != 0 ]];
      then
       echo 'failed to remove container...'
       exit $rc;
      fi
     fi
     
     
     docker pull $(imageName):latest >> /dev/null 2>&1
     rc=$?
     if [[ $rc != 0 ]];
     then
      echo 'failed to pull container...'
      exit $rc;
     fi
     
     docker run -d -p 7010:80 --name activityreservation --link redis:redis-server $(imageName):latest >> /dev/null 2>&1
     rc=$?
     if [[ $rc != 0 ]];
     then
      echo 'failed to run container...'
      exit $rc;
     fi
     
     danglings=$(docker images -f "dangling=true" -q)
     if test -n "$danglings"; then
      docker rmi $(docker images -f "dangling=true" -q) >> /dev/null 2>&1
      rc=$?
      if [[ $rc != 0 ]];
      then
       echo 'failed to remove danglings container...'
       exit $rc;
      fi
     fi

sshEndpoint 設置為連接的名稱,inline 後面是在遠程執行的腳本,大概流程如下:

  1. 檢查是否有指定名稱的 container 在運行,如果有 stop 並 remove
  2. 拉取最新的 docker 鏡像
  3. 運行 docker 容器
  4. 移除可能的懸掛鏡像(名稱為 none 的中間鏡像)

驗證

配置完成之後我們就可以提交代碼,就會自動出發 build,自動執行我們定義的 pipeline 任務,按照上面的配置的話,就會先 build 並 push Docker 鏡像到 docker hub,然後 SSH 到遠程伺服器,遠程過去之後執行腳本,停掉並移除指定的 docker 容器(如果有)然後拉取並部署最新的docker鏡像,最後清理資源,刪除 docker 懸掛鏡像。

示例項目

現在有兩個項目是這種模式去自動化部署的,源代碼以及 pipeline 的配置都在 Github 上

現在這兩個項目的部署模式是這樣的,以活動室預約系統為例:

前面一個 nginx 作為反向代理,後面是直接跑在 docker 容器里

nginx 示例配置:

server {
      listen 80;
      listen 443;
      if ($scheme = http) {
          return  301 https://$host$request_uri;
      }
      server_name reservation.weihanli.xyz;

      location / {
         proxy_pass http://localhost:7010;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}

這裡會把 reservation.weihanli.xyz 的請求轉發到 localhost:7010 ,也就是這個 docker 鏡像映射的本地埠

Memo

如果有什麼問題或建議,歡迎與我聯繫


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題意 設把$n$個不同元素分成若幹個大小相等的集合的方案個數為$res$,求$m^{res}$模$10^9 401$後的餘數。 (n,m不超過2\ 10^9) 分析 可以知道,所求答案為$m^r \bmod P$其中$r=\sum_{d\mid n} \dfrac{n!}{\frac{n}{m}!^ ...
  • 複雜查詢時,單表對應的po類已不能滿足輸出結果集的映射。 所以有些時候就需要關聯查詢_一對一:通過條件查詢結果每個欄位都唯一 一對一:模型裡面有模型 一對多:模型裡面有集合 多對多:集合裡面有集合 方法一:resultType實現,要根據需求建立一個擴展類來作為resultType的類型。(詳細代碼 ...
  • If標簽:作為判斷入參來使用的,如果符合條件,則把if標簽體內的SQL拼接上。 註意:用if進行判斷是否為空時,不僅要判斷null,也要判斷空字元串‘’; Where標簽:會去掉條件中的第一個and符號。 通過if和where通過判斷可以選擇那些語句來執行,那些語句不執行,生成最終SQL語句 在第一 ...
  • 1.VS 安裝完成後,可以重新配置合適的開發環境 第一步: 第二步: 第三步: 第四步:選擇合適自己的開發環境 這裡我選擇常規,具體的可以看視窗右邊的說明 ...
  • 寫在前面 前幾時在寫業務代碼的時候,看到有用到lock這個方法的,而我竟然並不知道是做什麼用的,所以查找了許多博客文章,弄懂了百分之七八十,在此做下筆記。 感謝博客 http://www.cnblogs.com/wolf-sun/p/4209521.html 的解說,該篇博客大部分內容源自於此。 l ...
  • c#類的定義規範 欄位與屬性的比較: 欄位: 欄位主要是為類的內部做數據交換交互使用,欄位一般是private 欄位可以賦值,也可以取值 當欄位需要為外部數據提供數據的時候,請將欄位封裝為屬性,而不是使用公有欄位,這是面向對象所提倡的。 屬性: 屬性一般是向外提供數據,主要用來描述對象的靜態特征,所 ...
  • 大家好,這一篇向大家介紹ASP.NET MVC路由機制。【PS:上一篇-->6. ASP.NET MVC 5.0中的HTML Helpers【HTML幫助類】 】 路由是一個模式匹配系統,它確保你能夠將瀏覽器的請求,傳遞到控制器特定的Action方法上。路由引擎使用路由表,來將瀏覽器發送來的請求UR ...
  • asp.net core 自定義認證方式 請求頭認證 Intro 最近開始真正的實踐了一些網關的東西,最近寫幾篇文章分享一下我的實踐以及遇到的問題。 本文主要介紹網關後面的服務如何進行認證。 解決思路 網關可以做一部分的認證和授權,服務內部有時候也會需要用戶的信息,這時該怎麼辦呢,我們使用的是 JW ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...