前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DevOps: 实施端到端CI/CD管道

DevOps: 实施端到端CI/CD管道

作者头像
DevOps云学堂
发布2024-06-19 18:32:56
690
发布2024-06-19 18:32:56
举报
文章被收录于专栏:DevOps持续集成DevOps持续集成

介绍

持续集成和持续交付 (CI/CD) 在现代软件开发中至关重要,有助于实现自动化代码集成和可靠的应用程序交付。 Jenkins 以其灵活性和广泛的插件选项而闻名,是创建 CI/CD 管道的领先工具。

这篇博文将指导您使用 Jenkins 完成 CI/CD 管道的完整设置。我们将介绍从配置 Jenkins 并将其与版本控制系统集成到编排构建、测试和部署的所有内容。我们的目标是增强您的软件交付流程。

使用的工具和技术

我们将在本指南中使用各种技术和工具,包括:

  • GitHub用于版本控制
  • Maven用于项目管理和构建
  • SonarQube用于代码质量分析
  • Docker用于容器化
  • Jenkins用于持续集成
  • ArgoCD和Helm用于 Kubernetes 部署管理
  • 用于编排容器的Kubernetes

配置版本控制系统

要使用 Java 应用程序为 Jenkins 管道建立基础,首先需要配置 Git:

  1. 创建私人 Git 存储库:
  • 访问您首选的 Git 托管平台(例如,GitHub、GitLab)。
  • 登录您的帐户,如果您没有帐户,请注册。
  • 创建一个新的存储库。确保将其可见性设置为私有以保护您的代码。
  1. 生成个人访问令牌:
  • 导航到您的帐户设置,通常位于您的个人资料下或下拉菜单中。
  • 查找标有“开发人员设置”或“个人访问令牌”的部分。
  • 生成一个新令牌并分配必要的权限,例如“repo”以访问存储库。
  • 复制并安全保存此令牌;稍后您将需要它来在 Jenkins 管道内配置访问权限。
  1. 本地克隆存储库:
  • 在这里找到源代码。
  • 打开 Git Bash 或您的终端。
  • 切换到您想要克隆存储库的目录。
  • 执行以下命令,替换为您的存储库的 URL:
代码语言:javascript
复制
git clone <URL>

image.png


创建EC2实例

请注意,此步骤也可以使用Terraform自动执行,但为了简单起见,我们将在此手动执行。

1. 登录 AWS 管理控制台:

  • 访问AWS 管理控制台
  • 使用您的 AWS 账户凭证登录。如果您没有账户,则需要创建一个。

2.导航到 EC2 仪表板:

  • 登录后,找到控制台顶部的“服务”菜单。
  • 单击“计算”部分下的“EC2”转到 EC2 仪表板。

3.启动实例:

  • 点击“启动实例”按钮。这将启动创建新 EC2 实例的过程。

4.添加标签:

  • 为您的实例添加标签和名称,以便更好地组织和管理。

5.选择 Amazon 系统映像 (AMI):

  • 您将看到一个 AMI 列表,这些 AMI 是预配置的服务器模板。这些模板可以包括不同的操作系统和设置。
  • 选择适合您要求的 AMI。对于初学者来说,Amazon Linux AMI 或基本 Ubuntu Server 可能是最简单的选择。

6.选择实例类型:

  • 选择符合您要求的实例类型。
  • 默认选项(通常是 t2.micro 实例)适合测试和小型工作负载,并且符合免费套餐的条件。
  • 我选择了t2.large提供 2 个 vCPU 和 8 GiB 内存的实例,适合处理中等工作负载。
  • 请注意,使用此实例类型将产生费用,因此查看 AWS 上的当前定价详情以有效管理预算非常重要。

7.创建密钥对:

  • 创建密钥对或使用现有密钥对。此密钥对对于通过 SSH 访问您的实例至关重要。
  • 下载私钥文件(.pem文件)并妥善保存。创建后无法再次下载。

8.配置实例详细信息:

  • 或者,配置实例详细信息,例如网络设置、子网、IAM 角色等。您现在可以将这些设置保留为默认设置。

9.配置安全组:

  • 安全组充当虚拟防火墙,控制进出实例的流量。
  • 您可以创建新的安全组或选择现有的安全组。请确保打开入站端口,例如 SSH(端口 22)、自定义 TCP(8080)和自定义 TCP(9000)。

10.添加存储:

  • 指定根卷的大小(对于测试目的来说,默认值通常就足够了)。

11.审核与发布:

  • 检查您的实例设置。检查 AMI 详细信息、实例类型、安全组和密钥对。
  • 单击“启动”继续。

