介绍
持续集成和持续交付 (CI/CD) 在现代软件开发中至关重要,有助于实现自动化代码集成和可靠的应用程序交付。 Jenkins 以其灵活性和广泛的插件选项而闻名,是创建 CI/CD 管道的领先工具。
这篇博文将指导您使用 Jenkins 完成 CI/CD 管道的完整设置。我们将介绍从配置 Jenkins 并将其与版本控制系统集成到编排构建、测试和部署的所有内容。我们的目标是增强您的软件交付流程。
使用的工具和技术
我们将在本指南中使用各种技术和工具,包括:
要使用 Java 应用程序为 Jenkins 管道建立基础,首先需要配置 Git:
git clone <URL>
image.png
请注意,此步骤也可以使用Terraform自动执行,但为了简单起见,我们将在此手动执行。
1. 登录 AWS 管理控制台:
2.导航到 EC2 仪表板:
3.启动实例:
4.添加标签:
5.选择 Amazon 系统映像 (AMI):
6.选择实例类型:
7.创建密钥对:
8.配置实例详细信息:
9.配置安全组:
10.添加存储:
11.审核与发布:
实例启动后,将需要几分钟来初始化。 然后,您可以使用下载的文件通过 SSH 连接到您的实例.pem。 我们正在使用 Mobaxterm 通过 SSH 连接到 EC2 实例(对于 Windows 机器)。
设置Jenkins
安装 Java: 在运行 Jenkins 之前,必须在服务器上安装 Java。Jenkins 与 OpenJDK 和 Oracle Java 兼容,但通常与 OpenJDK 配合使用效果最佳。 下面说明了如何在通过 SSH 连接的实例上安装 Java:
sudo apt update
sudo apt install openjdk-11-jdk
java -version
安装 Jenkins: 现在 Java 已在我们的服务器上安装并准备就绪,下一步是安装 Jenkins。您有两种安装方式:使用脚本或手动执行命令。 使用脚本是高效且可重复的,特别是当您计划多次部署 Jenkins 或在不同环境中保持一致的设置时。
vim install_jenkins.sh
#!/bin/bash
# Download Jenkins GPG key
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
# Add Jenkins repository to package manager sources
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
# Update package manager repositories
sudo apt-get update
# Install Jenkins
sudo apt-get install jenkins -y
chmod + x install_jenkins.sh
./install_jenkins.sh
调整防火墙设置: 为了确保您可以通过 Web 浏览器访问 Jenkins,正确配置防火墙设置至关重要。 Jenkins 默认在端口 8080 上运行。因此,请确保您的安全组设置允许此端口上的入站流量。 访问 Jenkins UI: 要访问 Jenkins UI,请打开 Web 浏览器并输入实例的 IP 地址,后跟:8080(例如http://192.168.1.2:8080)。将其替换192.168.1.2为您服务器的实际 IP 地址。 使用在以下位置找到的初始管理员密码解锁 Jenkins:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
安装建议的插件:
创建您的管理员用户:
Jenkins就绪:
安装必要的插件:
配置您的管道:
第一个选项允许您直接在 Jenkins 界面中编写 Groovy 脚本,而第二个选项从 Git 等源代码管理系统中提取脚本。
重启jenkins:
image.png
将 SonarQube 安装为 Docker 容器是一种流行的选项,它简化了设置过程并使其更易于管理和扩展。 先决条件:确保您的服务器上安装了 Docker。如果没有,您可以从 Docker 官方网站下载并安装 Docker。 Docker 安装:
vim install_docker.sh
#!/bin/bash
# Update package manager repositories
sudo apt-get update
# Install necessary dependencies
sudo apt-get install -y ca-certificates curl
# Create directory for Docker GPG key
sudo install -m 0755 -d /etc/apt/keyrings
# Download Docker's GPG key
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# Ensure proper permissions for the key
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add Docker repository to Apt sources
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update package manager repositories
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
chmod +x install_docker.sh
./install_docker.sh
安装Sonarqube:
docker pull sonarqube
docker run -d --name sonarqube -p 9000:9000 sonarqube
SonarQube 默认在端口 9000 上运行。因此,为了确保无缝访问 SonarQube 仪表板,必须配置防火墙以允许此端口上的入站流量。
http://<your_instance_ip>:9000
通过在浏览器中输入并替换<your_instance_ip>
为服务器的 IP 地址来访问 SonarQube 。
SonarQube 的默认登录凭据是:
但是,出于安全原因,建议在初始设置后更改这些默认凭据。
与 Jenkins 集成:
在 Jenkins 中添加 SonarQube 令牌作为凭证:
配置 Jenkins SonarQube 扫描仪:
确保为您的 CI/CD 管道正确配置了所有必需的凭据。 这包括 SonarQube 身份验证、Docker Hub 访问和 Git 存储库身份验证的凭据。
Jenkinsfile 是一个文本文件,用于定义 Jenkins 管道的配置。它使用 Java 平台的脚本语言 Groovy 编写。 Jenkinsfile 指定了 Jenkins 在运行管道作业时应执行的步骤、阶段和操作。
Jenkins 文件的某些部分将需要您用您的凭据和详细信息替换它们,因此请留意这一点。 管道阶段:
pipeline {
agent {
docker {
image 'abhishekf5/maven-abhishek-docker-agent:v1'
args '--user root -v /var/run/docker.sock:/var/run/docker.sock' // mount Docker socket to access the host's Docker daemon
}
}
stages {
stage('Checkout') {
steps {
sh 'echo passed'
//git branch: 'main', url: 'https://github.com/wangoimwangi/jenkins-CICD.git'
}
}
stage('Build and Test') {
steps {
sh 'ls -ltr'
// build the project and create a JAR file
sh 'cd spring-boot-app && mvn clean package'
}
}
stage('Static Code Analysis') {
environment {
SONAR_URL = "http://54.252.140.131:9000"
}
steps {
withCredentials([string(credentialsId: 'sonarqube', variable: 'SONAR_AUTH_TOKEN')]) {
sh 'cd spring-boot-app && mvn sonar:sonar -Dsonar.login=$SONAR_AUTH_TOKEN -Dsonar.host.url=${SONAR_URL}'
}
}
}
stage('Build and Push Docker Image') {
environment {
DOCKER_IMAGE = "ultimate-cicd:${BUILD_NUMBER}"
// DOCKERFILE_LOCATION = "spring-boot-app/Dockerfile"
REGISTRY_CREDENTIALS = credentials('docker-cred')
}
steps {
script {
sh 'cd spring-boot-app && docker build -t ${DOCKER_IMAGE} .'
def dockerImage = docker.image("${DOCKER_IMAGE}")
docker.withRegistry('https://index.docker.io/v1/', "docker-cred") {
dockerImage.push()
}
}
}
}
stage('Update Deployment File') {
environment {
GIT_REPO_NAME = "jenkins-CICD"
GIT_USER_NAME = "wangoimwangi"
}
steps {
withCredentials([string(credentialsId: 'github', variable: 'GITHUB_TOKEN')]) {
sh '''
git config user.email "mariakoi800@gmail.com"
git config user.name "Maria"
BUILD_NUMBER=${BUILD_NUMBER}
sed -i "s/replaceImageTag/${BUILD_NUMBER}/g" spring-boot-app-manifests/deployment.yml
git add spring-boot-app-manifests/deployment.yml
git commit -m "Update deployment image to version ${BUILD_NUMBER}"
git push @github.com/${GIT_USER_NAME}/${GIT_REPO_NAME">https://${GITHUB_TOKEN}@github.com/${GIT_USER_NAME}/${GIT_REPO_NAME} HEAD:main
'''
}
}
}
}
}
SonarQube 将包含管道执行的报告。
ArgoCD 管理 CI/CD 管道的持续部署部分,自动部署到 Kubernetes。您可以使用 Minikube 进行本地部署,也可以使用 Amazon EKS 进行云部署。
安装 Minikube:
minikube start
安装 Kubectl:
您可以使用 Argo CD Operator
在 Kubernetes 上安装 Argo CD,它可以自动部署和管理 Argo CD 实例。
# 安装 Operator Lifecycle Manager (OLM),这是一个帮助管理集群上运行的 Operator 的工具。
$ curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.27.0/install.sh | bash -s v0.27.0
#安装 AgroCD Operator
kubectl create -f https://operatorhub.io/install/argocd-operator.yaml
# 观察你的operators出现
$ kubectl get csv -n Operators
apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
name: example-argocd
labels:
example: basic
spec: {}
kubectl apply -f argocd-basic.yml
kubectl get svc
minikube service argocd-server --url
image.png
image.png
kubectl get secret
kubectl edit secret example-argocd-cluster
echo <encoded password here>= | base64 -d
应用程序名称:输入您的应用程序的描述性名称。 项目名称:指定应用程序所属的项目。 同步:选择“自动”进行自动同步。 存储库 URL:输入包含应用程序代码的 Git 存储库的 URL。 路径:指定存储库内的部署文件的路径。 目标:输入你的 Kubernetes 集群的 URL(例如https://kubernetes.default.svc./))。./) 命名空间:指定将部署应用程序的 Kubernetes 命名空间。
该项目有效地展示了如何将 GitHub、Maven、SonarQube、Docker、Jenkins、Argo CD、Helm 和 Kubernetes 集成到 CI/CD 管道中来提高软件开发的效率和可靠性。 我们简化了流程,实现了更快的交付并提高了软件质量。展望未来,我们将继续完善我们的流程并探索新的工具来提高自动化程度。