3 Commits
4 changed files with 19 additions and 136 deletions
+2 -37
View File
@@ -19,10 +19,6 @@ env:
jobs: jobs:
build-and-deploy: build-and-deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: maven:3.9-eclipse-temurin-17
volumes:
- maven-cache:/root/.m2
steps: steps:
- name: Validate branch ↔ environment - name: Validate branch ↔ environment
run: | run: |
@@ -66,26 +62,9 @@ jobs:
- name: Checkout code - name: Checkout code
run: | run: |
set -euo pipefail set -euo pipefail
# maven 容器可能无 git
if ! command -v git >/dev/null 2>&1; then
apt-get update -qq
apt-get install -y -qq git
fi
git clone "$REPO_URL" . git clone "$REPO_URL" .
git checkout "${{ gitea.sha }}" git checkout "${{ gitea.sha }}"
- name: Install Docker CLI
run: |
set -euo pipefail
apt-get update -qq
apt-get install -y -qq docker.io
docker --version
- name: Build with Maven
run: |
set -euo pipefail
mvn clean package -DskipTests -B
- name: Login to Docker Registry - name: Login to Docker Registry
run: | run: |
set -euo pipefail set -euo pipefail
@@ -100,17 +79,10 @@ jobs:
docker build -t "$REGISTRY/$APP:$TAG" -t "$REGISTRY/$APP:$ENV" . docker build -t "$REGISTRY/$APP:$TAG" -t "$REGISTRY/$APP:$ENV" .
docker push "$REGISTRY/$APP:$TAG" docker push "$REGISTRY/$APP:$TAG"
docker push "$REGISTRY/$APP:$ENV" docker push "$REGISTRY/$APP:$ENV"
if [ -n "${GITHUB_ENV:-}" ]; then echo "IMAGE_TAG=$TAG"
echo "IMAGE_TAG=$TAG" >> "$GITHUB_ENV"
fi
if [ -n "${GITEA_ENV:-}" ]; then
echo "IMAGE_TAG=$TAG" >> "$GITEA_ENV"
fi
# runner.temp 在 container job 里可能不可用,用工作区文件兜底
echo "$TAG" > image_tag.txt echo "$TAG" > image_tag.txt
mkdir -p /tmp/lpt-ci mkdir -p /tmp/lpt-ci
echo "$TAG" > /tmp/lpt-ci/image_tag.txt echo "$TAG" > /tmp/lpt-ci/image_tag.txt
echo "IMAGE_TAG=$TAG"
- name: Setup kubectl - name: Setup kubectl
run: | run: |
@@ -135,19 +107,12 @@ jobs:
run: | run: |
set -euo pipefail set -euo pipefail
ENV="${{ inputs.environment }}" ENV="${{ inputs.environment }}"
IMAGE_TAG="${IMAGE_TAG:-}" IMAGE_TAG="$(cat image_tag.txt 2>/dev/null || cat /tmp/lpt-ci/image_tag.txt 2>/dev/null || echo '')"
if [ -z "$IMAGE_TAG" ] && [ -f image_tag.txt ]; then
IMAGE_TAG="$(cat image_tag.txt)"
fi
if [ -z "$IMAGE_TAG" ] && [ -f /tmp/lpt-ci/image_tag.txt ]; then
IMAGE_TAG="$(cat /tmp/lpt-ci/image_tag.txt)"
fi
if [ -z "$IMAGE_TAG" ]; then if [ -z "$IMAGE_TAG" ]; then
echo "ERROR: IMAGE_TAG 为空,无法部署" echo "ERROR: IMAGE_TAG 为空,无法部署"
exit 1 exit 1
fi fi
echo "Deploying $REGISTRY/$APP:$IMAGE_TAG -> namespace lpt-$ENV" echo "Deploying $REGISTRY/$APP:$IMAGE_TAG -> namespace lpt-$ENV"
# Spring profile 由 K8s Deployment 的 SPRING_PROFILES_ACTIVE 控制,镜像本身不区分
kubectl set image "deployment/$APP" \ kubectl set image "deployment/$APP" \
"$APP=$REGISTRY/$APP:$IMAGE_TAG" \ "$APP=$REGISTRY/$APP:$IMAGE_TAG" \
-n "lpt-$ENV" --record -n "lpt-$ENV" --record
+17 -10
View File
@@ -1,17 +1,24 @@
# 使用官方 OpenJDK 作为基础镜像 # Stage 1: Maven 构建(Docker 层缓存自动缓存依赖)
FROM eclipse-temurin:17-jre FROM maven:3.9-eclipse-temurin-17 AS builder
# 设置工作目录
WORKDIR /app WORKDIR /app
# 拷贝打包好的 JAR 文件到容器 # 先复制 pom.xml,单独一层 —— 只要依赖不变,这层就被缓存
COPY target/LPT.jar LPT.jar COPY pom.xml .
RUN mvn dependency:go-offline -B -q
# 再复制源码构建
COPY src/ ./src/
RUN mvn package -DskipTests -B -q
# Stage 2: 运行时(精简 JRE
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=builder /app/target/LPT.jar LPT.jar
# 暴露应用运行的端口
EXPOSE 8888 EXPOSE 8888
# 启动应用
ENTRYPOINT ["java", "-jar", "LPT.jar"] ENTRYPOINT ["java", "-jar", "LPT.jar"]
# 健康检查 HEALTHCHECK --interval=10s --timeout=5s \
HEALTHCHECK --interval=10s --timeout=5s CMD curl --fail http://localhost:8888/actuator/health || exit 1 CMD curl --fail http://localhost:8888/actuator/health || exit 1
-73
View File
@@ -1,73 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: lpt-be
namespace: lpt-dev
labels:
app: lpt-be
spec:
replicas: 1
selector:
matchLabels:
app: lpt-be
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
template:
metadata:
labels:
app: lpt-be
spec:
imagePullSecrets:
- name: regcred
containers:
- name: lpt-be
image: 192.168.123.199:5000/lpt-be:dev
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
env:
- name: SPRING_PROFILES_ACTIVE
value: dev
- name: SPRING_DATASOURCE_URL
valueFrom:
configMapKeyRef:
name: lpt-config
key: SPRING_DATASOURCE_URL
- name: SPRING_DATASOURCE_USERNAME
value: root
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: lpt-secrets
key: mysql-root-password
- name: LPT_AI-SERVICE_URL
valueFrom:
configMapKeyRef:
name: lpt-config
key: LPT_AI-SERVICE_URL
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
livenessProbe:
httpGet:
path: /actuator/health
port: 8888
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health
port: 8888
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
-16
View File
@@ -1,16 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: lpt-be
namespace: lpt-dev
labels:
app: lpt-be
spec:
type: NodePort
selector:
app: lpt-be
ports:
- port: 8888
targetPort: 8888
nodePort: 30082
protocol: TCP