CI/CD:GitLab-CI 自動(dòng)化集成/部署 JAVA微服務(wù)的應(yīng)用合集
日常開發(fā)中,每次代碼編寫完成后,都需要手動(dòng)打包,并且上傳服務(wù)器,無論本地打包的時(shí)間或者上傳文件到服務(wù)器都需要花費(fèi)大量的時(shí)間來完成,都是重復(fù)的并且毫無意義,應(yīng)該將時(shí)間花費(fèi)在更有價(jià)值的時(shí)間上;所以編寫這篇文章,將自己收集、搭建、測(cè)試的步驟或經(jīng)驗(yàn)匯總一下,也歡迎大家提出或一起討論更好的解決方案。
前置技能:
- Shell簡(jiǎn)單腳本編寫(此項(xiàng)滿足則說明了解并能夠使用Linux)
- Docker
- Git
- Java(可選,既然看了這篇文章,這個(gè)會(huì)的吧,不過無論自動(dòng)化部署什么,原理都是相通的)
安裝
因?yàn)槎际潜镜販y(cè)試,采用Docker容器來進(jìn)行快速安裝,減少部署所花費(fèi)的時(shí)間,并且大部分之前都有寫過對(duì)應(yīng)的安裝文章,這里就不重復(fù)粘貼了。
Docker
Docker離線安裝
GitLab
Docker GitLab安裝
GitLab-Runner
Docker GitLab-Runner安裝
阿里云容器倉庫
(未使用跳過),原本打算使用Harbor鏡像私服倉庫或者阿里云容器倉庫,發(fā)現(xiàn)可以省略此步驟,將打包好的docker鏡像直接通過宿主機(jī)運(yùn)行(需要Runner配置docker in docker)。
GitLab-CI
進(jìn)入到CI/CD的核心,語法部分,都是死的,這里推薦一篇文章,原本是b站的視頻,發(fā)現(xiàn)有對(duì)應(yīng)文章就直接瀏覽了一遍文章再進(jìn)行測(cè)試,文章鏈接。
Java微服務(wù)的GitLab-CI應(yīng)用
- 拉取
gitlab-ci
模版?zhèn)}庫,并上傳到自己的gitlab上(注意CI/CD引入模版的代碼倉庫需要此倉庫權(quán)限)
gitlab-ci模版?zhèn)}庫(develop分支):https://github.com/zsl0/devops-ci-template.git
- Java倉庫項(xiàng)目目錄下創(chuàng)建.gitlab-ci.yml文件
簡(jiǎn)化版本,能夠滿足代碼提交后自動(dòng)docker運(yùn)行,注意需要根據(jù)需要運(yùn)行的輔助配置stage為deploy的job任務(wù),如下面配置的gateway
和admin
服務(wù)器自動(dòng)化部署,需要配置variables
的三個(gè)變量IMAGE_NAME
、MODULE_PATH
、JAR_NAME
,分別對(duì)應(yīng)服務(wù)名、服務(wù)模塊相對(duì)路徑、打包后的jar包名稱。
項(xiàng)目相對(duì)路徑:
.gitlab-ci.yml配置:文章來源:http://www.zghlxwxcb.cn/news/detail-718537.html
include:
- project: 'zsl0/devops-ci-template'
ref: develop
file: 'templates/default-pipeline.yml'
variables:
## 全局配置
GIT_CLONE_PATH: ${CI_BUILDS_DIR}/builds/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_PIPELINE_ID}
GIT_CHECKOUT: "false"
CACHE_DIR: "**/target/**.jar"
## 作業(yè)控制
RUN_PIPELINE_BUILD: "yes" #是否運(yùn)行構(gòu)建 yes/no
RUN_PIPELINE_TEST: "no" #是否運(yùn)行測(cè)試 yes/no
RUN_CODE_ANALYSIS: "no" #是否代碼掃描 yes/no
RUN_BUILD_IMAGE: "no" #是否生成鏡像 yes/no
RUN_DEPLOY_ARTIFACTS: "no" #是否上傳制品 yes/no
RUN_DEPLOY_K8S: "no" #是否發(fā)布K8S yes/no
RUN_DEPLOY_DOCKER: "yes" #是否發(fā)布DOCKER yes/no
## 依賴容器鏡像
BUILD_IMAGE: "registry.cn-hangzhou.aliyuncs.com/zsl0/maven-build:0.0.2"
CURL_IMAGE: "curlimages/curl:7.70.0"
SONAR_IMAGE: "sonarsource/sonar-scanner-cli:latest"
KUBECTL_IMAGE: "lucj/kubectl:1.17.2"
## 構(gòu)建測(cè)試參數(shù)
MAVEN_OPTS: "-Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven " #maven構(gòu)建參數(shù)
# BUILD_SHELL: 'mvn clean package -DskipTests -P zsl0-prod' #構(gòu)建命令
BUILD_SHELL: 'mvn clean package -DskipTests -P hxkj-dev' #構(gòu)建命令
#GRADLE_OPTS: "" #gradle構(gòu)建參數(shù)
## 單元測(cè)試參數(shù)
TEST_SHELL : 'mvn test ' #測(cè)試命令
JUNIT_REPORT_PATH: 'target/surefire-reports/TEST-*.xml' #單元測(cè)試報(bào)告 #項(xiàng)目掃描參數(shù)
## 構(gòu)建鏡像
#CI_REGISTRY: 'registry.cn-beijing.aliyuncs.com' #鏡像倉庫地址
#CI_REGISTRY_USER: '610556220zy' #倉庫用戶信息
#CI_REGISTRY_PASSWD: 'xxxxxxxx.' #倉庫用戶密碼
IMAGE_NAME: "${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #鏡像名稱
DOCKER_FILE_PATH: "./Dockerfile" #Dockerfile位置
## 上傳制品庫(artifactory)
#ARTIFACTORY_URL: "http://192.168.1.200:30082/artifactory" #制品庫地址
#ARTIFACTORY_NAME: "${CI_PROJECT_NAMESPACE}" #制品庫名稱
#ARTIFACT_PACKAGE: "jar" #制品類型
#ARTIFACT_PATH: "target/*.${ARTIFACT_PACKAGE}" #制品位置
#TARGET_FILE_PATH: "${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #目標(biāo)制品位置(目錄結(jié)構(gòu))
#TARGET_ARTIFACT_NAME: "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}.${ARTIFACT_PACKAGE}" #目標(biāo)制品名稱
## 部署應(yīng)用k8s
APP_NAME: "$CI_PROJECT_NAME" #應(yīng)用名稱 <-->deploymentName
CONTAINER_PORT: "8081" #服務(wù)端口 <--> servicesPort
NAMESPACE: "$CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_ENVIRONMENT_SLUG" #名稱空間
ENV_URL: "${ENV_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com" #IngressHosts
cache:
paths:
# 后續(xù)修改解決mvn打包repository緩存問題,需要根據(jù)路徑設(shè)置本地倉庫路徑
- /root/.m2/repository
- /opt/repository
- ~/.m2/repository
- ${CACHE_DIR}
## 構(gòu)建作業(yè)
build:
# 指定Runner,不指定默認(rèn)使用共享Runner
tags:
- runner-java
## 部署
## gateway Docker自動(dòng)化部署
deploy-gateway:
stage: deploy
image: docker:latest
tags:
- runner-java
extends: .deploy_docker
variables:
# 鏡像名稱,默認(rèn)使用服務(wù)名
IMAGE_NAME: "gateway"
# 模塊路徑
MODULE_PATH: "data-center/gateway/"
# jar包名稱
JAR_NAME: gateway.jar
## gateway Docker自動(dòng)化部署
deploy-admin-server:
stage: deploy
image: docker:latest
tags:
- runner-java
extends: .deploy_docker
variables:
# 鏡像名稱,默認(rèn)使用服務(wù)名
IMAGE_NAME: "admin-server"
# 模塊路徑
MODULE_PATH: "data-center/admin/admin-server/"
# jar包名稱
JAR_NAME: admin-server.jar
- 創(chuàng)建Dockerfile_template模版
FROM openjdk:11
MAINTAINER 249269610@qq.com
WORKDIR /opt/jar
RUN mkdir -p /opt/shell/
#ADD /zsl0/shell/ /opt/shell/
RUN mkdir -p /opt/jar/
ADD MODULE_PATH/target/JAR_NAME /opt/jar/java-program.jar
ENTRYPOINT ["java", "-jar"]
CMD ["java-program.jar"]
其他問題
Maven本地倉庫緩存
根據(jù) 參考文章 選擇在配置文件中添加 /.m2緩存目錄,并在指定mvn指定 /.m2/repository倉庫目錄:文章來源地址http://www.zghlxwxcb.cn/news/detail-718537.html
variables:
MAVEN_OPTS: "-Dmaven.repo.local=/.m2/repository " #maven構(gòu)建參數(shù)
到了這里,關(guān)于CI/CD:GitLab-CI 自動(dòng)化集成/部署 JAVA微服務(wù)的應(yīng)用合集的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!