文件解读(build-and-deploy.yml完整 CI/CD 流水线)
文件一build-and-deploy.yml完整 CI/CD 流水线作用这是项目的主要 CI/CD 流水线负责代码质量检查、容器镜像构建与推送、安全扫描、以及 Kubernetes 集群部署。它支持自动化触发推送、PR、标签和手动触发workflow_dispatch并提供了灵活的部署参数如目标集群、环境、镜像标签等。name: Build and Deploy CAMP Platform on: push: branches: [ main, develop ] tags: [ v* ] pull_request: branches: [ main ] workflow_dispatch: inputs: build: description: Build and push images required: false type: boolean default: false cluster: description: Target cluster required: true type: choice options: - local-dev - aks-dev - aks-staging - aks-prod default: local-dev environment: description: Target environment required: true type: choice options: - dev - staging - prod default: dev image_tag: description: Docker image tag required: false type: string default: latest deploy: description: Deploy after build required: false type: boolean default: false dry_run: description: Dry run deployment required: false type: boolean default: false env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true REGISTRY: ghcr.io IMAGE_NAME: kubernetes-microservices jobs: # Job 1 — build-and-lint (always runs, no secrets needed) build-and-lint: name: Build and Lint runs-on: ubuntu-latest permissions: contents: read steps: - name: Checkout code uses: actions/checkoutv4 - name: Validate project structure run: | echo Checking project structure... test -f camp-backend/requirements.txt || { echo requirements.txt not found; exit 1; } test -f camp-backend/run.py || { echo run.py not found; exit 1; } test -f helm/camp/Chart.yaml || { echo Helm Chart.yaml not found; exit 1; } test -f README.md || { echo README.md not found; exit 1; } echo ✅ Project structure validation passed - name: Validate configuration files run: | echo Checking configuration files... # Check if requirements.txt has valid content if [ -s camp-backend/requirements.txt ]; then echo ✅ requirements.txt exists and has content else echo ⚠️ requirements.txt is empty fi # Check if Helm chart is valid YAML if command -v yq /dev/null 21; then yq eval . helm/camp/Chart.yaml /dev/null echo ✅ Helm Chart.yaml is valid YAML else echo ⚠️ yq not available, skipping YAML validation fi echo ✅ Configuration files validation completed - name: Set up Helm uses: azure/setup-helmv3 with: version: v3.12.0 - name: Validate Helm chart run: | helm lint helm/camp - name: Test chart rendering run: | helm template camp-release helm/camp --dry-run - name: Validate Dockerfiles run: | echo Checking Dockerfile existence... test -f camp-backend/Dockerfile || { echo Backend Dockerfile not found; exit 1; } test -f camp-web-frontend/Dockerfile || { echo Web frontend Dockerfile not found; exit 1; } test -f camp-auth-frontend/Dockerfile || { echo Auth frontend Dockerfile not found; exit 1; } echo ✅ All Dockerfiles found # Job 2 — build-and-push (only runs on manual workflow_dispatch when build is enabled) build-and-push: name: Build and Push runs-on: ubuntu-latest needs: build-and-lint if: github.event_name workflow_dispatch github.event.inputs.build true secrets.GHCR_TOKEN ! permissions: contents: read packages: write outputs: image-tag: ${{ steps.meta.outputs.tags }} image-digest: ${{ steps.build.outputs.digest }} steps: - name: Checkout code uses: actions/checkoutv4 - name: Set up Docker Buildx uses: docker/setup-buildx-actionv3 - name: Log in to Container Registry uses: docker/login-actionv3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GHCR_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-actionv5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | typeref,eventbranch typeref,eventpr typesemver,pattern{{version}} typesemver,pattern{{major}}.{{minor}} typesemver,pattern{{major}} typesha,prefix{{branch}}- typeraw,valuelatest,enable{{is_default_branch}} - name: Build and push backend image id: build-backend uses: docker/build-push-actionv6 with: context: ./camp-backend push: true tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/camp-backend:${{ steps.meta.outputs.version }} labels: ${{ steps.meta.outputs.labels }} cache-from: typegha cache-to: typegha,modemax platforms: linux/amd64,linux/arm64 - name: Build and push web frontend image id: build-web uses: docker/build-push-actionv6 with: context: ./camp-web-frontend push: true tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/camp-web:${{ steps.meta.outputs.version }} labels: ${{ steps.meta.outputs.labels }} cache-from: typegha cache-to: typegha,modemax platforms: linux/amd64,linux/arm64 - name: Build and push auth frontend image id: build-auth uses: docker/build-push-actionv6 with: context: ./camp-auth-frontend push: true tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/camp-auth:${{ steps.meta.outputs.version }} labels: ${{ steps.meta.outputs.labels }} cache-from: typegha cache-to: typegha,modemax platforms: linux/amd64,linux/arm64 - name: Run security scan on images run: | echo Scanning backend image... docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy:latest image --severity HIGH,CRITICAL \ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/camp-backend:${{ steps.meta.outputs.version }} echo Scanning web frontend image... docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy:latest image --severity HIGH,CRITICAL \ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/camp-web:${{ steps.meta.outputs.version }} echo Scanning auth frontend image... docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy:latest image --severity HIGH,CRITICAL \ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/camp-auth:${{ steps.meta.outputs.version }} # Job 3 — deploy (only runs on workflow_dispatch) deploy: name: Deploy to Cluster runs-on: ubuntu-latest needs: build-and-lint if: github.event_name workflow_dispatch github.event.inputs.deploy true steps: - name: Checkout code uses: actions/checkoutv4 - name: Set up tools run: | # Install Helm curl https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz | tar xz sudo mv linux-amd64/helm /usr/local/bin/ # Install kubectl curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # Install yq sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 sudo chmod x /usr/local/bin/yq - name: Configure Azure CLI (for AKS) if: startsWith(github.event.inputs.cluster, aks) uses: azure/loginv1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Get AKS credentials if: startsWith(github.event.inputs.cluster, aks) run: | # Extract cluster info from config CLUSTER_INFO$(yq eval .clusters.${{ github.event.inputs.cluster }} clusters/cluster-config.yaml) RESOURCE_GROUP$(echo $CLUSTER_INFO | yq eval .resourceGroup -) CLUSTER_NAME$(echo $CLUSTER_INFO | yq eval .clusterName -) az aks get-credentials \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --overwrite-existing - name: Configure kubectl context run: | # Extract context from config CLUSTER_CONTEXT$(yq eval .clusters.${{ github.event.inputs.cluster }}.context clusters/cluster-config.yaml) kubectl config use-context $CLUSTER_CONTEXT - name: Verify cluster connectivity run: | kubectl cluster-info kubectl get nodes - name: Deploy with Helm run: | # Set deployment parameters CLUSTER${{ github.event.inputs.cluster }} ENVIRONMENT${{ github.event.inputs.environment }} IMAGE_TAG${{ github.event.inputs.image_tag }} NAMESPACEcamp-${ENVIRONMENT} # Use image tag from build if not specified and build was run if [[ $IMAGE_TAG latest ]]; then # Check if build-and-push job ran and has outputs if [[ ${{ needs.build-and-push.outputs.image-tag }} ! ]]; then IMAGE_TAG${{ needs.build-and-push.outputs.image-tag }} else IMAGE_TAGlatest fi fi # Create namespace kubectl create namespace $NAMESPACE --dry-runclient -o yaml | kubectl apply -f - # Deploy with Helm helm upgrade --install camp-${ENVIRONMENT} helm/camp \ --namespace $NAMESPACE \ --values helm/camp/values.yaml \ --values environments/values-${ENVIRONMENT}.yaml \ --set image.tag$IMAGE_TAG \ --wait \ --timeout 10m \ ${{ github.event.inputs.dry_run true --dry-run --debug || }} - name: Verify deployment if: github.event.inputs.dry_run ! true run: | NAMESPACEcamp-${{ github.event.inputs.environment }} # Wait for pods to be ready kubectl wait --forconditionavailable --timeout300s deployment/camp-${{ github.event.inputs.environment }}-backend -n $NAMESPACE kubectl wait --forconditionavailable --timeout300s deployment/camp-${{ github.event.inputs.environment }}-web -n $NAMESPACE kubectl wait --forconditionavailable --timeout300s deployment/camp-${{ github.event.inputs.environment }}-auth -n $NAMESPACE # Show deployment status kubectl get pods -n $NAMESPACE kubectl get services -n $NAMESPACE kubectl get ingress -n $NAMESPACE - name: Run smoke tests if: github.event.inputs.dry_run ! true run: | NAMESPACEcamp-${{ github.event.inputs.environment }} # Get ingress URL INGRESS_URL$(kubectl get ingress -n $NAMESPACE -o jsonpath{.items[0].status.loadBalancer.ingress[0].ip} 2/dev/null || echo ) if [[ -n $INGRESS_URL ]]; then echo Testing application at http://$INGRESS_URL # Test health endpoints curl -f http://$INGRESS_URL/api/test || exit 1 curl -f http://$INGRESS_URL/api/health || exit 1 curl -f http://$INGRESS_URL/ || exit 1 curl -f http://$INGRESS_URL/auth || exit 1 echo ✅ Smoke tests passed else echo ⚠️ No ingress URL found, skipping smoke tests fi触发器onpush推送到main或develop分支时触发。pull_request针对main分支的 PR 事件触发。tags推送v*格式的标签时触发通常用于版本发布。workflow_dispatch手动触发支持以下输入参数build布尔是否构建并推送镜像默认 false。cluster必选目标集群local-dev / aks-dev / aks-staging / aks-prod。environment必选目标环境dev / staging / prod。image_tag字符串自定义镜像标签默认 latest。deploy布尔构建完成后是否执行部署默认 false。dry_run布尔是否仅模拟部署默认 false。环境变量envFORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true强制使用 Node.js 24 运行 JavaScript Actions。REGISTRY: ghcr.io容器镜像仓库GitHub Container Registry。IMAGE_NAME: kubernetes-microservices镜像基础名称。作业Jobs1.build-and-lint代码检查与验证触发条件始终运行无额外条件。权限仅contents: read。步骤检出代码。验证项目结构检查requirements.txt、run.py、Helm Chart 文件等。使用helm lint验证 Chart 语法。测试 Chart 渲染helm template --dry-run。检查各 Dockerfile 是否存在。目的快速反馈基础代码结构是否正确不依赖任何密钥适合所有 PR 和 push 事件。2.build-and-push构建并推送镜像触发条件仅当workflow_dispatch且build true并且secrets.GHCR_TOKEN不为空。依赖needs: build-and-lint。权限contents: readpackages: write允许推送镜像到 GHCR。输出image-tag生成的镜像标签。image-digest构建后的镜像摘要。步骤检出代码设置 Docker Buildx登录 GHCR。使用docker/metadata-action生成多种镜像标签分支、PR、语义化版本、SHA、latest 等。分别构建并推送三个服务的镜像camp-backend、camp-web、camp-auth支持多平台linux/amd64, linux/arm64并使用 GitHub Actions 缓存加速。使用 Trivy 对每个镜像进行高危/严重漏洞扫描仅扫描不阻断流程。目的在手动触发时构建生产级镜像并推送到仓库同时进行安全扫描。3.deploy部署到 Kubernetes触发条件仅workflow_dispatch且deploy true。依赖needs: build-and-lint注意它不依赖build-and-push意味着即使不构建也能部署但实际逻辑中若image_tag为 latest 且build-and-push运行过则会使用其输出的标签。步骤检出代码安装 Helm、kubectl、yq 工具。如果目标集群是 AKS则使用 Azure Login 并获取 AKS 凭据依赖secrets.AZURE_CREDENTIALS。从clusters/cluster-config.yaml读取集群上下文并切换 kubectl。验证集群连通性。使用 Helm 升级/安装应用根据environment创建命名空间如camp-dev。合并基础values.yaml和环境特定values-${ENVIRONMENT}.yaml。动态设置image.tag优先使用build-and-push输出的标签否则使用输入值或 latest。支持--dry-run模式仅模拟。验证部署等待所有 Deployment 可用展示 Pod/Service/Ingress 状态。运行冒烟测试若 Ingress 存在则测试/api/test、/api/health等端点。目的将应用部署到指定 Kubernetes 集群和环境并执行基本功能验证。关键设计特点灵活触发自动推送只做 lint手动触发可精细化控制构建和部署。条件执行构建和部署任务都有明确的if条件避免不必要的资源消耗。安全集成使用 GitHub 的 OIDC 或密钥进行 AKS 认证镜像推送到 GHCR。多环境支持通过cluster-config.yaml和environments/下的 values 文件区分不同集群和环境。可观测性部署后展示资源和执行冒烟测试。

