介绍
在现代 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)具有交互性,允许你在每次触发构建时提供输入。
首先,让我们创建这个任务。
- 从桌面界面打开 Firefox 浏览器。浏览器将自动打开到
http://localhost:8080,因此你无需手动输入 URL。无需登录。 - 在 Jenkins 仪表板(dashboard)上,点击左侧菜单中的 New Item。
- 输入
parameterized-script-job作为任务名称(item name)。 - 选择 Freestyle project 并点击 OK。

你将被带到任务的配置页面。现在,让我们添加参数。
在 General 部分,勾选 This project is parameterized 框。

点击 Add Parameter 下拉菜单并选择 String Parameter。
- Name:
GREETING_NAME - Default Value:
World - Description:
Enter a name to be greeted.(输入一个要问候的名字。)
- Name:
再次点击 Add Parameter 下拉菜单并选择 Choice Parameter。
Name:
ENVIRONMENTChoices: (每行输入一个选项)
DEV STAGING PRODDescription:
Select the deployment environment.(选择部署环境。)
这些参数将在后续的构建步骤中可用。

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

添加 Shell 脚本构建步骤
在这一步中,你将在你的任务(job)的构建流程中添加一个 shell 脚本。这是执行编译代码、运行测试或部署应用程序等任务的常用方法。
- 导航到 Jenkins 中的
parameterized-script-job仪表板。 - 从左侧菜单点击 Configure(配置)。
- 向下滚动到 Build Steps(构建步骤)部分。
- 点击 Add build step(添加构建步骤)下拉菜单,然后选择 Execute shell(执行 shell)。
- 在 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 ---"

- 点击 Save(保存)以应用更改。
现在,让我们运行该任务(job)以查看脚本的实际执行情况。
- 在任务页面上,点击 Build with Parameters(带参数构建)。
- 保持默认的参数值,然后点击 Build(构建)按钮。
- 一个新的构建将出现在左侧的 Build History(构建历史)中。点击构建编号(例如
#1)。 - 点击 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

将参数传递给 Shell 脚本
在此步骤中,你将学习如何在 shell 脚本中使用你在步骤 1 中定义的参数。Jenkins 将构建参数公开为环境变量,你可以在脚本中使用 $VARIABLE_NAME 语法访问它们。
- 返回你的
parameterized-script-job的 Configure 页面。 - 向下滚动到 Build Steps 部分,找到 Execute shell 命令框。
- 将现有脚本替换为以下脚本:
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 会将它们替换为用户选择的值。
- 点击 Save。
现在,让我们使用自定义参数运行构建。
- 点击 Build with Parameters。
- 将
GREETING_NAME更改为LabEx。 - 从
ENVIRONMENT下拉菜单中选择STAGING。 - 点击 Build。
- 检查新构建的 Console Output。
输出现在应该反映你提供的自定义值。

--- 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)操作之前,需要安装所需的插件。
- 在 Jenkins 中,点击右上角的齿轮按钮图标进入 Jenkins 管理面板,然后点击 **插件 (Plugins)**。
- 点击 可用插件 (Available plugins) 标签页。
- 点击 立即检查 (Check now) 以刷新插件列表。
- 在搜索框中,搜索
Post build task。 - 勾选插件旁边的复选框,然后点击 **不重启安装 (Install without restart)**。
- 等待安装完成。

修改脚本以模拟失败
现在,让我们修改脚本,使其在特定条件下失败。
- 导航到你的
parameterized-script-job的 配置 (Configure) 页面。 - 在 执行 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 脚本中,任何非零的退出代码都表示失败。
现在,让我们添加一个在失败时触发的构建后操作。
添加构建后操作
- 向下滚动到 构建后操作 (Post-build Actions) 部分。
- 点击 添加构建后操作 (Add post-build action) 并选择 **构建后任务 (Post-build task)**。
- 在 日志文本 (Log text) 字段中,输入
Error:。这会告诉插件在构建日志中查找此特定文本。 - 在 脚本 (Script) 字段中,输入以下命令:
echo "FAILURE DETECTED! Sending notification..."

- 点击 **保存 (Save)**。
测试失败条件
现在,让我们测试失败条件。
- 点击 **使用参数构建 (Build with Parameters)**。
- 为
ENVIRONMENT选择PROD,然后点击 **构建 (Build)**。 - 构建将失败,这在构建历史记录中会由一个红色的图标指示。
- 检查 **控制台输出 (Console Output)**。你将看到来自主脚本的错误消息以及来自你的构建后任务的消息。

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
如果使用 DEV 或 STAGING 再次运行构建,它将成功,并且构建后任务不会被执行。
总结
恭喜。你已成功创建了一个灵活且健壮的 Jenkins 作业。
在此实验中,你已学会如何:
- 使用 String 和 Choice 参数创建参数化的 Jenkins 作业。
- 在构建过程中执行 shell 脚本。
- 在脚本中将构建参数作为环境变量进行访问和使用。
- 在脚本中实现条件逻辑以控制构建结果。
- 配置基于构建日志内容触发的构建后操作,使你能够优雅地处理构建失败。
这些技能对于构建能够适应不同输入并智能处理错误的复杂 CI/CD 流水线至关重要。你现在可以将这些概念应用于自动化你自己的开发和部署工作流。

