好久沒有更新文章了 最近公司在使用Spring Cloud構建的項目中常常會持續發佈變動頻繁,一天中會出現發佈屢次的狀況 在這種狀況下對測試環境作了改造 使得開發人員能夠再也不過多關注發佈與更新docker鏡像的操做 當master分支上的代碼發生變化時會自動更新docker容器中正在運行的鏡像版本,目前分爲 開發環境 測試環境 和線上環境 三套 測試環境接近於線上環境。html
集成是指軟件我的研發的部分向軟件總體部分交付,以便儘早發現我的開發部分的問題; 部署是代碼儘快向可運行的開發/測試節交付,以便儘早測試; 交付是指研發儘快向客戶交付,以便儘早發現生產環境中存在的問題。若是說等到全部東西都完成了才向下個環節交付,致使全部的問題只能再最後才爆發出來,解決成本巨大甚至沒法解決。git
而所謂的持續,就是說每完成一個完整的部分,就向下個環節交付,發現問題能夠立刻調整。 是的問題不會放大到其餘部分和後面的環節。這種作法的核心思想在於:既然事實上難以作到事先徹底瞭解完整的、正確的需求,那麼就乾脆一小塊一小塊的作,而且加快交付的速度和頻率,使得交付物儘早在下個環節獲得驗證。早發現問題早返工。
舉個例子,你家裝修廚房,其中一項是鋪地磚,邊角地磚要切割大小。若是一次全切割完再鋪上去,發現尺寸有誤的話浪費和返工時間就大了,不如切一塊鋪一塊。這就是持續集成。
裝修廚房有不少部分,每一個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電路通順,水管裝好了也要測試冷水熱水。若是所有裝完了再測,出現問題可能會互相影響,好比電路不行可能要把地磚給挖開……。那麼每完成一部分就測試,這是持續部署。
所有裝修完了,你去驗收,發現地磚顏色不合意,水池過小,竈臺位置不對,返工嗎?因此不如沒完成一部分,你就去用一下試用驗收,這就是持續交付。golang
補充:從敏捷思想中提出的這三個觀點,還強調一件事:經過技術手段自動化這三個工做。加快交付速度。
引用知乎-趙劼web
Gogs+jenkins+Docker+Docker Swarm(此處暫未使用k8s)+Protainerdocker
Gogs是一款相似Github(國內有碼市)的開源文件/代碼管理系統(基於Git) 無聞大神寫的 以前學golang的時候就是看的他的視頻bash
Jenkins是一個功能強大的應用程序,容許持續集成和持續交付項目,不管用的是什麼平臺。這是一個免費的源代碼,能夠處理任何類型的構建或持續集成。網絡
Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。maven
Portainer是Docker的圖形化管理工具,提供狀態顯示面板、應用模板快速部署、容器鏡像網絡數據卷的基本操做(包括上傳下載鏡像,建立容器等操做)、事件日誌顯示、容器控制檯操做、Swarm集羣和服務等集中管理和操做、登陸用戶管理和控制等功能函數
此處咱們使用了兩個插件工具
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.3</version> <configuration> <repository>192.168.2.50:8082/demo/${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> <executions> <execution> <id>default</id> <phase>package</phase> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> </plugin>
打開 系統管理 -> 管理插件 -> 可選插件 ,在右上角的輸入框中輸入「gogs」來篩選插件:
1.進入咱們的倉庫,點擊倉庫設置
2.添加webhook
點擊 管理Web鉤子 -> 添加Web鉤子 ->選擇Gogs
添加以下配置:
推送地址的格式爲:http(s)://<你的Jenkins地址>/gogs-webhook/?job=<你的Jenkins任務名>
3.配置Jenkins
進入主面板,點擊咱們的任務:
選擇配置:
選擇Gogs Webhook 根據本身的須要進行配置,若是沒有設置密鑰那麼什麼都不用動。
測試
咱們回到gogs,點擊 推送測試 ,推送成功以後會看到一條推送記錄
回到咱們的Jenkins能夠看到已經成功進行了一次構建:
待續......
docker stack deploy --with-registry-auth -c docker-compose.yml dx-ec
#!/bin/bash APP_NAME=goods-center #TODO 分支若是發生變化就進行下面操做 rm -rf ./target docker login --username=admin --password=admin123 192.168.2.50:8082 #打包上傳docker鏡像 mvn package -Dmaven.test.skip=true # 獲取tag jarName=$(ls ./target/ | grep 'docker-info.jar' | awk '{print $1}' | sed -n '1,1p') jarInfo=${jarName:0:-16} len=${#APP_NAME} DOCKER_TAG=${jarInfo:len+1} IMAGE_NAME='192.168.2.50:8082/dx-ec/'${APP_NAME} cd ../deploy-robot git checkout master line=$(cat -n ./docker-compose.yml | grep "${IMAGE_NAME}" | awk '{print $1}') #修改版本號 sed -i "${line}c\ image: ${IMAGE_NAME}:${DOCKER_TAG}" ./docker-compose.yml #TODO 提交docker-compose.yml 觸發 robot git add docker-compose.yml git commit -m "update docker-compose.yml line: ${line} image: ${APP_NAME}:${DOCKER_TAG}" git push -u origin master