|
@@ -8,17 +8,13 @@ pipeline {
|
|
|
|
|
|
environment {
|
|
environment {
|
|
PROJECT_NAME = 'gateway-service'
|
|
PROJECT_NAME = 'gateway-service'
|
|
- MODULE_NAME = 'gateway-service-server'
|
|
|
|
MAVEN_HOME = '/usr/local/apache-maven-3.9.9/bin'
|
|
MAVEN_HOME = '/usr/local/apache-maven-3.9.9/bin'
|
|
HARBOR_HOST = '8.130.28.21:81'
|
|
HARBOR_HOST = '8.130.28.21:81'
|
|
- HARBOR_USERNAME = 'admin'
|
|
|
|
- HARBOR_PASSWORD = 'Hfln@1024'
|
|
|
|
KUBECONFIG_PATH = '/root/.kube/config'
|
|
KUBECONFIG_PATH = '/root/.kube/config'
|
|
SPRING_PROFILES_ACTIVE = "${params.env}"
|
|
SPRING_PROFILES_ACTIVE = "${params.env}"
|
|
}
|
|
}
|
|
|
|
|
|
stages {
|
|
stages {
|
|
-
|
|
|
|
stage('🧬 拉取 Git 代码') {
|
|
stage('🧬 拉取 Git 代码') {
|
|
steps {
|
|
steps {
|
|
script {
|
|
script {
|
|
@@ -29,11 +25,11 @@ pipeline {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- stage('📦 Maven 构建') {
|
|
|
|
|
|
+ stage('📦 Maven 构建项目') {
|
|
steps {
|
|
steps {
|
|
script {
|
|
script {
|
|
- echo ">>> 构建模块 ${MODULE_NAME}"
|
|
|
|
- sh "${MAVEN_HOME}/mvn clean package -pl ${MODULE_NAME} -am -DskipTests"
|
|
|
|
|
|
+ echo ">>> 开始构建模块 ${PROJECT_NAME}"
|
|
|
|
+ sh "${MAVEN_HOME}/mvn clean package -DskipTests"
|
|
echo ">>> 构建完成 ✅"
|
|
echo ">>> 构建完成 ✅"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -43,10 +39,10 @@ pipeline {
|
|
steps {
|
|
steps {
|
|
script {
|
|
script {
|
|
def imageTag = "${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:${BUILD_NUMBER}"
|
|
def imageTag = "${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:${BUILD_NUMBER}"
|
|
- echo ">>> 构建镜像: ${imageTag}"
|
|
|
|
|
|
+ echo ">>> 构建 Docker 镜像: ${imageTag}"
|
|
sh """
|
|
sh """
|
|
- docker login -u ${HARBOR_USERNAME} -p ${HARBOR_PASSWORD} ${HARBOR_HOST}
|
|
|
|
- docker build -t ${imageTag} --build-arg env=${params.env} .
|
|
|
|
|
|
+ docker login -u admin -p Hfln@1024 ${HARBOR_HOST}
|
|
|
|
+ docker build --build-arg env=${params.env} -t ${imageTag} .
|
|
docker push ${imageTag}
|
|
docker push ${imageTag}
|
|
docker rmi ${imageTag}
|
|
docker rmi ${imageTag}
|
|
"""
|
|
"""
|
|
@@ -59,24 +55,16 @@ pipeline {
|
|
steps {
|
|
steps {
|
|
script {
|
|
script {
|
|
def imageTag = "${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:${BUILD_NUMBER}"
|
|
def imageTag = "${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:${BUILD_NUMBER}"
|
|
- echo ">>> 开始部署到 Kubernetes:namespace=${params.NAMESPACE}"
|
|
|
|
|
|
+ echo ">>> 部署到 Kubernetes,命名空间:${params.NAMESPACE}"
|
|
|
|
|
|
sh """
|
|
sh """
|
|
export KUBECONFIG=${KUBECONFIG_PATH}
|
|
export KUBECONFIG=${KUBECONFIG_PATH}
|
|
|
|
|
|
- # 创建 namespace(如果不存在)
|
|
|
|
|
|
+ # 创建命名空间(如果不存在)
|
|
kubectl get ns ${params.NAMESPACE} || kubectl create ns ${params.NAMESPACE}
|
|
kubectl get ns ${params.NAMESPACE} || kubectl create ns ${params.NAMESPACE}
|
|
|
|
|
|
- # 创建 Harbor 镜像拉取密钥(如果不存在)
|
|
|
|
- kubectl get secret harbor-secret -n ${params.NAMESPACE} || kubectl create secret docker-registry harbor-secret \
|
|
|
|
- --docker-server=${HARBOR_HOST} \
|
|
|
|
- --docker-username=${HARBOR_USERNAME} \
|
|
|
|
- --docker-password=${HARBOR_PASSWORD} \
|
|
|
|
- --docker-email=admin@hfln.local \
|
|
|
|
- -n ${params.NAMESPACE}
|
|
|
|
-
|
|
|
|
- # 应用 Deployment + Service
|
|
|
|
- cat <<EOF | kubectl apply -n ${params.NAMESPACE} -f -
|
|
|
|
|
|
+ # 应用 Deployment(2 副本)
|
|
|
|
+ kubectl apply -n ${params.NAMESPACE} -f - <<EOF
|
|
apiVersion: apps/v1
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
kind: Deployment
|
|
metadata:
|
|
metadata:
|
|
@@ -95,28 +83,29 @@ spec:
|
|
- name: ${PROJECT_NAME}
|
|
- name: ${PROJECT_NAME}
|
|
image: ${imageTag}
|
|
image: ${imageTag}
|
|
ports:
|
|
ports:
|
|
- - containerPort: 8080
|
|
|
|
|
|
+ - containerPort: 8090
|
|
env:
|
|
env:
|
|
- name: SPRING_PROFILES_ACTIVE
|
|
- name: SPRING_PROFILES_ACTIVE
|
|
value: "${params.env}"
|
|
value: "${params.env}"
|
|
- imagePullSecrets:
|
|
|
|
- - name: harbor-secret
|
|
|
|
----
|
|
|
|
|
|
+EOF
|
|
|
|
+
|
|
|
|
+ # 应用 NodePort Service(暴露端口为 30085)
|
|
|
|
+ kubectl apply -n ${params.NAMESPACE} -f - <<EOF
|
|
apiVersion: v1
|
|
apiVersion: v1
|
|
kind: Service
|
|
kind: Service
|
|
metadata:
|
|
metadata:
|
|
name: ${PROJECT_NAME}
|
|
name: ${PROJECT_NAME}
|
|
spec:
|
|
spec:
|
|
|
|
+ type: NodePort
|
|
selector:
|
|
selector:
|
|
app: ${PROJECT_NAME}
|
|
app: ${PROJECT_NAME}
|
|
- type: NodePort
|
|
|
|
ports:
|
|
ports:
|
|
- port: 80
|
|
- port: 80
|
|
- targetPort: 8080
|
|
|
|
|
|
+ targetPort: 8090
|
|
nodePort: 30085
|
|
nodePort: 30085
|
|
EOF
|
|
EOF
|
|
"""
|
|
"""
|
|
- echo ">>> ✅ 部署成功,服务地址:http://<任意NodeIP>:30085/"
|
|
|
|
|
|
+ echo ">>> 部署完成 ✅,请访问:http://<任意节点IP>:30085/"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -124,23 +113,27 @@ EOF
|
|
|
|
|
|
post {
|
|
post {
|
|
success {
|
|
success {
|
|
- echo "🎉 构建 & 部署成功 ✅"
|
|
|
|
script {
|
|
script {
|
|
- // 清理本地旧镜像,仅保留最近3个
|
|
|
|
|
|
+ echo "✅ 构建 & 部署成功 🎉"
|
|
|
|
+
|
|
|
|
+ // 清理本地旧镜像(仅保留最新3个)
|
|
sh """
|
|
sh """
|
|
docker images --format '{{.Repository}}:{{.Tag}} {{.CreatedAt}}' | \
|
|
docker images --format '{{.Repository}}:{{.Tag}} {{.CreatedAt}}' | \
|
|
grep '${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:' | \
|
|
grep '${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:' | \
|
|
sort -rk2 | \
|
|
sort -rk2 | \
|
|
tail -n +4 | \
|
|
tail -n +4 | \
|
|
- awk '{print \$1}' | xargs -r docker rmi || true
|
|
|
|
|
|
+ awk '{print \$1}' | \
|
|
|
|
+ xargs -r docker rmi || true
|
|
"""
|
|
"""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
failure {
|
|
failure {
|
|
echo "❌ 构建或部署失败,请检查日志。"
|
|
echo "❌ 构建或部署失败,请检查日志。"
|
|
}
|
|
}
|
|
|
|
+
|
|
always {
|
|
always {
|
|
- echo "🧼 清理 Jenkins 工作区..."
|
|
|
|
|
|
+ echo "🧼 清理 Jenkins 工作目录..."
|
|
cleanWs()
|
|
cleanWs()
|
|
}
|
|
}
|
|
}
|
|
}
|