流水线 光 shell 命令 包括 构建 发布 怎么在这种情况下 仅用shell 简短命令获取 jenkins 每次构建发布的 chages 信息存储到 chgs 变量
在 Jenkins 流水线中,可以使用 sh 命令获取构建的变更信息。以下是几种方法:
方法1:获取最近提交的变更信息
bash
# 获取上次构建以来的变更
chgs=$(git log --oneline HEAD~1..HEAD 2>/dev/null || echo "No changes found")
方法2:获取当前构建的完整变更信息
bash
# 在 Jenkins 流水线中,可以获取与上次成功构建的差异
chgs=$(git log --oneline $(git describe --tags --abbrev=0 2>/dev/null)..HEAD 2>/dev/null || git log --oneline -5 2>/dev/null)
方法3:使用 Jenkins 环境变量(推荐)
bash
# 直接获取 Jenkins 提供的变更信息
chgs=$(git log --oneline $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null || echo "First build or no previous commit")
# 或者更完整的格式
chgs=$(git log --format="%h - %an, %ar : %s" $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null || echo "No previous build for comparison")
方法4:结合 Jenkins 内置功能
bash
# 获取当前构建的所有变更
chgs=""
for commit in $(git rev-list $GIT_PREVIOUS_SUCCESSFUL_COMMIT..HEAD 2>/dev/null || git log --format="%H" -10); do
msg=$(git log --format="%s" -1 $commit)
author=$(git log --format="%an" -1 $commit)
chgs="${chgs}• $author: $msg\n"
done
# 如果没有变更,设置默认值
[ -z "$chgs" ] && chgs="No changes detected"
在 Jenkinsfile 中的完整示例
groovy
pipeline {
agent any
stages {
stage('Get Changes') {
steps {
script {
// 方法1:简单获取
def chgs = sh(script: '''
git log --oneline $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null ||
echo "First build or no changes"
''', returnStdout: true).trim()
echo "Changes: ${chgs}"
// 或者方法2:获取详细变更
def detailed_chgs = sh(script: '''
if [ -n "$GIT_PREVIOUS_COMMIT" ]; then
git log --format="%h - %an (%ae), %ad : %s" --date=short $GIT_PREVIOUS_COMMIT..$GIT_COMMIT
else
git log --format="%h - %an (%ae), %ad : %s" --date=short -5
fi
''', returnStdout: true).trim()
echo "Detailed changes:\n${detailed_chgs}"
}
}
}
stage('Build') {
steps {
sh 'echo "Building..."'
}
}
}
}
简化的单行命令版本
bash
# 最基本版本
chgs=$(git log --oneline $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null || echo "No changes")
# 包含作者和时间
chgs=$(git log --format="%ad - %an: %s" --date=short $GIT_PREVIOUS_SUCCESSFUL_COMMIT..HEAD 2>/dev/null || git log --format="%ad - %an: %s" --date=short -5)
注意事项:
-
确保 Jenkins 安装了 Git 插件
-
工作空间需要是 Git 仓库
-
$GIT_PREVIOUS_COMMIT和$GIT_COMMIT是 Jenkins 提供的环境变量 -
首次构建时
$GIT_PREVIOUS_COMMIT可能为空,需要处理这种情况
选择最适合你流水线需求的方法即可。
这些命令 放到jenkins 的 Build Steps 执行shell 里面 可以吗
是的,完全可以。这些命令可以直接放到 Jenkins 的 "Build Steps" → "Execute shell" 里面。以下是针对不同场景的具体示例:
示例1:最简单的版本(直接放在 Execute Shell 中)
bash
# 获取变更信息并存储到变量
chgs=$(git log --oneline $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null || echo "First build or no previous commit")
# 打印查看
echo "========== 构建变更信息 =========="
echo "$chgs"
echo "=================================="
# 后续可以使用 $chgs 变量
echo "Changes variable length: ${#chgs}"
示例2:完整的工作流程
bash
#!/bin/bash
# 获取当前构建的变更信息
echo "正在获取变更信息..."
if [ -n "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ]; then
# 有上一次成功构建,获取差异
chgs=$(git log --format="%h - %an, %ad : %s" --date=short \
$GIT_PREVIOUS_SUCCESSFUL_COMMIT..HEAD 2>/dev/null)
if [ -z "$chgs" ]; then
chgs="没有检测到代码变更(可能与上次构建相同)"
fi
else
# 首次构建或没有上次成功构建记录
chgs="首次构建或无法获取历史变更记录,显示最近5次提交:"
chgs="$chgs\n$(git log --format="%h - %an, %ad : %s" --date=short -5 2>/dev/null)"
fi
# 输出变更信息
echo -e "\n📋 本次构建包含以下变更:"
echo -e "$chgs"
# 保存到文件供后续步骤使用
echo "$chgs" > build_changes.txt
# 统计变更数量
change_count=$(echo "$chgs" | grep -c "^[0-9a-f]" || echo "0")
echo "变更提交数量: $change_count"
示例3:多行处理版本
bash
# 设置变量
chgs=""
# 获取变更列表(每行一个提交)
if [ -n "$GIT_PREVIOUS_COMMIT" ] && [ -n "$GIT_COMMIT" ]; then
while read line; do
if [ -n "$line" ]; then
chgs="${chgs}▶ ${line}\n"
fi
done <<< "$(git log --format="%h - %s (by %an)" $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null)"
fi
# 如果为空,设置默认值
if [ -z "$chgs" ]; then
chgs="🔍 无变更信息或首次构建"
fi
# 使用变量
echo -e "变更记录:\n$chgs"
示例4:集成到构建步骤中
bash
#!/bin/bash
# 步骤1:获取变更
echo "=== 步骤1: 收集构建变更 ==="
chgs=$(git log --pretty=format:"• [%h] %s - %an (%ad)" --date=short \
$GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null ||
git log --pretty=format:"• [%h] %s - %an (%ad)" --date=short -3)
# 步骤2:构建前信息展示
echo "构建号: $BUILD_NUMBER"
echo "构建ID: $BUILD_ID"
echo -e "代码变更:\n$chgs"
# 步骤3:实际构建操作(示例)
echo "=== 步骤2: 开始构建 ==="
# 这里放你的实际构建命令
# mvn clean package 或 npm run build 等
# 步骤4:发布时携带变更信息
echo "=== 步骤3: 准备发布 ==="
echo "将变更信息写入元数据..."
cat > build-info.json << EOF
{
"build_number": "$BUILD_NUMBER",
"build_time": "$(date)",
"git_commit": "$GIT_COMMIT",
"changes": "$(echo $chgs | tr '\n' ';' | sed 's/"/\\"/g')"
}
EOF
关键说明:
-
环境变量可用性:
-
$GIT_PREVIOUS_COMMIT- 上次构建的提交 -
$GIT_COMMIT- 当前构建的提交 -
$BUILD_NUMBER- 构建编号 -
$BUILD_ID- 构建ID
-
-
注意事项:
bash# 确保在 Execute Shell 中正确处理换行 # 使用 echo -e 来解析 \n 换行符 echo -e "$chgs" # 或者使用 printf printf "变更信息:\n%s\n" "$chgs" -
调试技巧:
bash# 查看所有可用的 Jenkins 环境变量 env | sort | grep -i git # 查看具体的 Git 信息 echo "GIT_COMMIT: $GIT_COMMIT" echo "GIT_PREVIOUS_COMMIT: $GIT_PREVIOUS_COMMIT" echo "GIT_BRANCH: $GIT_BRANCH" -
单行最简版本(直接复制使用):
bashchgs=$(git log --oneline $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null || echo "无法获取变更"); echo "$chgs"
推荐使用示例2,它处理了边界情况(首次构建、空变更等),并且格式清晰,适合大多数 Jenkins 流水线场景。
浙公网安备 33010602011771号