学习

如何从 Jenkins 管道部署 Redis Enterprise 数据库

Jenkins 目前是 最流行的 CI (持续集成) 工具,拥有约 1500 万用户。它是一个开源自动化服务器,使开发人员能够可靠地构建、测试和部署他们的软件。它于 2011 年从一个名为 Hudson 的项目中分离出来,在与 Oracle 的 争议后,用于 持续集成和持续交付 (CI/CD)和测试自动化。Jenkins 基于 Java,并提供超过 1700 个插件来自动化您的开发工作流程,并节省您在执行重复性任务方面的大量时间。

来源: Datanyze 市场分析

Jenkins Pipeline 执行存储在代码旁的 Jenkinsfile 中声明的持续交付任务。 Pipeline 插件 在其源代码树中有一个相当全面的 教程。插件是增强 Jenkins 环境功能以满足组织或用户特定需求的主要手段。使用 Pipeline,您可以配置 Jenkins 自动部署关键基础设施组件,例如 Redis 数据库。

架构

Jenkins Pipelines 是 Jenkins 的持续交付 (CD) 方面。它们使用 Jenkinsfile 声明性脚本定义管道的行为。您可以用 Groovy 编写脚本操作并从中运行 shell 脚本,因此您可以让它做几乎任何事情。

该 Jenkinsfile 指示 Jenkins 从凭据存储中导出一些环境变量以连接到 Redis 服务器,然后使用给定参数的部署配置文件执行 Python 管道脚本。一个示例 deployment-configuration-file.json 如下所示

{
  "database": {
    "name": "made-with-jenkins",
    "port": 12345,
    "size": "S",
    "operation": "CREATE"
  }
}
Python 脚本使用预定义的 JSON 模板文件,这些文件创建固定 T 恤尺寸(S、M、L、XL)的 Redis 数据库。部署配置文件告诉 Python 脚本所需的数据库名称、端口和大小是什么。示例模板文件如下所示
{
    "name": "{NAME}",
    "type": "redis",
    "memory_size": 343597383
}
以下是 Jenkins 管道如何将数据库添加到 Redis 集群的架构图。

流程

  1. Jenkins 管道克隆包含应用程序代码和管道代码的远程 git 存储库。
  2. Redis 主机、端口、用户和密码从凭据存储中解密并导出为环境变量。
  3. Jenkins 运行 Python 管道脚本,在 git 存储库中指定部署配置文件。
  4. Python 脚本使用部署配置文件选择和自定义预填充的模板,以用作发送到 Redis 的 REST 创建数据库请求的主体。

管道代码文件列表

配置 Jenkins

安装 Jenkins

您可以使用 Docker Desktop 快速启动并运行 Jenkins 实例,公开端口 8080(Web GUI)和 50000(入站代理)。

docker run --name jenk -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts-jdk11

安装将在 docker-cli 输出中生成首次运行密码。

然后打开 Jenkins URL https://localhost:8080/ 并输入密码以解锁您的实例并开始安装。

选择“安装建议的插件”以执行 Jenkins 配置。

等待插件完成安装过程。

接下来,系统将提示您创建管理员用户。
恭喜!Jenkins 已准备就绪!

安装 Python 和自定义库

如果您使用的是现有 Jenkins 服务器实例,则可以从该机器的命令行界面安装 Python 和自定义库。

可以使用以下命令通过 shell 访问 Jenkins 的 Docker 实例

docker exec -it -u root jenk bash

Python 管道脚本需要库 click 和 requests。它还需要 Python。

apt-get update
apt-get install -y python3-pip

pip install --upgrade pip
pip install click
pip install requests
或者,如果您从头开始创建新的 Jenkins,则可以在单独的 Dockerfile中包含这些依赖项,该文件基于 Jenkins 基本映像构建:
FROM jenkins:latest
USER root
RUN apt-get update
RUN apt-get install -y python-pip

# Install app dependencies
RUN pip install --upgrade pip
RUN pip3 install click
RUN pip3 install requests

将凭据添加到 Secret Store

使用左侧菜单,选择 管理 Jenkins,然后选择 管理凭据,然后单击链接 (全局).

在这里,您可以指定 Kind: Secret text 用于连接 Redis REST 端点的 4 个必需密钥

  • REDIS_SERVER_FQDN
    • 设置为目标 Redis 实例的“https://server-address”。
  • REDIS_SERVER_PORT
    • 设置为 Redis REST API 端口(默认值为 9443)。
  • REDIS_USER
    • 设置为允许创建数据库的 Redis 管理员用户。
  • REDIS_PASS
    • 设置为 Redis 管理员用户的密码。

如果您使用的是私有代码存储库,您可能还想在此处包含一个个人访问令牌。

创建 Jenkins 管道

从仪表盘中,单击 新建项目.

输入管道的名称,并选择 管道 类型。

连接 GitHub 存储库

在出现的管道配置页面中,选中 GitHub 框并输入 git 克隆 URL,包含读取存储库所需的任何凭据。对于 GitHub 访问,密码应为个人访问令牌,而不是实际用户密码。

Redis 管道 Jenkinsfile

在此页面上向下滚动到 高级项目选项,您可以粘贴 Jenkinsfile,或者,如果文件存在于 git 存储库中,您可以指定文件名。

这是一个示例 Jenkinsfile 包含凭据到环境变量的映射,以及 2 个独立的阶段 - 始终成功的 Hello World 和调用 Python 脚本的构建阶段。将此粘贴到管道脚本部分。
pipeline {
    agent any

    environment {
        REDIS_SERVER_FQDN = credentials('REDIS_SERVER_FQDN')
        REDIS_SERVER_PORT = credentials('REDIS_SERVER_PORT')
        REDIS_USER =  credentials('REDIS_USER')
        REDIS_PASS = credentials('REDIS_PASS')
    }

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }

        stage('build') {
            steps {
                git branch: 'main', url: 'https://github.com/masyukun/redis-jenkins-pipeline.git'
                sh 'python3 jenkins-re-pipeline.py --deployfile deployment-configuration-file.json'
            }
        }
    }
}

当作业规范完成时,单击“保存”。

运行 Jenkins 管道

单击您创建的管道

单击左侧菜单中的“立即构建”图标。

单击 状态 图标,以便查看来自管道中每个阶段的所有输出结果。

将鼠标悬停在 构建 阶段上,然后单击 日志 按钮,以查看最新构建中的 Python 脚本输出。

示例输出:您应该在“Shell 脚本”手风琴窗格中看到来自 Redis REST 服务的详细响应。

还存在一个“Git”输出日志,如果您需要在该级别进行调试,它会很有用。您在远程 git 存储库中更新分支的任何时候,都应该在该日志中看到最新更改已成功检出到本地 Jenkins git 存储库的证据。

在 https://servername:8443 处打开您的 Redis Enterprise 安全管理 UI,然后单击 数据库 菜单项以验证您的数据库是否已创建,名称、端口和大小在 deployment-configuration-file.json 文件中指定。

恭喜!您已使用 Jenkins 管道部署了 Redis Enterprise 数据库!

GitHub 存储库当前为: https://github.com/masyukun/redis-jenkins-pipeline