設計生成自動化流水線


  現在已經有很多成熟的生成流水線了,如Azure DevOps,直接在界面中配置好即可,相當便捷,生成流水線的工作方式、工作過程也可以簡單了解,我在空閑時間搭建了一個簡單生成流水線旨在鞏固個人對生成流水線的理解。

  

一、生成流水線設計圖

  

  平時,在騰訊雲、阿里雲搞活動時薅了點羊毛 ,搞了幾天便宜的服務器,不能讓這些服務器閑置了,也借此來試試搭建一條流水線,目的是在於,一個新項目要開始弄,在我選擇一個Asp.Net Core並推送到碼雲中,然后在Jenkins中做一些相關的配置即可,后期代碼上的變更不會影響部署環境的變更。主要原因在於,看到過幾次先開發后部署,然后遇到的一些部署方面的問題出現耽擱,因此,先把環境部署完畢,后期要做的只是將業務代碼的不斷加入進來,並且對上可以看到工作成果,如同高樓建築,可以看到一層一層的往上疊加。

  代碼方面:Asp.Net Core、Git、Gitee

  服務器方面:Jenkins、Docker Machine、Docker Compose、Docker Swarm

  鏡像倉庫:騰訊雲鏡像倉庫

 

二、設計過程中見到的多條道路

  在設計過程中發現有些地方可以有多種方式實現,談談我所見到的幾種方式:

  1、單台服務器

    代碼存儲在碼雲或是GitHub中,

    可安裝Jenkins可以安裝到容器中或主機上,

    可安裝Docker Compose到容器中或主機上,更方便的啟動/停止批量容器,

    在Jenkins中使用腳本時:

      可以選擇用簡單腳本啟動/終止容器(docker run/stop)。

      可以選擇用Docker Compose啟動/停止批量容器(需要代碼中提供docker.compose.yaml文件)。

      可以使用代碼或是主機內的腳本文件啟動/終止容器(使用.sh腳本文件)。

    代碼變更,利用jenkins定時拉取變動,然后重新部署容器,很簡單和方便的實現持續交付與部署。

  

  2、多台服務器

    代碼存儲在碼雲或是GitHub中,

    可安裝Docker Machine到一台服務器上,然后快速的通過這一台服務器把其他服務器的docker環境搭建好。

    可安裝Docker Swarm,我暫時還只是用Docker Swarm,對於k8s沒有涉及,所以暫不應用,對於Swarm的使用,我之前是有4台主機,因此在安裝了Docker Machine的那一台就直接發起了一個集群,並把其他服務器也加入了進來,形成了如下局面:

    

    雖然,看起來沒得什么問題,同樣也可以使用,但是對於Host1來講,負擔太大,既作為奶媽(鏡像生產者)又要作為奶爸(集群管理者)。因此為將壓力分離一部分,也就有了下面的局面:

      

    可安裝Jenkins可以安裝到容器中或主機上,

    可安裝Docker Compose到容器中或主機上,更方便的啟動/停止批量容器,

    在Jenkins中使用腳本用於構建鏡像時:

      可以選擇用簡單腳本刪除原有鏡像、構建鏡像、啟動、終止容器等(docker rmi/build/run/stop)。

      可以選擇用Docker Compose刪除鏡像、重新構建鏡像、啟動/停止批量容器等(需要代碼中提供docker.compose.yaml文件,在該文件中指明build參數,Dockerfile位置)。(注意docker compose文件區別,一種是用來構建鏡像的docker compose.yaml文件,這種指明了build和context,一種是鏡像名稱是指定了的,這種用於docker stack deploy,必須要在鏡像存在的情況下才能用的。)

      可以使用代碼或是主機內的腳本文件刪除鏡像、重新構建鏡像、啟動/終止容器等(使用.sh腳本文件)。

    我使用的是騰訊雲的鏡像倉庫,用於存儲構建后的鏡像,並在swarm集群中拉取鏡像部署服務。

    代碼變更,利用jenkins定時拉取變動,然后重新構建鏡像,並將鏡像推送到鏡像倉庫中,同時將更新swarm中的service,使用最新的鏡像,滾動更新集群中的容器。在這里更新swarm中的service有多種方式,如果Jenkins是安裝在主機上,那么可以直接在腳本中通過docker-machine ssh host2 相關更新命令,完成通知即可,如果Jenkins是安裝在Docker中,那么Jenkins中需要安裝SSH Plugin插件用來連接遠程主機,然后執行更新。還有的方式就是,我不通知swarm集群,Jenkins服務器可以充當測試服務器,當測試人員測試完畢后,在swarm集群內通過命令手動更新service或是借助UI工具如portainer來手動更新service,更有甚者,在swarm manager節點上在安裝一個Jenkins,用來拉取最新鏡像(鏡像更新觸發拉取動作),然后更新service,這種方式我暫時沒有嘗試過,應該也是行的通的。

 

三、現有集群環境如下

  目前,搭建好了如下環境,對於鏡像構建方如何通知swarm集群更新,還沒有做到自動更新,暫時使用手動在swarm集群中更新,而對於鏡像構建方的自動構建和鏡像推送到鏡像倉庫現已完成。

  

  在Swarm集群中,安裝Portainer集群版本,可以監控整個集群的信息,對於手動更新來講是很方便的,在Portainer中,在左側有一個registry的菜單,點擊進入后選擇自己的倉庫地址,用來配置我在騰訊雲的倉庫信息。

  

   在Portainer菜單Service中可以創建或更新service,獲取最新的鏡像完成更新操作,相比用命令行去操作輕松許多。

   

  后期將會完善自動通知swarm集群更新service功能(至於要不要這個功能,需要斟酌一番)。

 

 本文地址:https://www.cnblogs.com/CKExp/p/9940461.html 

 歡迎關注微信訂閱號,有新的文章將同步到訂閱號中

 

2018-11-24,望技術有成后能回來看見自己的腳步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM