🚀 实战复盘:如何用 Jenkins 构建一个完整的 CI/CD 流水线,将 NodeJS 项目部署到 AWS ECR

264 阅读1分钟

项目背景

在构建 Amazon Prime 项目的过程中,我实现了一个从源码管理到容器镜像推送的全自动化 CI/CD 流程,目标是:

  • 实现每次提交后自动测试、构建、扫描、推送镜像
  • 将 Node.js 应用持续集成并部署到 AWS ECR
  • 集成安全扫描(Trivy)与代码质量分析(SonarQube)
  • 支持 DevSecOps 思维:交付可观测、可追溯、安全的部署流程

📦 技术栈

  • CI/CD 平台:Jenkins
  • 容器化:Docker
  • 云部署平台:AWS ECR + CLI
  • 质量分析:SonarQube
  • 安全扫描:Trivy
  • 语言:Node.js (npm)

🧱 核心架构图(简化版)

nginx

GitHub → Jenkins CI/CD → SonarQube & Trivy → Docker Build → AWS ECR → EKS(可扩展)

🧩 关键步骤拆解

✅ 1. GitHub Checkout

groovy

stage('1. Git Checkout') {
    steps {
        git branch: 'main', url: 'https://github.com/babylink1/DevopsProject2.git'
    }
}
  • 每次 Pipeline 运行,自动拉取主分支最新代码。

✅ 2. SonarQube 静态分析

groovy

stage('2. SonarQube Analysis') {
    steps {
        withSonarQubeEnv('sonar-server') {
            sh "${SCANNER_HOME}/bin/sonar-scanner -Dsonar.projectKey=amazon-prime -Dsonar.projectName=amazon-prime"
        }
    }
}
  • 早期发现代码结构、可维护性和漏洞风险。
  • 使用 withSonarQubeEnv 与服务器绑定环境变量。

✅ 3. 安全扫描(Trivy)

groovy

stage('Trivy Scan') {
    steps {
        sh 'trivy fs . > trivy-scan-results.txt'
    }
}
  • 检查依赖和镜像中的潜在漏洞。
  • 可集成为 fail-fast 阶段。

✅ 4. 构建 Docker 镜像

groovy

stage('Docker Image Build') {
    steps {
        sh "docker build -t ${params.ECR_REPO_NAME} ."
    }
}
  • 使用参数化构建,灵活控制镜像名称。

✅ 5. 登录 & 创建 ECR 仓库(自动判断)

groovy

stage('Create ECR Repo & Login') {
    steps {
        withCredentials([...]) {
            sh '''
            aws ecr describe-repositories --repository-names ${params.ECR_REPO_NAME} || \
            aws ecr create-repository --repository-name ${params.ECR_REPO_NAME}
            aws ecr get-login-password | docker login --username AWS --password-stdin ${params.AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com
            '''
        }
    }
}
  • 智能判断是否需要创建仓库,避免重复操作。

✅ 6. 镜像 Tag & Push

groovy

stage('Push to ECR') {
    steps {
        sh '''
        docker tag ${params.ECR_REPO_NAME} ${params.AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/${params.ECR_REPO_NAME}:$BUILD_NUMBER
        docker push ${params.AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/${params.ECR_REPO_NAME}:$BUILD_NUMBER
        '''
    }
}
  • 使用 $BUILD_NUMBER 作为版本号,支持版本管理。

✅ 7. 清理 Jenkins 环境

groovy
stage('Cleanup') {
    steps {
        sh '''
        docker rmi ${params.AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/${params.ECR_REPO_NAME}:$BUILD_NUMBER
        '''
    }
}
  • 保持 Jenkins 节点干净,减少磁盘压力。

🎯 实战价值

这个 Pipeline 并不只是“能跑通”,它体现了一个完整 DevOps 系统的能力:

  • 自动化部署 + 可追踪版本控制
  • 集成代码质量、安全、合规流程
  • 云服务接入 + 多环境扩展能力(未来可扩展到 EKS、Helm)
  • 使用参数化与 IAM 权限隔离,安全性更强

💡 小贴士(你可以借鉴的经验)

  • params 参数定义灵活性,可支持多环境部署(dev/test/prod)
  • 所有 AWS CLI 操作都需绑定 IAM 最小权限
  • 推荐将 Trivy 报告集成入 HTML 报告,可用插件渲染