相关新闻

保护数字健康:curbox-android如何帮助你减少屏幕时间的完整攻略

保护数字健康:curbox-android如何帮助你减少屏幕时间的完整攻略

保护数字健康:curbox-android如何帮助你减少屏幕时间的完整攻略 【免费下载链接】curbox-android Free Open Source App & Website Blocker 项目地址: https://gitcode.com/gh_mirrors/di/curbox-android 在当今数字时代,屏幕时间的过度使用…

2026/7/27 19:49:18 阅读更多 →
数学计算库版本升级:兼容性挑战与平滑迁移实践指南

数学计算库版本升级:兼容性挑战与平滑迁移实践指南

在日常开发中,我们经常遇到需要处理数学计算和算法优化的场景。最近在技术社区中,不少开发者讨论数学工具和算法库的快速迭代带来的挑战——新版本的发布往往伴随着语法变更、性能优化或API调整,这要求开发团队必须快速适应。本文将围绕这一现…

2026/7/27 19:49:18 阅读更多 →
如何使用Phoenix Swagger生成专业API文档:从配置到部署的终极指南

如何使用Phoenix Swagger生成专业API文档:从配置到部署的终极指南

如何使用Phoenix Swagger生成专业API文档:从配置到部署的终极指南 【免费下载链接】phoenix_swagger Swagger integration to Phoenix framework 项目地址: https://gitcode.com/gh_mirrors/ph/phoenix_swagger Phoenix Swagger是为Phoenix框架提供Swagger集…

