📝簡介

在現代軟體開發環境中,持續整合和持續部署 (CI/CD)管道對於確保程式碼變更以一致且可靠的方式自動建置、測試並部署到生產環境至關重要。本文件提供了使用 AWS EC2 執行個體上託管的各種工具設定強大的 CI/CD 管道的綜合指南。

該流程將涵蓋從設定必要的基礎設施到在 Amazon EKS(彈性 Kubernetes 服務)叢集上部署應用程式、分配自訂網域以及監控應用程式以確保其穩定性和效能的所有內容。

該管道將包含多種行業標準工具:

  • AWS EC2 :建立虛擬機器。

  • Jenkins :自動化建置、測試和部署流程。

  • SonarQube :靜態程式碼分析,確保程式碼品質。

  • Trivy :Docker 映像的檔案掃描和漏洞掃描。

  • Nexus Repository Manager :管理工件。

  • Terraform :基礎架構即程式碼,用於建立 EKS 叢集。

  • Docker :容器化以實現一致性和可移植性。

  • Kubernetes :用於部署的容器編排。

  • Prometheus 和 Grafana :監控管道和應用程式效能。

透過遵循本指南,您將能夠設定功能齊全的 CI/CD 管道,該管道支援持續交付並有助於保持程式碼品質和應用程式效能的高標準。

🖼️ 圖片概述:

圖片說明


步驟 1️⃣ 步:設定 GitHub 儲存庫

儲存庫連結

初始化您的儲存庫

  1. 建立一個新儲存庫
  • 導航到 GitHub。

  • 建立一個新的儲存庫。

  • 將儲存庫克隆到本機。

  • 新增您的專案文件。

將本地程式碼推送到 GitHub

git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/your-username/your-repo.git
git push -u origin main

步驟 2️⃣:在 AWS EC2 上設定 Jenkins

啟動 EC2 執行個體

  1. 登入AWS管理控制台
  • 導航至 EC2 儀表板。

  • 啟動一個新實例。

  • 選擇 Ubuntu 作為 AMI。

  • 選擇實例類型(例如,t2.micro)。

  • 設定安全群組以允許 SSH、HTTP 和連接埠 8080。

安裝詹金斯

#!/bin/bash
# Update packages
sudo apt-get update
# Install Java
sudo apt-get install -y openjdk-11-jdk
# Add Jenkins repo key to your system
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
# Add Jenkins to your system's sources
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
# Update package list
sudo apt-get update
# Install Jenkins
sudo apt-get install -y jenkins
# Start Jenkins service
sudo systemctl start jenkins

存取詹金斯

  1. 打開詹金斯
  • 在 Web 瀏覽器中導覽至http://<your-server-ip>:8080

  • 使用儲存在/var/lib/jenkins/secrets/initialAdminPassword的密碼解鎖 Jenkins。


步驟 3️⃣ 步:安裝 Nexus

在 Docker 上啟動 Nexus

docker run -d -p 8081:8081 --name nexus sonatype/nexus3

存取聯繫

  1. 打開聯繫
  • 導覽至http://<your-server-ip>:8081

  • 使用預設憑證:

 - **Username**: `admin`
 - **Password**: Located in the `admin.password` file inside the container.

步驟 4️⃣:在 Jenkins EC2 執行個體上設定 Docker

安裝 Docker

#!/bin/bash
# Update package list
sudo apt-get update
# Install Docker
sudo apt-get install -y docker.io
# Add Jenkins user to Docker group
sudo usermod -aG docker jenkins
# Restart Jenkins to apply group changes
sudo systemctl restart jenkins

第 5️⃣ 步:設定 SonarQube

在 Docker 上啟動 SonarQube

docker run -d -p 9000:9000 --name sonarqube sonarqube

取得 SonarQube 初始密碼

  1. 登入憑證
  • 使用者名稱admin

  • 密碼admin


第6️⃣步:安裝Trivy

#!/bin/bash
# Download and install Trivy
sudo apt-get install wget apt-transport-https gnupg lsb-release -y
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

第 7️⃣ 步:設定 Terraform EKS

EKS 要求

  1. 在您的儲存庫中建立一個terraform目錄。

  2. 包括以下文件

  • main.tf

  • variables.tf

  • outputs.tf

  • provider.tf

  • eks-cluster.tf

  • vpc.tf

範例main.tf文件

provider "aws" {
  region = var.region
}

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"
  version = "3.5.0"

  name = var.vpc_name
  cidr = var.vpc_cidr
  azs = var.availability_zones
  public_subnets = var.public_subnets
  private_subnets = var.private_subnets

  enable_nat_gateway = true
  single_nat_gateway = true
  public_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/elb" = "1"
  }
  private_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/internal-elb" = "1"
  }
}

module "eks" {
  source = "terraform-aws-modules/eks/aws"
  version = "17.1.0"

  cluster_name = var.cluster_name
  cluster_version = var.kubernetes_version
  subnets = module.vpc.private_subnets
  vpc_id = module.vpc.vpc_id