访问您的实例

实例启动后,将需要几分钟来初始化。 然后,您可以使用下载的文件通过 SSH 连接到您的实例.pem。 我们正在使用 Mobaxterm 通过 SSH 连接到 EC2 实例(对于 Windows 机器)。

  • 获取MobaXterm并安装它。
  • 从桌面或“开始”菜单打开 MobaXterm。
  • 单击“会话”按钮,然后选择“SSH”。
  • 输入服务器的 IP 地址或主机名并指定用户名。
  • 点击“高级 SSH 设置”,勾选“使用私钥”框并选择您在实例中使用的私钥对。
  • 单击“确定”进行连接。

设置Jenkins

安装 Java: 在运行 Jenkins 之前,必须在服务器上安装 Java。Jenkins 与 OpenJDK 和 Oracle Java 兼容,但通常与 OpenJDK 配合使用效果最佳。 下面说明了如何在通过 SSH 连接的实例上安装 Java:

代码语言:javascript
复制
sudo apt update
sudo apt install openjdk-11-jdk
java -version

安装 Jenkins: 现在 Java 已在我们的服务器上安装并准备就绪,下一步是安装 Jenkins。您有两种安装方式:使用脚本或手动执行命令。 使用脚本是高效且可重复的,特别是当您计划多次部署 Jenkins 或在不同环境中保持一致的设置时。

  • 使用“vim”或您选择的任何其他编辑器创建脚本文件。
代码语言:javascript
复制
vim install_jenkins.sh
  • 按下i以确保您处于插入模式并编写脚本。
代码语言:javascript
复制
#!/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
  • 键入:wq然后按Enter。此命令将更改写入文件 ( w) 并退出编辑器 ( q)。
  • 使用以下命令使文件可执行:
代码语言:javascript
复制
chmod + x install_jenkins.sh
  • 现在您的脚本已可执行,您可以运行它来安装 Jenkins:
代码语言:javascript
复制
./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:

代码语言:javascript
复制
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

安装建议的插件:

  • 一旦 Jenkins 解锁,您将看到安装建议的插件或手动选择特定插件的选项。
  • 点击安装建议的插件可以自动安装一组标准插件,这对大多数用户来说是推荐的。

创建您的管理员用户:

  • 插件安装后,系统将提示您为 Jenkins 创建管理员用户。
  • 在表单中填写用户名、密码、全名和电子邮件地址。点击“保存并继续”。

Jenkins就绪:

  • Jenkins 将要求您配置 Jenkins 实例的 URL。
  • 将填写默认 URL(基于您服务器的 IP 和端口)。
  • 单击“开始使用 Jenkins”完成设置并进入 Jenkins 仪表板。

安装必要的插件:

  • 打开 Jenkins Dashboard:登录您的 Jenkins 界面。
  • 导航到“管理 Jenkins > 插件”。
  • 安装插件:查找“docker pipe”和“sonarqube scanner”插件并安装它们,然后根据需要重新启动 Jenkins。

配置编译作业

  • 在 Jenkins 主仪表板中,单击“新建项目”。
  • 命名您的管道并选择“管道”作为项目类型,然后单击“确定”。

配置您的管道:

  • 单击创建的作业并向下滚动到配置屏幕中的“管道”部分。
  • 选择“管道脚本”或“来自 SCM 的管道脚本”。

第一个选项允许您直接在 Jenkins 界面中编写 Groovy 脚本,而第二个选项从 Git 等源代码管理系统中提取脚本。

  • 如果您选择“来自 SCM 的管道脚本”:请选择 SCM 的类型(例如 Git)。
  • 输入包含 Jenkinsfile 的存储库的 URL。
  • 如果您的存储库是私有的,请添加凭证。
  • 指定要构建的分支,通常是*/main或*/master。
  • 如果您的 Jenkinsfile 位于子目录中或名称不同,请指定路径(默认为Jenkinsfile)。

重启jenkins:

  • 重新启动 Jenkins 以有效应用配置更改或更新。
  • 为此,请导航到 Jenkins “仪表板”并单击侧栏中的“管理 Jenkins” 。
  • 从那里,选择“从磁盘重新加载配置”或“安全重启”。

image.png


设置Sonarqube服务器

将 SonarQube 安装为 Docker 容器是一种流行的选项,它简化了设置过程并使其更易于管理和扩展。 先决条件:确保您的服务器上安装了 Docker。如果没有,您可以从 Docker 官方网站下载并安装 Docker。 Docker 安装:

  • 使用“vim”或您选择的任何其他编辑器创建脚本文件。
