init
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
FROM python:3.12-slim-bookworm
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1 \
|
||||
PIP_NO_CACHE_DIR=1 \
|
||||
PIP_PROGRESS_BAR=off \
|
||||
PIP_NO_COLOR=1 \
|
||||
PIP_QUIET=1
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN pip install --no-input --no-cache-dir --upgrade pip setuptools wheel
|
||||
|
||||
COPY requirements.txt /app/requirements.txt
|
||||
RUN pip install --no-input --no-cache-dir \
|
||||
-r /app/requirements.txt \
|
||||
-i https://pypi.tuna.tsinghua.edu.cn/simple/
|
||||
|
||||
COPY . /app
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["python", "server.py"]
|
||||
Vendored
+111
@@ -0,0 +1,111 @@
|
||||
// apbo-boat-agent/deploy/dev/Jenkinsfile
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
tools {
|
||||
jdk 'jdk21'
|
||||
maven 'apache-maven-3.9.12' // 与 Global Tool Configuration 中配置的 Name 保持一致
|
||||
}
|
||||
|
||||
environment {
|
||||
ENVIRONMENT = 'dev'
|
||||
DOCKER_REGISTRY = '10.122.172.43:9080' // 私有镜像仓库地址
|
||||
DOCKER_CREDENTIALS_ID = 'harbor-credentials-id' // Jenkins 中 Docker 凭证 ID
|
||||
DOCKER_PROJECT = 'apbo' // Jenkins 中 Docker 凭证 ID
|
||||
KUBECONFIG_CREDENTIALS_ID = 'k3s-cluster1-config' // Jenkins 中 kubeconfig 凭证 ID
|
||||
PROJECT_MODULE = 'apbo-boat-agent'
|
||||
|
||||
NAMESPACE = 'apbo-${ENVIRONMENT}' // 与 deployment.yaml 中的 namespace 一致
|
||||
IMAGE_TAG = "${ENVIRONMENT}-${BUILD_NUMBER}"
|
||||
IMAGE_NAME = "${DOCKER_REGISTRY}/${DOCKER_PROJECT}/${PROJECT_MODULE}:${IMAGE_TAG}"
|
||||
}
|
||||
|
||||
stages {
|
||||
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
checkout scm
|
||||
}
|
||||
}
|
||||
|
||||
stage('Check Code Changes') {
|
||||
steps {
|
||||
script {
|
||||
def prev = env.GIT_PREVIOUS_SUCCESSFUL_COMMIT ?: ''
|
||||
if (!prev?.trim()) {
|
||||
echo "未找到上次成功构建提交,默认执行构建"
|
||||
env.SKIP_BUILD = 'false'
|
||||
} else {
|
||||
int rc = sh(
|
||||
script: "git diff --quiet ${prev} HEAD -- apbo-boat-agent",
|
||||
returnStatus: true
|
||||
)
|
||||
env.SKIP_BUILD = (rc == 0) ? 'true' : 'false'
|
||||
}
|
||||
|
||||
echo "代码变更检查结果: SKIP_BUILD=${env.SKIP_BUILD}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
stage('Build & Push Docker Image') {
|
||||
when {
|
||||
expression { env.SKIP_BUILD != 'true' }
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
docker.withRegistry("http://${DOCKER_REGISTRY}", DOCKER_CREDENTIALS_ID) {
|
||||
dir('.') {
|
||||
def image = docker.build(
|
||||
"${IMAGE_NAME}",
|
||||
"-f apbo-boat-agent/deploy/${ENVIRONMENT}/Dockerfile --build-arg PIP_OPTIONS=\"--no-hash-check\" ./apbo-boat-agent"
|
||||
)
|
||||
image.push()
|
||||
image.push("${ENVIRONMENT}-latest")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy to K3s') {
|
||||
steps {
|
||||
script {
|
||||
// 使用 withCredentials 绑定 kubeconfig 文件
|
||||
withCredentials([file(credentialsId: KUBECONFIG_CREDENTIALS_ID, variable: 'KUBECONFIG')]) {
|
||||
// 设置 KUBECONFIG 环境变量
|
||||
withEnv(["KUBECONFIG=${env.KUBECONFIG}"]) {
|
||||
// 先 apply 整个 deployment.yaml(确保资源存在)
|
||||
sh "kubectl apply -f ${PROJECT_MODULE}/deploy/${ENVIRONMENT}/deployment.yaml -n ${NAMESPACE}"
|
||||
|
||||
// 滚动更新镜像
|
||||
sh "kubectl set image deployment/apbo-boat-agent-${ENVIRONMENT} apbo-boat-agent=${IMAGE_NAME} -n ${NAMESPACE} --record"
|
||||
|
||||
// 等待 rollout 完成
|
||||
sh "kubectl rollout status deployment/apbo-boat-agent-${ENVIRONMENT} -n ${NAMESPACE}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
success {
|
||||
script {
|
||||
echo '清理本次构建的 Docker 镜像以释放磁盘空间...'
|
||||
// 注意:此操作需要在 Jenkins 节点上安装并配置好 Docker 客户端,且能访问私有仓库
|
||||
sh """
|
||||
docker rmi ${IMAGE_NAME} || true
|
||||
"""
|
||||
// 清理所有悬空镜像,解决 <none> 问题
|
||||
sh 'docker image prune -f'
|
||||
echo '镜像清理完成。'
|
||||
}
|
||||
}
|
||||
failure {
|
||||
echo '部署失败,请检查日志'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
# K8s 模块
|
||||
|
||||
## 作用
|
||||
|
||||
存放 Kubernetes 部署清单,用于服务容器化部署。
|
||||
|
||||
## 文件
|
||||
|
||||
- `deployment.yaml`:应用部署配置
|
||||
@@ -0,0 +1,59 @@
|
||||
# apbo-boat-agent/deploy/dev/deployment.yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: apbo-boat-agent-dev
|
||||
namespace: apbo-dev # 替换为实际 namespace
|
||||
spec:
|
||||
strategy:
|
||||
type: Recreate # 防止出现之前的服务还没有下掉,端口占用,导致新的服务起不来
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: apbo-boat-agent-dev
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: apbo-boat-agent-dev
|
||||
spec:
|
||||
hostNetwork: true # 关键:使用宿主机网络
|
||||
containers:
|
||||
- name: apbo-boat-agent
|
||||
image: 10.122.172.43:9080/apbo-boat-agent:dev-latest # 占位镜像,Jenkins 会覆盖
|
||||
ports:
|
||||
- containerPort: 26004
|
||||
# 由于 hostNetwork,containerPort 直接占用宿主机 8080 端口
|
||||
env:
|
||||
- name: SPRING_PROFILES_ACTIVE
|
||||
value: "dev"
|
||||
- name: NACOS_SERVER_ADDR
|
||||
value: "10.122.132.204:8848" # 根据实际 Nacos 地址调整
|
||||
- name: NACOS_NAMESPACE
|
||||
value: "apbo_dev"
|
||||
- name: NACOS_GROUP
|
||||
value: "apbo"
|
||||
- name: NACOS_USERNAME
|
||||
value: "nacos"
|
||||
- name: NACOS_PASSWORD
|
||||
value: "bgs20250901"
|
||||
# 如有其他配置,通过环境变量传递
|
||||
resources:
|
||||
requests:
|
||||
memory: "1Gi"
|
||||
cpu: "1000m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "2000m"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: apbo-boat-agent-dev
|
||||
namespace: apbo-dev
|
||||
spec:
|
||||
selector:
|
||||
app: apbo-boat-agent-dev
|
||||
ports:
|
||||
- port: 8000
|
||||
targetPort: 26004
|
||||
type: ClusterIP # 该 Service 仅用于集群内 DNS 发现,实际访问通过宿主机 IP + 8080
|
||||
Reference in New Issue
Block a user