2026/7/27 19:48:18 阅读更多 →

最新新闻

HuggingFace预训练语言模型实战:从入门到工业部署

HuggingFace预训练语言模型实战:从入门到工业部署

1. 预训练语言模型实战:从HuggingFace生态入门到工业级应用在自然语言处理领域,预训练语言模型已经成为现代NLP系统的核心组件。作为一名长期从事NLP落地的工程师,我见证了从Word2Vec到BERT再到GPT的技术演进历程。HuggingFace作为当前最活跃…

2026/7/27 19:59:23 阅读更多 →
Gorpc批处理功能详解:如何用Batch API将请求吞吐量提升300%

Gorpc批处理功能详解:如何用Batch API将请求吞吐量提升300%

Gorpc批处理功能详解:如何用Batch API将请求吞吐量提升300% 【免费下载链接】gorpc Simple, fast and scalable golang rpc library for high load 项目地址: https://gitcode.com/gh_mirrors/go/gorpc Gorpc是一个简单、快速且可扩展的Golang RPC库&#xf…

2026/7/27 19:59:23 阅读更多 →
FastEmbed-rs重排序功能详解:提升检索结果相关性的实用方法

FastEmbed-rs重排序功能详解:提升检索结果相关性的实用方法

FastEmbed-rs重排序功能详解:提升检索结果相关性的实用方法 【免费下载链接】fastembed-rs Rust library for generating vector embeddings, reranking locally! 项目地址: https://gitcode.com/gh_mirrors/fa/fastembed-rs FastEmbed-rs是一款强大的Rust库…

