参数化构建和使用脚本

JenkinsBeginner
立即练习

介绍

在现代 CI/CD(持续集成/持续部署)流程中,灵活性和自动化是关键。将值硬编码到构建任务(build jobs)中会使它们变得僵化且难以管理。Jenkins 允许你通过参数化构建(parameterizing your builds)并在构建过程的一部分执行脚本来克服这个问题。

在这个 Lab 中,你将学习如何创建一个灵活的 Jenkins 任务。你将从添加参数开始,以便在构建时允许用户输入。然后,你将学习如何将 shell 脚本作为构建步骤执行,将参数传递给这些脚本,并配置构建后操作(post-build actions),使其能够根据构建的成功或失败做出条件性响应。这些是创建健壮且动态的 Jenkins 自动化工作流程的基础技能。

你的环境中已经有一个 Jenkins 实例在运行。你可以通过打开桌面上的 Firefox 浏览器来访问 Jenkins Web 界面。浏览器将自动打开到 http://localhost:8080,因此你无需手动输入 URL。不需要登录。

创建和参数化 Freestyle 项目

在这一步中,你将创建一个新的 Jenkins 自由风格(Freestyle)实验,并为其添加参数。参数使你的任务(job)具有交互性,允许你在每次触发构建时提供输入。

首先,让我们创建这个任务。

  1. 从桌面界面打开 Firefox 浏览器。浏览器将自动打开到 http://localhost:8080,因此你无需手动输入 URL。无需登录。
  2. 在 Jenkins 仪表板(dashboard)上,点击左侧菜单中的 New Item
  3. 输入 parameterized-script-job 作为任务名称(item name)。
  4. 选择 Freestyle project 并点击 OK

Jenkins dashboard New Item button

你将被带到任务的配置页面。现在,让我们添加参数。

  1. General 部分,勾选 This project is parameterized 框。

    Jenkins job configuration page with parameters

  2. 点击 Add Parameter 下拉菜单并选择 String Parameter

    • Name: GREETING_NAME
    • Default Value: World
    • Description: Enter a name to be greeted. (输入一个要问候的名字。)
  3. 再次点击 Add Parameter 下拉菜单并选择 Choice Parameter

    • Name: ENVIRONMENT

    • Choices: (每行输入一个选项)

      DEV
      STAGING
      PROD
      
    • Description: Select the deployment environment. (选择部署环境。)

这些参数将在后续的构建步骤中可用。

Jenkins job configuration page with parameters

最后,滚动到底部并点击 Save。你将被重定向到任务的主页面,此时你会看到 Build with Parameters 选项,而不是 "Build Now"。

Build with Parameters

添加 Shell 脚本构建步骤

在这一步中,你将在你的任务(job)的构建流程中添加一个 shell 脚本。这是执行编译代码、运行测试或部署应用程序等任务的常用方法。

  1. 导航到 Jenkins 中的 parameterized-script-job 仪表板。
  2. 从左侧菜单点击 Configure(配置)。
  3. 向下滚动到 Build Steps(构建步骤)部分。
  4. 点击 Add build step(添加构建步骤)下拉菜单,然后选择 Execute shell(执行 shell)。
  5. Command(命令)文本区域中,输入以下脚本。此脚本将在 Jenkins 工作空间(workspace)内创建一个项目目录结构并列出其内容。
echo "--- Starting Build Step ---"
echo "Current directory:"
pwd
echo "Creating project directory structure:"
mkdir -p my-app
echo "Version 1.0" > my-app/version.txt
echo "Listing files in the project directory:"
ls -la my-app
echo "--- Build Step Finished ---"

Jenkins job configuration page showing build steps

  1. 点击 Save(保存)以应用更改。