代码语言:javascript
复制
vim install_docker.sh
  • 按下i以确保您处于插入模式并编写脚本。
代码语言:javascript
复制
#!/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 
  • 按下Esc以确保您处于正常模式,然后输入:wq,然后按Enter。
  • 使用以下命令使文件可执行:
代码语言:javascript
复制
chmod +x install_docker.sh
  • 现在您的脚本已可执行,您可以运行它来安装 Docker:
代码语言:javascript
复制
./install_docker.sh

安装Sonarqube:

  • 从 Docker Hub 中提取官方 SonarQube Docker 镜像:
代码语言:javascript
复制
docker pull sonarqube
  • 使用以下命令在 Docker 容器中运行 SonarQube。
代码语言:javascript
复制
docker run -d --name sonarqube -p 9000:9000 sonarqube

SonarQube 默认在端口 9000 上运行。因此,为了确保无缝访问 SonarQube 仪表板,必须配置防火墙以允许此端口上的入站流量。 http://<your_instance_ip>:9000通过在浏览器中输入并替换<your_instance_ip>为服务器的 IP 地址来访问 SonarQube 。 SonarQube 的默认登录凭据是:

  • 用户名:admin
  • 密码:admin

但是,出于安全原因,建议在初始设置后更改这些默认凭据。

与 Jenkins 集成:

  • 为 Jenkins 插件安装SonarQube Scanner 。
  • 登录到您的 SonarQube 仪表板。
  • 转到“我的帐户”>“安全”,单击“生成令牌”
  • 为令牌提供一个名称,然后单击“生成”。
  • 复制生成的令牌。

在 Jenkins 中添加 SonarQube 令牌作为凭证:

  • 在 Jenkins 中,转到“管理 Jenkins” > “凭据” > “系统” > “全局凭据”(或导航到您的项目的凭据)。
  • 点击“添加凭证”。
  • 选择“秘密文本”作为凭证类型。
  • 将 SonarQube 身份验证令牌粘贴到“Secret”字段中。
  • (可选)提供凭证的 ID 和描述。
  • 单击“创建”以保存凭证。

