設計生成自動化流水線

  如今已經有不少成熟的生成流水線了,如Azure DevOps,直接在界面中配置好便可,至關便捷,生成流水線的工做方式、工做過程也能夠簡單瞭解,我在空閒時間搭建了一個簡單生成流水線旨在鞏固我的對生成流水線的理解。html

  

1、生成流水線設計圖java

  

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

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

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

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

 

2、設計過程當中見到的多條道路工具

  在設計過程當中發現有些地方能夠有多種方式實現,談談我所見到的幾種方式:測試

  一、單臺服務器ui

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

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

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

    在Jenkins中使用腳本時:

      能夠選擇用簡單腳本啓動/終止容器(docker run/stop)。

      能夠選擇用Docker Compose啓動/中止批量容器(須要代碼中提供docker.compose.yaml文件)。

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

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

  

  二、多臺服務器

    代碼存儲在碼雲或是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,這種方式我暫時沒有嘗試過,應該也是行的通的。

 

3、現有集羣環境以下

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

  

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

  

   在Portainer菜單Service中能夠建立或更新service,獲取最新的鏡像完成更新操做,相比用命令行去操做輕鬆許多。

   

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

 

 本文地址:http://www.javashuo.com/article/p-mumkuarx-es.html 

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

 

2018-11-24,望技術有成後能回來看見本身的腳步
相關文章
相關標籤/搜索