真香!GitLab 和 Docker自動(dòng)化部署SpringBoot應(yīng)用...
福利1:我寫了10 萬(wàn)字 Spring Boot 詳細(xì)學(xué)習(xí)筆記(帶完整目錄)+源碼,分享給大家
福利2:教妹子手?jǐn)]了50個(gè)項(xiàng)目實(shí)戰(zhàn)后,我超神了……
Docker和Spring Boot是非常流行的組合,我們將利用GitLab CI的優(yōu)勢(shì),并在應(yīng)用程序服務(wù)器上自動(dòng)構(gòu)建,推送和運(yùn)行Docker鏡像。
# GitLab CI
易于學(xué)習(xí),使用和可擴(kuò)展
維護(hù)容易
整合容易
CI完全屬于GitLab存儲(chǔ)庫(kù)的一部分
良好的Docker集成
鏡像托管(Container registry)-基本上是你自己的私有Docker Hub
從成本上來(lái)說(shuō),GitLab CI是一個(gè)很好的解決方案。每個(gè)月你有2000分鐘的免費(fèi)構(gòu)建時(shí)間,對(duì)于某些項(xiàng)目來(lái)說(shuō),這是綽綽有余的
為什么GitLab CI超越Jenkins
那為什么選擇GitLab?
使用GitLab CI 前提條件
你已經(jīng)在GitLab上推送了Spring Boot項(xiàng)目
你已在應(yīng)用程序服務(wù)器上安裝了Docker(指南)
你具有Docker鏡像的鏡像托管(本文中將使用Docker Hub)
你已經(jīng)在服務(wù)器上生成了SSH RSA密鑰(指南)
你要?jiǎng)?chuàng)建什么
構(gòu)建應(yīng)用程序Jar文件
構(gòu)建Docker鏡像
將鏡像推送到Docker存儲(chǔ)庫(kù)
在應(yīng)用程序服務(wù)器上運(yùn)行鏡像
基本項(xiàng)目信息
Docker文件
FROM maven:3.6.3-jdk-11-slim AS MAVEN_BUILD#FROM maven:3.5.2-jdk-8-alpine AS MAVEN_BUILD FOR JAVA 8ARG SPRING_ACTIVE_PROFILEMAINTAINER JasminCOPY pom.xml /build/COPY src /build/src/WORKDIR /build/RUN mvn clean install -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE && mvn package -B -e -Dspring.profiles.active=$SPRING_ACTIVE_PROFILEFROM openjdk:11-slim#FROM openjdk:8-alpine FOR JAVA 8WORKDIR /appCOPY --from=MAVEN_BUILD /build/target/appdemo-*.jar /app/appdemo.jarENTRYPOINT ["java", "-jar", "appdemo.jar"]# Java版本
Java 8-構(gòu)建時(shí)間:約4分鐘,鏡像大小為 約180 MB Java 11-構(gòu)建時(shí)間:約14分鐘,鏡像大小約為480 MB
# Docker鏡像
備注:動(dòng)態(tài)的變量
ENTRYPOINT [ “ java”,“ -Dspring.profiles.active = development”,“ -jar”,“ appdemo.jar” ]ENTRYPOINT [ “ java”,“ -Dspring.profiles.active = $ SPRINT_ACTIVE_PROFILE”,“ -jar”,“ appdemo.jar” ]gitlab-ci.yml
創(chuàng)建.env文件和分支
.develop.env .qa.env .master.env
export SPRING_ACTIVE_PROFILE='development'export DOCKER_REPO='username/demo_app:dev'export APP_NAME='demo_app_dev'export PORT='8080'export SERVER_IP='000.11.222.33'export SERVER_SSH_KEY="$DEV_SSH_PRIVATE_KEY"SPRING_ACTIVE_PROFILE:不言自明,我們要使用哪些Spring應(yīng)用程序?qū)傩浴OCKER_REPO:這是Docker鏡像的存儲(chǔ)庫(kù);在這里,我們唯一需要注意的是Docker image TAG,對(duì)于每種環(huán)境,我們將使用不同的標(biāo)簽,這意味著我們將使用dev,qa 和prod 標(biāo)簽。