2026/7/27 19:59:23 阅读更多 →
NATS Streaming源码解析:核心组件与实现原理

NATS Streaming源码解析:核心组件与实现原理

NATS Streaming源码解析:核心组件与实现原理 【免费下载链接】stan.go NATS Streaming System 项目地址: https://gitcode.com/gh_mirrors/st/stan.go NATS Streaming是一个高性能、轻量级的消息流系统,基于NATS消息系统构建,提供持久…

2026/7/27 19:59:23 阅读更多 →
hlink高级技巧:如何利用glob表达式实现复杂文件过滤规则

hlink高级技巧:如何利用glob表达式实现复杂文件过滤规则

hlink高级技巧:如何利用glob表达式实现复杂文件过滤规则 【免费下载链接】hlink 批量、快速硬链工具(The batch, fast hard link toolkit) 项目地址: https://gitcode.com/gh_mirrors/hl/hlink hlink作为一款批量、快速硬链工具,能够帮助用户高效…

2026/7/27 19:59:23 阅读更多 →
医院最美护士/优秀医生评选投票制作教程,免费投票小程序解决方案送上

医院最美护士/优秀医生评选投票制作教程,免费投票小程序解决方案送上

每逢512护士节、819中国医师节,各大医院都会通过评选“最美护士”“优秀医生”等活动来表彰先进、弘扬医者精神。然而,很多医院宣传科、工会、团委在筹备这类活动时常常面临一个实际问题:如何快速、免费地制作一场专业、公平且体验良好的线上…

2026/7/27 19:58:23 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