配置 Jenkins SonarQube 扫描仪:

  • 在您的 Jenkins 作业配置中,找到 SonarQube 分析的部分或您为其命名的任何部分。
  • 提供 SonarQube 服务器 URL(例如,http://<your_instance_ip>:9000替换<your_instance_ip>为您服务器的 IP 地址)。
  • 使用之前添加的 SonarQube 令牌作为身份验证令牌。

配置系统认证证书

确保为您的 CI/CD 管道正确配置了所有必需的凭据。 这包括 SonarQube 身份验证、Docker Hub 访问和 Git 存储库身份验证的凭据。

Jenkinsfile

Jenkinsfile 是一个文本文件,用于定义 Jenkins 管道的配置。它使用 Java 平台的脚本语言 Groovy 编写。 Jenkinsfile 指定了 Jenkins 在运行管道作业时应执行的步骤、阶段和操作。

Jenkins 文件的某些部分将需要您用您的凭据和详细信息替换它们,因此请留意这一点。 管道阶段:

  1. 从 Git 检出源代码。
  2. 使用 Maven 构建 Java 应用程序。
  3. 使用 JUnit 和 Mockito 运行单元测试。
  4. 运行SonarQube分析检查代码质量。
  5. 将应用程序打包成 JAR 文件。
  6. 使用 Helm 将应用程序部署到测试环境。
  7. 对已部署的应用程序运行用户验收测试。
  8. 使用 Helm 将应用程序提升到生产环境。
代码语言:javascript
复制
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
                '''
                }
            }
        }
    }
}
  • 单击“立即构建”以触发管道作业的构建。
  • Jenkins 将从您的存储库中获取 Jenkinsfile 并按照定义执行它。
  • 在 Jenkins 仪表板上查看管道作业的进度。
  • 单击作业即可查看管道执行每个阶段时的详细日志和状态更新。
  • 如果管道执行期间出现任何问题,请检查 Jenkinsfile 和作业配置中是否存在错误。
  • 检查控制台输出和日志以获取有关任何故障的更多信息。

SonarQube 将包含管道执行的报告。

设置 ArgoCD

ArgoCD 管理 CI/CD 管道的持续部署部分,自动部署到 Kubernetes。您可以使用 Minikube 进行本地部署,也可以使用 Amazon EKS 进行云部署。

先决条件:

  • 确保您的 Windows 机器上安装了 VirtualBox 或 Hyper-V 以实现虚拟化,这是 Minikube 的要求。

安装 Minikube:

  • 按照Minikube 官方文档中针对您的操作系统的说明下载并安装 Minikube 。
  • 启动本地 Kubernetes 集群。
代码语言:javascript
复制
minikube start

安装 Kubectl:

  • kubectl从官方 Kubernetes 发布页面下载最新版本。
  • 将其添加kubectl到您的 PATH 以便从命令提示符中的任何位置运行它。

安装 ArgoCD Operator

您可以使用 Argo CD Operator 在 Kubernetes 上安装 Argo CD,它可以自动部署和管理 Argo CD 实例。

  • 前往OperatorHub.io上的官方 Operator Hub 页面。
  • 使用 Operator Hub 网站上的搜索栏搜索“Argo CD”,然后单击“安装”。
  • 运行以下命令:
代码语言:javascript
复制
# 安装 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
代码语言:javascript
复制
#安装 AgroCD Operator
kubectl create -f https://operatorhub.io/install/argocd-operator.yaml
  • 该 Operator 将安装在“operators”命名空间中,并可在集群中的所有命名空间中使用。
代码语言:javascript
复制
# 观察你的operators出现
$ kubectl get csv -n Operators

设置 ArgoCD 控制器

  • 导航到OperatorHub.io。
  • 在“Argo CD”操作员中向下滚动到“操作员文档”。
  • 单击“使用”,然后单击“基础”。
  • 复制提供的 YAML 配置。此 YAML 用于在 Kubernetes 集群中部署 Argo CD。
  • 创建一个名为vim argocd-basic.yml以下内容的新文件来定义您的 Argo CD 实例:
代码语言:javascript
复制
apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
  name: example-argocd
  labels:
    example: basic
spec: {}
  • 应用配置。
代码语言:javascript
复制
kubectl apply -f argocd-basic.yml

设置 ArgoCD UI

  • 要通过浏览器访问 Argo CD 服务器 UI,您需要将服务类型从“ClusterIP”更改为“NodePort”。
代码语言:javascript
复制
kubectl get svc
  • Minikube 可以生成一个 URL,通过浏览器直接访问 Argo CD 服务器。
代码语言:javascript
复制
minikube service argocd-server --url

image.png

  • 将上一个命令显示的 URL 复制到浏览器中以访问 Argo CD UI。

image.png

  • 默认用户名是“admin”。要获取管理员密码,您需要从 Kubernetes secrets 中提取它:
代码语言:javascript
复制
kubectl get secret
  • 编辑“example-argocd-cluster”密钥并复制管理员密码。
代码语言:javascript
复制
kubectl edit secret example-argocd-cluster
  • K8s 机密采用 Base 64 加密,因此请使用此命令对其进行解码。
代码语言:javascript
复制
echo <encoded password here>= | base64 -d
  • 使用用户名“admin”和上一步中检索到的密码登录 Argo CD UI。

使用 Argo CD 进行部署

  • 在 Argo CD UI 中,单击“创建应用程序”。
  • 填写申请所需信息:

应用程序名称:输入您的应用程序的描述性名称。 项目名称:指定应用程序所属的项目。 同步:选择“自动”进行自动同步。 存储库 URL:输入包含应用程序代码的 Git 存储库的 URL。 路径:指定存储库内的部署文件的路径。 目标:输入你的 Kubernetes 集群的 URL(例如https://kubernetes.default.svc./))。./) 命名空间:指定将部署应用程序的 Kubernetes 命名空间。

  • 提供所有必要的信息后,单击“创建”。
  • Argo CD 将根据提供的配置自动在您的 Kubernetes 集群上创建应用程序。

结论

该项目有效地展示了如何将 GitHub、Maven、SonarQube、Docker、Jenkins、Argo CD、Helm 和 Kubernetes 集成到 CI/CD 管道中来提高软件开发的效率和可靠性。 我们简化了流程,实现了更快的交付并提高了软件质量。展望未来,我们将继续完善我们的流程并探索新的工具来提高自动化程度。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps云学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置版本控制系统
  • 创建EC2实例
  • 访问您的实例
  • 配置编译作业
  • 设置Sonarqube服务器
  • 配置系统认证证书
  • Jenkinsfile
  • 设置 ArgoCD
    • 先决条件:
      • 安装 ArgoCD Operator
        • 设置 ArgoCD 控制器
          • 设置 ArgoCD UI
            • 使用 Argo CD 进行部署
            • 结论
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档