www.cnblogs.com/ruiyqinrui

开源、架构、Linux C/C++/python AI BI 运维开发自动化运维。 春风桃李花 秋雨梧桐叶。“力尽不知热 但惜夏日长”。夏不惜,秋不获。@ruiY--秦瑞

python爬虫,C编程,嵌入式开发.hadoop大数据,桉树,onenebula云计算架构.linux运维及驱动开发.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
流水线 光 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)

注意事项:

  1. 确保 Jenkins 安装了 Git 插件

  2. 工作空间需要是 Git 仓库

  3. $GIT_PREVIOUS_COMMIT 和 $GIT_COMMIT 是 Jenkins 提供的环境变量

  4. 首次构建时 $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

关键说明:

  1. 环境变量可用性:

    • $GIT_PREVIOUS_COMMIT - 上次构建的提交

    • $GIT_COMMIT - 当前构建的提交

    • $BUILD_NUMBER - 构建编号

    • $BUILD_ID - 构建ID

  2. 注意事项:

    bash
    # 确保在 Execute Shell 中正确处理换行
    # 使用 echo -e 来解析 \n 换行符
    echo -e "$chgs"
    
    # 或者使用 printf
    printf "变更信息:\n%s\n" "$chgs"
  3. 调试技巧:

    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"
  4. 单行最简版本(直接复制使用):

    bash
    chgs=$(git log --oneline $GIT_PREVIOUS_COMMIT..$GIT_COMMIT 2>/dev/null || echo "无法获取变更"); echo "$chgs"

推荐使用示例2,它处理了边界情况(首次构建、空变更等),并且格式清晰,适合大多数 Jenkins 流水线场景。

posted on 2026-02-02 10:12  秦瑞It行程实录  阅读(0)  评论(0)    收藏  举报
www.cnblogs.com/ruiyqinrui