  node_groups = {
    eks_nodes = {
      desired_capacity = var.desired_capacity
      max_capacity = var.max_capacity
      min_capacity = var.min_capacity

      instance_type = var.instance_type
      key_name = var.key_name
    }
  }
}

為 Terraform 設定 AWS CLI

#!/bin/bash
# Install AWS CLI v2
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# Verify installation
aws --version

步驟 8️⃣:為 Jenkins 建立 IAM 角色

  1. 登入 AWS 管理控制台。

  2. 導航至 IAM 服務。

  3. 建立一個新角色

  • 選擇EC2作為可信任實體。

  • 附加AmazonEKSClusterPolicyAmazonEC2ContainerRegistryFullAccess策略。

  • 命名您的角色(例如Jenkins_EKS_Role )。

  1. 將角色附加到 Jenkins EC2 執行個體。

步驟 9️⃣ 步:設定 Jenkins 管道

管道腳本

pipeline {
  agent any
  environment {
    AWS_DEFAULT_REGION = 'us-west-2'
    ECR_REPO_NAME = 'my-ecr-repo'
    IMAGE_TAG = "my-ecr-repo:${env.BUILD_ID}"
  }
  stages {
    stage('Checkout') {
      steps {
        git branch: 'main', url: 'https://github.com/your-repo.git'
      }
    }
    stage('Build Docker Image') {
      steps {
        script {
          dockerImage = docker.build("${env.ECR_REPO_NAME}:${env.BUILD_ID}")
        }
      }
    }
    stage('Scan with Trivy') {
      steps {
        script {
          sh 'trivy image --exit-code 1 --severity HIGH,CRITICAL ${dockerImage.id}'
        }
      }
    }
    stage('Push Docker Image') {
      steps {
        script {
          docker.withRegistry("https://${env.AWS_ACCOUNT_ID}.dkr.ecr.${env.AWS_DEFAULT_REGION}.amazonaws.com", 'ecr:aws-credentials') {
            dockerImage.push()
          }
        }
      }
    }
    stage('Deploy to EKS') {
      steps {
        script {
          sh '''
          aws eks --region $AWS_DEFAULT_REGION update-kubeconfig --name $CLUSTER_NAME
          kubectl apply -f k8s/deployment.yaml
          '''
        }
      }
    }
  }
}

步驟 🔟:將應用程式部署到 EKS

更新k8s/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-ecr-repo:latest
        ports:
        - containerPort: 80

應用程式部署

kubectl apply -f k8s/deployment.yaml

步驟 1️⃣1️⃣:將自訂網域指派給 EKS

更新k8s/ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: my-custom-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

應用入口

kubectl apply -f k8s/ingress.yaml

步驟1️⃣2

️⃣:使用 Prometheus 和 Grafana 監控應用程式

安裝普羅米修斯

kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml

安裝Grafana

kubectl apply -f https://raw.githubusercontent.com/grafana-operator/grafana-operator/main/bundle.yaml

結論

此 CI/CD 管道專案示範了從程式碼整合到部署和監控的軟體開發生命週期自動化的端到端流程。透過遵循本指南中概述的步驟,您已成功:

  • 設定儲存庫:建立一個版本控制的環境,可以在其中協作管理和追蹤程式碼。

  • 配置必要的基礎設施:配置 AWS EC2 執行個體並設定 Jenkins、SonarQube、Nexus、Prometheus 和 Grafana 等基本工具,以促進持續整合、部署和監控。

  • 將本機程式碼推送到 GitHub :將您的程式碼庫集中在 GitHub 儲存庫中,從而實現與管道中其他工具的無縫協作和整合。

  • 建置和部署應用程式:利用 Jenkins 自動化建置、測試和部署流程,確保您的應用程式一致地部署到 Amazon EKS 上的 Kubernetes 叢集。

  • 監控應用程式效能:使用 Prometheus 和 Grafana 建立強大的監控系統,即時追蹤應用程式的效能和運作狀況。

  • 指派自訂網域:將您的應用程式對應到自訂網域,使其可供生產就緒環境中的使用者存取。

透過整合這些工具和流程,您建立了一個強大的 CI/CD 管道,可提高程式碼品質、減少部署時間並確保應用程式可靠性。這種設定不僅加快了開發週期,而且還培養了持續改進的文化,其中程式碼定期整合、測試和部署,只需最少的人工幹預。

展望未來,您可以透過加入更多進階功能(例如自動化安全測試、藍綠部署或金絲雀發布)來擴展此管道,以進一步提高 CI/CD 流程的穩健性和可擴展性。


感謝您閱讀我的部落格...:)

©版權所有: ProDevOpsGuy

影像

加入我們的Telegram 社群||關注我了解更多DevOps 內容。


原文出處:https://dev.to/prodevopsguytech/devops-project-production-level-cicd-pipeline-project-1iek


共有 0 則留言