为 Spring Boot 应用程序构建 CI/CD 流水线
为 Spring Boot 应用程序创建构建/部署流水线涉及多个步骤,而 Jenkins 可以作为强大的工具来自动化这些流程。在本教程中,我们将指导您为托管在 GitHub 上的 Spring Boot 应用程序设置流水线,使用 Jenkins 构建该应用程序,并将其部署到 Amazon Elastic Kubernetes Service (EKS)。
先决条件:
- 托管在 GitHub 上的 Spring Boot 应用程序。
- 已安装并配置 Jenkins。
- 已设置包含 Amazon ECR 和 EKS 服务的 AWS 账户。
- 已在您的 Jenkins 服务器上安装 Docker。
安装 Jenkins 插件
在您的 Jenkins 实例中,安装以下插件:
- GitHub 插件
- 流水线插件
- Docker 插件
- Kubernetes 持续部署插件
创建 Jenkins 流水线作业
- 创建一个新的 Jenkins 作业并选择“流水线”作为作业类型。
- 在流水线配置中,在“定义”部分下选择“来自 SCM 的流水线脚本”。
- SCM:Git
- 存储库 URL:提供您的 GitHub 存储库的 URL。
- 凭证:添加您的 GitHub 凭证。
3. 保存流水线作业。
配置 Jenkins 凭证
- 添加 GitHub 凭证:前往“Jenkins”>“凭证”>“系统”>“全局凭证(不受限制)”>“添加凭证”。
- 添加 AWS 凭证:前往“Jenkins”>“凭证”>“系统”>“全局凭证(不受限制)”>“添加凭证”。
- 添加 Kubernetes 配置:前往“Jenkins”>“凭证”>“系统”>“全局凭证(不受限制)”>“添加凭证”。
配置 AWS ECR 存储库
Amazon Elastic Container Registry (ECR) 是由 Amazon Web Services (AWS) 提供的完全托管的 Docker 容器注册表服务。ECR 允许开发人员存储、管理和部署 Docker 容器镜像,为 AWS 生态系统中的容器化应用程序提供安全且可扩展的解决方案。
按照以下步骤设置 ECR 存储库:
- 登录 AWS 管理控制台:打开 AWS 管理控制台并使用您的 AWS 账户凭证登录。
- 导航至 Amazon ECR:从“查找服务”搜索栏中选择 Amazon ECR 服务,或导航至“容器”,然后选择“Amazon ECR”。
- 创建存储库:在 Amazon ECR 控制面板中,点击“创建存储库”按钮。
- 提供存储库详细信息:
- 存储库名称:为您的存储库输入一个唯一的名称(例如,your-app)。
- 标签不变性:根据您的需求选择是否允许或禁止镜像标签可变性。
5. 配置权限(可选):
- 您可以设置存储库权限来控制哪些用户有权访问推送/拉取镜像。您可以根据 AWS Identity and Access Management (IAM) 角色和策略进行配置。
6. 加密设置(可选):
- 为您的存储库配置加密设置。ECR 支持使用 AWS Key Management Service (KMS) 进行静态加密。
7. 生命周期策略(可选):
- 您可以设置生命周期策略,根据特定条件自动使镜像过期或删除镜像。
8. 创建存储库:点击“创建存储库”按钮完成存储库创建。
现在,您已成功创建 ECR 存储库。您将在 Jenkins 管道脚本中使用存储库 URI(例如 <account-id>.dkr.ecr.<region>.amazonaws.com/your-app)将 Docker 镜像推送到此存储库。请确保将 <account-id>、<region> 和 your-app 分别替换为您的 AWS 账户 ID、ECR 存储库所在的 AWS 区域以及您选择的存储库名称。
配置 Amazon EKS 集群
Amazon Elastic Kubernetes Service (EKS) 是由 Amazon Web Services (AWS) 提供的完全托管的 Kubernetes 服务。EKS 简化了使用 Kubernetes 的容器化应用程序的部署、管理和扩展,使开发人员能够专注于构建和运行应用程序,而无需维护底层 Kubernetes 基础设施的复杂性。
配置 Amazon EKS 集群的步骤如下:
- 使用 AWS CLI 或 AWS 管理控制台创建 EKS 集群。请确保已安装并配置 AWS CLI。
aws eks create-cluster --name your-eks-cluster --role-arn arn:aws:iam::123456789012:role/eks-cluster-role --resources-vpc-config subnetIds=subnet-xxxxxxxxxxxxxxxxx,securityGroupIds=sg-xxxxxxxxxxxxxxxxx
2. 将 your-eks-cluster、arn:aws:iam::123456789012:role/eks-cluster-role、subnet-xxxxxxxxxxxxxxxxx 和 sg-xxxxxxxxxxxxxxxxx 替换为您的首选集群名称、IAM 角色、子网 ID 和安全组 ID。
3. 更新您的 kubectl 配置以连接到 EKS 集群。这需要 AWS CLI 和 aws eks update-kubeconfig 命令。
aws eks update-kubeconfig --name your-eks-cluster
将 your-eks-cluster 替换为您的集群名称。
3. 验证 kubectl 是否已正确配置并可以连接到 EKS 集群。
kubectl get nodes
您应该会看到 EKS 集群的节点。
4. 为您的应用程序创建 Kubernetes 部署和服务 YAML 文件(例如,kubernetes/deployment.yaml)。
apiVersion: apps/v1
kind: Deployment
metadata:name: your-app
spec:replicas: 3selector:matchLabels:app: your-apptemplate:metadata:labels:app: your-appspec:containers:- name: your-appimage: <account-id>.dkr.ecr.<region>.amazonaws.com/your-app:latest
将 <account-id>、<region> 和 your-app 分别替换为您的 AWS 账户 ID、ECR 区域和 Docker 镜像仓库名称。应用部署 YAML:
kubectl apply -f kubernetes/deployment.yaml
此配置假设您已创建 VPC 和必要的 IAM 角色。请根据您的 AWS 环境调整设置。更新 Jenkins 流水线脚本(本教程的第 4 步),使其包含正确的集群信息,例如集群 URL、IAM 角色以及其他相关详细信息。
创建流水线脚本
在 GitHub 仓库根目录创建一个 Jenkinsfile 文件。该文件将定义整个流水线。以下是一个基本示例:
pipeline {agent anystages {stage('Checkout') {steps {script {checkout scm}}}stage('Build and Test') {steps {script {sh 'mvn clean package'}}}stage('Build Docker Image') {steps {script {sh 'docker build -t your-docker-repo/your-app:latest .'}}}stage('Push to ECR') {steps {script {withAWS(credentials: 'aws-credentials', region: 'your-aws-region') {sh 'aws ecr get-login-password --region your-aws-region | docker login --username AWS --password-stdin your-aws-account-id.dkr.ecr.your-aws-region.amazonaws.com'sh 'docker push your-aws-account-id.dkr.ecr.your-aws-region.amazonaws.com/your-app:latest'}}}}stage('Deploy to EKS') {steps {script {withKubeConfig([credentialsId: 'kubeconfig-credentials', serverUrl: 'https://your-eks-cluster-url']) {sh 'kubectl apply -f kubernetes/deployment.yaml'}}}}}
}
该流水线包含多个阶段。
- “检出”阶段从 GitHub 存储库检索源代码。
- “构建和测试”阶段使用 Maven 编译代码并运行测试。
- “构建 Docker 镜像”阶段根据应用程序代码创建 Docker 镜像。
- 在“推送到 ECR”阶段,Docker 镜像被推送到 Amazon Elastic Container Registry (ECR) 存储库。
- 在“部署到 EKS”阶段,应用 Kubernetes 部署配置将应用程序部署到 Amazon Elastic Kubernetes Service (EKS) 集群。
该脚本利用 Jenkins 插件进行 GitHub 集成、Docker、AWS 和 Kubernetes,以及用于安全访问外部服务的相关凭证。此 Jenkinsfile 提供了一个全面的流水线,可在 AWS 上的容器化环境中自动执行 Spring Boot 应用程序的构建、测试和部署流程。
运行流水线
手动触发 Jenkins 作业,或在 GitHub 中设置 Webhook,以便在每次推送时触发流水线。
1. 手动触发:
- 打开 Jenkins 仪表板并导航到您创建的 Jenkins 作业。
- 点击“立即构建”即可手动触发流水线。
2. 使用 GitHub Webhook 自动触发(可选):
- 要在代码更改时自动执行流水线,请在您的 GitHub 代码库中配置 Webhook。
- 在您的 GitHub 代码库中,前往“设置”>“Webhook”>“添加 Webhook”。
- 将 Payload URL 设置为您的 Jenkins 服务器的 Webhook URL(例如,http://your-jenkins-server/github-webhook/)。
- 选择触发 Webhook 的事件,例如,每次代码推送时都选择“仅推送事件”。
- 保存 Webhook。
3. 监控流水线执行:
- 在 Jenkins 仪表板上,点击您的流水线作业以查看进度。
- 在流水线可视化视图中,您可以看到各个阶段的进度以及每个阶段的日志。
4. 调查故障:
- 如果任何阶段失败,请检查控制台输出和日志中是否存在错误消息。根据需要调整管道脚本或配置。
5. 访问构件和部署:
- 成功完成后,访问构建和部署过程中生成的构件。
- 验证您的应用程序是否已部署到 Amazon EKS 集群,并使用 kubectl 命令监控其状态。
通过运行管道,您可以确保整个 CI/CD 流程(从源代码集成到在 Amazon EKS 上部署)自动化且可重现。定期监控管道执行情况,以便及早发现问题,并维护可靠高效的软件交付工作流程。