Spring Cloud【使用jenkins持續部署】Gogs+jenkins+Docker Swarm+Protainer

導讀:

好久沒有更新文章了 最近公司在使用Spring Cloud構建的項目中常常會持續發佈變動頻繁,一天中會出現發佈屢次的狀況 在這種狀況下對測試環境作了改造 使得開發人員能夠再也不過多關注發佈與更新docker鏡像的操做 當master分支上的代碼發生變化時會自動更新docker容器中正在運行的鏡像版本,目前分爲 開發環境 測試環境 和線上環境 三套 測試環境接近於線上環境。html

持續集成、持續部署、持續交付的概念以及其目的?

集成是指軟件我的研發的部分向軟件總體部分交付,以便儘早發現我的開發部分的問題; 

部署是代碼儘快向可運行的開發/測試節交付,以便儘早測試;

交付是指研發儘快向客戶交付,以便儘早發現生產環境中存在的問題。

若是說等到全部東西都完成了才向下個環節交付,致使全部的問題只能再最後才爆發出來,解決成本巨大甚至沒法解決。git

而所謂的持續,就是說每完成一個完整的部分,就向下個環節交付,發現問題能夠立刻調整。
是的問題不會放大到其餘部分和後面的環節。

這種作法的核心思想在於:既然事實上難以作到事先徹底瞭解完整的、正確的需求,那麼就乾脆一小塊一小塊的作,而且加快交付的速度和頻率,使得交付物儘早在下個環節獲得驗證。早發現問題早返工。
舉個例子,你家裝修廚房,其中一項是鋪地磚,邊角地磚要切割大小。若是一次全切割完再鋪上去,發現尺寸有誤的話浪費和返工時間就大了,不如切一塊鋪一塊。這就是持續集成。
裝修廚房有不少部分,每一個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電路通順,水管裝好了也要測試冷水熱水。若是所有裝完了再測,出現問題可能會互相影響,好比電路不行可能要把地磚給挖開……。那麼每完成一部分就測試,這是持續部署。
所有裝修完了,你去驗收,發現地磚顏色不合意,水池過小,竈臺位置不對,返工嗎?因此不如沒完成一部分,你就去用一下試用驗收,這就是持續交付。golang


補充:從敏捷思想中提出的這三個觀點,還強調一件事:經過技術手段自動化這三個工做。加快交付速度。

引用知乎-趙劼web

準備工做

工具

Gogs+jenkins+Docker+Docker Swarm(此處暫未使用k8s)+Protainerdocker

Gogs

Gogs是一款相似Github(國內有碼市)的開源文件/代碼管理系統(基於Git) 無聞大神寫的 以前學golang的時候就是看的他的視頻bash

Gogs

jenkins

Jenkins是一個功能強大的應用程序,容許持續集成和持續交付項目,不管用的是什麼平臺。這是一個免費的源代碼,能夠處理任何類型的構建或持續集成。網絡

jenkins

Docker

Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。maven

Docker

Protainer

Portainer是Docker的圖形化管理工具,提供狀態顯示面板、應用模板快速部署、容器鏡像網絡數據卷的基本操做(包括上傳下載鏡像,建立容器等操做)、事件日誌顯示、容器控制檯操做、Swarm集羣和服務等集中管理和操做、登陸用戶管理和控制等功能函數

Protainer

開始

思路

  • 使用Gogs的鉤子函數 來 觸發 jenkins
  • 項目發生變化 觸發 jenkins構建docker鏡像
    修改docker-compose.yml文件 提交 docker-compose.yml 到 gogs docker-compose 項目上
  • 當 gogs docker-compose 項目發生變化 觸發 jenkins docker swarm 運行最新的鏡像

使用jenkins持續部署

插件

此處咱們使用了兩個插件工具

maven構建Docker鏡像插件

<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 webhook插件

配置 Gogs webhook 插件

打開 系統管理 -> 管理插件 -> 可選插件 ,在右上角的輸入框中輸入「gogs」來篩選插件:
Gogs webhook

在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
相關文章
相關標籤/搜索