APP_NAME:?此屬性非常重要,它是對(duì)容器的命名。如果你未設(shè)置此屬性,則Docker將為你的容器隨機(jī)命名。這可能是一個(gè)問(wèn)題,因?yàn)槟銓o(wú)法以干凈的方式停止運(yùn)行容器。
端口:這是我們希望運(yùn)行Docker容器的端口。
SERVER_IP:應(yīng)用程序使用的服務(wù)器IP。通常,每個(gè)環(huán)境都將位于不同的服務(wù)器上。
SERVER_SSH_KEY:這是我們已經(jīng)在每臺(tái)服務(wù)器上生成的SSH密鑰。$DEV_SSH_PRIVATE_KEY 實(shí)際上是來(lái)自GitLab存儲(chǔ)庫(kù)的變量。
創(chuàng)建GitLab變量
DOCKER_USER:用于訪問(wèn)Docker Hub或其他鏡像托管的用戶名
DOCKER_PASSWORD:?用于訪問(wèn)鏡像托管的密碼
$ENV_SSH_PRIVATE_KEY:?先前在服務(wù)器上生成的SSH私鑰。
你需要復(fù)制完整的密鑰值,包括:—– BEGIN RSA PRIVATE KEY —–和—– END RSA PRIVATE KEY —–

創(chuàng)建gitlab-ci.yml文件
services: - docker:19.03.7-dindstages: - build jar - build and push docker image - deploybuild: image: maven:3.6.3-jdk-11-slim stage: build jar before_script: - source .${CI_COMMIT_REF_NAME}.env script: - mvn clean install -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE && mvn package -B -e -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE artifacts: paths: - target/*.jardocker build: image: docker:stable stage: build and push docker image before_script: - source .${CI_COMMIT_REF_NAME}.env script: - docker build --build-arg SPRING_ACTIVE_PROFILE=$SPRING_ACTIVE_PROFILE -t $DOCKER_REPO . - docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker.io - docker push $DOCKER_REPOdeploy: image: ubuntu:latest stage: deploy before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config - source .${CI_COMMIT_REF_NAME}.env script: - ssh root@$SERVER "docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker.io; docker stop $APP_NAME; docker system prune -a -f; docker pull $DOCKER_REPO; docker container run -d --name $APP_NAME -p $PORT:8080 -e SPRING_PROFILES_ACTIVE=$SPRING_ACTIVE_PROFILE $DOCKER_REPO; docker logout"services: - docker:19.03.7-dind
stages: - build jar - build and push docker image - deploy
before_script: - source .${CI_COMMIT_REF_NAME}.env

build: image: maven:3.6.3-jdk-11-slim stage: build jar before_script: - source .${CI_COMMIT_REF_NAME}.env script: - mvn clean install -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE && mvn package -B -e -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE artifacts: paths: - target/*.jardocker build: image: docker:stable stage: build and push docker image before_script: ? ?- source .${CI_COMMIT_REF_NAME}.env script: ? ?- docker build --build-arg SPRING_ACTIVE_PROFILE=$SPRING_ACTIVE_PROFILE -t $DOCKER_REPO . ? ?- docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker.io ? ?- docker push $DOCKER_REPO
deploy: image: ubuntu:latest stage: deploy before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config - source .${CI_COMMIT_REF_NAME}.env script: - ssh root@$SERVER "docker stop $APP_NAME; docker system prune -a -f; docker pull $DOCKER_REPO; docker container run -d --name $APP_NAME -p $PORT:8080 -e SPRING_PROFILES_ACTIVE=$SPRING_ACTIVE_PROFILE $DOCKER_REPO"- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
停止正在運(yùn)行的Docker容器:docker stop $APP_NAME。(這就是我們要在.env文件中定義APP_NAME的原因 )
刪除所有未運(yùn)行的Docker鏡像:docker system prune -a -f,這實(shí)際上不是強(qiáng)制性的,但我想刪除服務(wù)器上所有未使用的鏡像。
拉取最新版本的Docker鏡像(該鏡像是在上一個(gè)階段中構(gòu)建并推送的)。
最后,使用以下命令運(yùn)行Docker鏡像:
docker container run -d --name $APP_NAME -p $PORT:8080 -e SPRING_PROFILES_ACTIVE=$SPRING_ACTIVE_PROFILE $DOCKER_REPO來(lái)源:http://suo.im/5ZMDjf
最后免費(fèi)給大家分享50個(gè)Java項(xiàng)目實(shí)戰(zhàn)資料,涵蓋入門、進(jìn)階各個(gè)階段學(xué)習(xí)內(nèi)容,可以說(shuō)非常全面了。大部分視頻還附帶源碼,學(xué)起來(lái)還不費(fèi)勁!
附上截圖。(下面有下載方式)。
項(xiàng)目領(lǐng)取方式:
掃描下方公眾號(hào)回復(fù):50,
可獲取下載鏈接
???
?長(zhǎng)按上方二維碼?2 秒 回復(fù)「50」即可獲取資料 點(diǎn)贊是最大的支持?