现在,让我们运行该任务(job)以查看脚本的实际执行情况。

  1. 在任务页面上,点击 Build with Parameters(带参数构建)。
  2. 保持默认的参数值,然后点击 Build(构建)按钮。
  3. 一个新的构建将出现在左侧的 Build History(构建历史)中。点击构建编号(例如 #1)。
  4. 点击 Console Output(控制台输出)以查看日志。

你应该能看到来自你的 shell 脚本的输出,包括文件列表。

Started by user admin
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/parameterized-script-job
[parameterized-script-job] $ /bin/sh -xe /tmp/jenkins15539247300321029374.sh
+ echo --- Starting Build Step ---
--- Starting Build Step ---
+ echo Current directory:
Current directory:
+ pwd
/var/jenkins_home/workspace/parameterized-script-job
+ echo Creating project directory structure:
Creating project directory structure:
+ mkdir -p my-app
+ echo Version 1.0
+ echo Listing files in the project directory:
Listing files in the project directory:
+ ls -la my-app
total 12
drwxr-xr-x 2 jenkins jenkins 4096 Aug 22 01:56 .
drwxr-xr-x 3 jenkins jenkins 4096 Aug 22 01:56 ..
-rw-r--r-- 1 jenkins jenkins   12 Aug 22 01:56 version.txt
+ echo --- Build Step Finished ---
--- Build Step Finished ---
Finished: SUCCESS

Jenkins job console output

将参数传递给 Shell 脚本

在此步骤中,你将学习如何在 shell 脚本中使用你在步骤 1 中定义的参数。Jenkins 将构建参数公开为环境变量,你可以在脚本中使用 $VARIABLE_NAME 语法访问它们。

  1. 返回你的 parameterized-script-jobConfigure 页面。
  2. 向下滚动到 Build Steps 部分,找到 Execute shell 命令框。
  3. 将现有脚本替换为以下脚本:
echo "--- Starting Parameterized Build Step ---"
echo "Hello, $GREETING_NAME!"
echo "Deploying to the $ENVIRONMENT environment."

## Create project structure if not exists and read the version from the file
mkdir -p my-app
echo "Version 1.0" > my-app/version.txt
APP_VERSION=$(cat my-app/version.txt)
echo "Application version is: $APP_VERSION"
echo "--- Parameterized Build Step Finished ---"

请注意 $GREETING_NAME$ENVIRONMENT 是如何直接在 echo 命令中使用的。当作业运行时,Jenkins 会将它们替换为用户选择的值。

  1. 点击 Save

现在,让我们使用自定义参数运行构建。

  1. 点击 Build with Parameters
  2. GREETING_NAME 更改为 LabEx
  3. ENVIRONMENT 下拉菜单中选择 STAGING
  4. 点击 Build
  5. 检查新构建的 Console Output

输出现在应该反映你提供的自定义值。

Jenkins build console output showing parameterized script execution

--- Starting Parameterized Build Step ---
+ echo Hello, LabEx!
Hello, LabEx!
+ echo Deploying to the STAGING environment.
Deploying to the STAGING environment.
+ mkdir -p my-app
+ echo Version 1.0
+ cat my-app/version.txt
+ APP_VERSION=Version 1.0
+ echo Application version is: Version 1.0
Application version is: Version 1.0
+ echo --- Parameterized Build Step Finished ---
--- Parameterized Build Step Finished ---

使用条件步骤处理构建失败

在此步骤中,你将模拟构建失败,并使用构建后操作(Post-build Action)仅在构建失败时运行清理或通知脚本。这对于创建有弹性的流水线至关重要。

安装构建后任务插件 (Post-build Task Plugin)

在我们能够使用构建后任务(Post-build task)操作之前,需要安装所需的插件。

  1. 在 Jenkins 中,点击右上角的齿轮按钮图标进入 Jenkins 管理面板,然后点击 **插件 (Plugins)**。
  2. 点击 可用插件 (Available plugins) 标签页。
  3. 点击 立即检查 (Check now) 以刷新插件列表。
  4. 在搜索框中,搜索 Post build task
  5. 勾选插件旁边的复选框,然后点击 **不重启安装 (Install without restart)**。
  6. 等待安装完成。

Jenkins available plugins page searching for Post build task

修改脚本以模拟失败

现在,让我们修改脚本,使其在特定条件下失败。

  1. 导航到你的 parameterized-script-job配置 (Configure) 页面。
  2. 执行 Shell (Execute shell) 命令框中,将脚本替换为以下内容:
echo "Deploying to the $ENVIRONMENT environment."

if [ "$ENVIRONMENT" = "PROD" ]; then
  echo "Error: Production deployment is not allowed!"
  exit 1
fi

echo "Deployment to $ENVIRONMENT was successful."

此脚本会检查 ENVIRONMENT 参数。如果它被设置为 PROD,它将打印一条错误信息并以状态码 1 退出。在 Shell 脚本中,任何非零的退出代码都表示失败。

现在,让我们添加一个在失败时触发的构建后操作。

添加构建后操作

  1. 向下滚动到 构建后操作 (Post-build Actions) 部分。
  2. 点击 添加构建后操作 (Add post-build action) 并选择 **构建后任务 (Post-build task)**。
  3. 日志文本 (Log text) 字段中,输入 Error:。这会告诉插件在构建日志中查找此特定文本。
  4. 脚本 (Script) 字段中,输入以下命令:
echo "FAILURE DETECTED! Sending notification..."

Post-build task configuration with failure detection

  1. 点击 **保存 (Save)**。

测试失败条件

现在,让我们测试失败条件。

  1. 点击 **使用参数构建 (Build with Parameters)**。
  2. ENVIRONMENT 选择 PROD,然后点击 **构建 (Build)**。
  3. 构建将失败,这在构建历史记录中会由一个红色的图标指示。
  4. 检查 **控制台输出 (Console Output)**。你将看到来自主脚本的错误消息以及来自你的构建后任务的消息。

Console output showing build failure and post-build task

Deploying to the PROD environment.
+ [ PROD = PROD ]
+ echo Error: Production deployment is not allowed!
Error: Production deployment is not allowed!
+ exit 1
Build step 'Execute shell' marked build as failure
Performing Post build task...
Match found for :Error: : True
Logical operation result is TRUE
Running script  : echo "FAILURE DETECTED! Sending notification..."
[parameterized-script-job] $ /bin/sh -xe /tmp/jenkins14011006354379294736.sh
+ echo FAILURE DETECTED! Sending notification...
FAILURE DETECTED! Sending notification...
POST BUILD TASK : SUCCESS
END OF POST BUILD TASK : 0
Finished: FAILURE

如果使用 DEVSTAGING 再次运行构建,它将成功,并且构建后任务不会被执行。

总结

恭喜。你已成功创建了一个灵活且健壮的 Jenkins 作业。

在此实验中,你已学会如何:

  • 使用 String 和 Choice 参数创建参数化的 Jenkins 作业。
  • 在构建过程中执行 shell 脚本。
  • 在脚本中将构建参数作为环境变量进行访问和使用。
  • 在脚本中实现条件逻辑以控制构建结果。
  • 配置基于构建日志内容触发的构建后操作,使你能够优雅地处理构建失败。

这些技能对于构建能够适应不同输入并智能处理错误的复杂 CI/CD 流水线至关重要。你现在可以将这些概念应用于自动化你自己的开发和部署工作流。