在現代軟體開發環境中,持續整合和持續部署 (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 管道,該管道支援持續交付並有助於保持程式碼品質和應用程式效能的高標準。
導航到 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
導航至 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
在 Web 瀏覽器中導覽至http://<your-server-ip>:8080
。
使用儲存在/var/lib/jenkins/secrets/initialAdminPassword
的密碼解鎖 Jenkins。
docker run -d -p 8081:8081 --name nexus sonatype/nexus3
導覽至http://<your-server-ip>:8081
。
使用預設憑證:
- **Username**: `admin`
- **Password**: Located in the `admin.password` file inside the container.
#!/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
docker run -d -p 9000:9000 --name sonarqube sonarqube
使用者名稱: admin
密碼: admin
#!/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
在您的儲存庫中建立一個terraform
目錄。
包括以下文件:
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
}
}
}
#!/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
登入 AWS 管理控制台。
導航至 IAM 服務。
建立一個新角色:
選擇EC2
作為可信任實體。
附加AmazonEKSClusterPolicy
和AmazonEC2ContainerRegistryFullAccess
策略。
命名您的角色(例如Jenkins_EKS_Role
)。
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
'''
}
}
}
}
}
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
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
️⃣:使用 Prometheus 和 Grafana 監控應用程式
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml
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
原文出處:https://dev.to/prodevopsguytech/devops-project-production-level-cicd-pipeline-project-1iek