日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

持续集成之应用容器化及自动化部署

發布時間:2023/12/4 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 持续集成之应用容器化及自动化部署 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通過 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 配置解析

  • agent pool 配置

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

    pool: vmImage: 'Ubuntu 16.04'
  • variables

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

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

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

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

  • 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 后面是在遠程執行的腳本,大概流程如下:

  • 檢查是否有指定名稱的 container 在運行,如果有 stop 并 remove

  • 拉取最新的 docker 鏡像

  • 運行 docker 容器

  • 移除可能的懸掛鏡像(名稱為 none 的中間鏡像)

  • 驗證

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

    示例項目

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

    • 活動室預約系統?https://reservation.weihanli.xyz/

    • 簡單賬單系統

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

    前面一個 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

    如果有什么問題或建議,歡迎與我聯系

    總結

    以上是生活随笔為你收集整理的持续集成之应用容器化及自动化部署的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。