Ubuntu下Jenkins+Docker自動化部署spring cloud專案
阿新 • • 發佈:2020-07-18
環境說明:
- 作業系統:Ubuntu 18.04 64位(阿里雲伺服器)
- Jenkins:2.235.1
- Docker:19.03.12
說明:
預設你的伺服器已經安裝了docker、Jenkins環境(沒裝的可以參考我上一篇),spring cloud專案程式碼已經提交到倉庫。
下面進行Jenkins的配置以及專案中docker相關配置檔案說明。
1.專案中Dockerfile,以及docker-compose.yml檔案說明
聚合專案的每個子模組下都建立一個Dockerfile,用於後續構建docker image。
FROM java:8 #VOLUME /tmp ADD target/api-gateway-1.0.0-SNAPSHOT.jar app.jarENTRYPOINT ["java","-jar","app.jar"] EXPOSE 5555
每個子模組的Dockerfile可以參考上面的程式碼,jar包名稱需要根據你的專案進行調整。
然後整個專案的根目錄下建立docker-compose.yml,用於後續利用docker compose進行多容器的管理。
version: "3" services: eureka-server : image: eureka-server ports: - "1111:1111" # volumes: # - /usr/local/cloud/logs/eureka-server:/logs networks: - my-cloud feign-consumer: image: feign-consumer ports: -"9002:9002" # volumes: # - /usr/local/cloud/logs/provider:/logs networks: - my-cloud depends_on: - eureka-server api-gateway: image: api-gateway ports: - "5555:5555" # volumes: # - /usr/local/cloud/logs/consumer:/logs networks: - my-cloud depends_on: - eureka-server booking-service: image: booking-service ports: -"8080:8080" # volumes: # - /usr/local/cloud/logs/consumer:/logs networks: - my-cloud depends_on: - eureka-server mysql: image: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: databaseName volumes: - /home/Booking-Center/mysqlData:/var/lib/mysql networks: - my-cloud networks: my-cloud: driver: bridge
2.伺服器docker compose的安裝:
root@Colin:~# sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 100 617 0 0 695 0 --:--:-- --:--:-- --:--:-- 694 100 16.3M 100 16.3M 0 0 113k 0 0:02:27 0:02:27 --:--:-- 368k sudo chmod +x /usr/local/bin/docker-compose root@Colin:~# docker-compose --version docker-compose version 1.25.4, build 8d51620a
3.Jenkins相關配置:
安裝maven外掛
點選左邊Manage Jenkins -->ManagePlugins --> available 上面搜尋maven,選擇然後install without restart,我這裡已經安裝過了
選擇安裝maven版本
點選左邊Manage Jenkins --> Global Tool Configuration,拉到頁面最下方,名字隨意,然後save
新建一個maven專案
Post Steps增加構建步驟,shell指令碼:Add post-build step -> execute shell
在command中新增以下shell指令碼:
#docker執行服務URL #操作/專案路徑(Dockerfile存放的路勁) BASE_PATH=/var/lib/jenkins/workspace # 源專案工作空間 #SOURCE_PATH=/var/lib/jenkins/workspace #docker 映象路徑,也是父專案路徑 PARENT_PATH=Booking-Center #docker 映象/容器/專案名字或者jar名字陣列 這裡都使用專案名命名 PROJECT_NAMES=("eureka-server" "feign-consumer" "api-gateway" "booking-service") #專案版本號/docker 容器tag,使用專案版本號來做tag,版本號要與專案陣列PROJECT_NAMES一一對應 PROJECT_VERSIONS=("1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT") #docker容器暴露的埠,埠號要與專案陣列PROJECT_NAMES一一對應,這裡為了簡化,docker容器埠與宿主機埠配置成一樣的。 EXPOSE_PORTS=("1111" "9002" "5555" "8080") ##############以下內容不用修改 DATE=`date +%Y%m%d%H%M` #建立專案環境目錄 function projectDir(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do if [ ! -e $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} ] && [ ! -d $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} ]; then mkdir -p $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} echo "Create Dir: $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]}" fi done } # 構建docker映象 function build(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do #映象id IID=$(docker images | grep "${PROJECT_NAMES[$i]}" | awk '{print $3}') if [ -n "$IID" ]; then echo "存在${PROJECT_NAMES[$i]}映象,IID=$IID" echo "刪除${PROJECT_NAMES[$i]}映象..." docker rmi $IID echo "重新構建映象" cd $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} docker build -t ${PROJECT_NAMES[$i]} . else echo "不存在${PROJECT_NAMES[$i]}映象,開始構建映象" cd $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} docker build -t ${PROJECT_NAMES[$i]} . fi done } function delContainer(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do #容器id CID=$(docker ps -a | grep "${PROJECT_NAMES[$i]}" | awk '{print $1}') if [ -n "$CID" ]; then echo "存在${PROJECT_NAMES[$i]}容器,CID=$CID,停止並刪除docker容器 ..." docker rm -f $CID echo "${PROJECT_NAMES[$i]}容器停止刪除完成" else echo "不存在${PROJECT_NAMES[$i]}容器" fi done } # 執行docker容器 function run(){ projectDir delContainer build #啟動容器,我們採用docker compose來編排docker容器,解決docker容器之間網路訪問的問題 #先編寫docker-compose.yml檔案後,放入專案路徑下 cd $BASE_PATH/$PARENT_PATH docker-compose up -d } #入口 run
save之後開始構建,檢視控制檯輸出:
4.設定能夠遠端登入docker中的MySQL:
docker exec -it [mysql] /bin/bash mysql -u root -p ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; flush privileges; exit;
參考過的部落格:
微服務架構持續整合:(四)通過jenkins + docker 部署spring cloud微服務