矩阵式并发jenkins job

在 Multi-configuration Project 中使用 for 循环遍历user-defined Axis中的name值
在 Multi-configuration Project 中使用 for 循环遍历 User-defined Axis 的 name 值

1. 正确理解 Multi-configuration Project 的轴机制

在 Multi-configuration Project 中,您不需要手动编写 for 循环来遍历轴值。Jenkins 会自动为每个轴组合创建独立的作业执行。以下是如何正确处理:

2. 配置 Multi-configuration Project 的正确方式

2.1 轴配置

yaml
Configuration Matrix:
  - User-defined Axis:
      Name: name
      Values: jen anli tom
  - User-defined Axis:
      Name: age
      Values: 10 30 40 50

Jenkins 会自动生成以下 12 个组合

  • name=jen, age=10

  • name=jen, age=30

  • name=jen, age=40

  • name=jen, age=50

  • name=anli, age=10

  • name=anli, age=30

  • name=anli, age=40

  • name=anli, age=50

  • name=tom, age=10

  • name=tom, age=30

  • name=tom, age=40

  • name=tom, age=50

3. 构建步骤中的 Shell 脚本

3.1 在每个组合中访问轴值

bash
#!/bin/bash
# 注意:在 Multi-configuration Project 中
# Jenkins 会自动为每个组合设置 name 和 age 变量

echo "========== 当前组合信息 =========="
echo "Name: ${name}"
echo "Age: ${age}"
echo "当前组合: ${name}-${age}"
echo "=================================="

# 不需要 for 循环遍历 name,因为这是单个组合的执行
# 但如果需要与所有可能的 name 比较,可以这样做:

# 定义所有可能的 name 值
ALL_NAMES=("jen" "anli" "tom")

# 生成 ECHO.sh
cat > ECHO.sh << 'EOF'
#!/bin/bash
echo "生成 ECHO.sh 脚本"
echo "当前处理的 name: '${name}'"
echo "当前处理的 age: '${age}'"

# 遍历所有可能的 name 进行比较处理
for possible_name in jen anli tom; do
    if [ "${name}" = "${possible_name}" ]; then
        echo "✓ 匹配: ${possible_name} -> 这是当前处理的名称"
        
        # 根据匹配的 name 执行不同操作
        case "${possible_name}" in
            "jen")
                echo "执行 Jen 的专用逻辑..."
                # 这里可以执行 Jen 特定的命令
                echo "Jen 任务: 年龄分析"
                ;;
            "anli")
                echo "执行 Anli 的标准逻辑..."
                # 这里可以执行 Anli 特定的命令
                echo "Anli 任务: 数据处理"
                ;;
            "tom")
                echo "执行 Tom 的备份逻辑..."
                # 这里可以执行 Tom 特定的命令
                echo "Tom 任务: 备份操作"
                ;;
        esac
    else
        echo "○ 不匹配: ${possible_name}"
    fi
done
# 年龄处理逻辑
echo "年龄值: ${age}"
if [ ${age} -lt 20 ]; then
    echo "年龄组: 青少年"
elif [ ${age} -lt 40 ]; then
    echo "年龄组: 青年"
elif [ ${age} -lt 60 ]; then
    echo "年龄组: 中年"
fi

# 输出到文件
OUTPUT_FILE="result_${name}_${age}.txt"
echo "结果文件: ${OUTPUT_FILE}"
echo "Name: ${name}, Age: ${age}, Timestamp: $(date)" > "${OUTPUT_FILE}"
EOF
# 赋予执行权限并运行
chmod +x ECHO.sh
echo "执行 ECHO.sh..."
./ECHO.sh
# 记录执行日志
echo "[INFO] 组合 ${name}-${age} 执行完成" >> execution_summary.log

4. 高级用法:在脚本中引用所有轴值

4.1 如果需要访问所有 name 值

bash
#!/bin/bash
# 在 Multi-configuration Project 中
# Jenkins 不提供直接访问所有轴值的方法
# 但您可以硬编码或从外部源获取

# 方法1:硬编码所有可能的 name
ALL_NAMES="jen anli tom"
# 方法2:从文件读取
# echo "jen anli tom" > /tmp/all_names.txt
# ALL_NAMES=$(cat /tmp/all_names.txt)
# 生成详细报告
cat > generate_report.sh << 'EOF'
#!/bin/bash
echo "===== 组合分析报告 ====="
echo "当前组合: ${name} (age: ${age})"
echo ""
# 分析当前 name 在所有 name 中的位置
counter=1
for n in jen anli tom; do
    if [ "${name}" = "${n}" ]; then
        echo "${counter}. [X] ${n} ← 当前处理的"
    else
        echo "${counter}. [ ] ${n}"
    fi
    ((counter++))
done
echo ""
echo "当前组合详情:"
echo "- Name: ${name}"
echo "- Age: ${age}"
# 根据 name 选择执行节点
case "${name}" in
    "jen")
        echo "执行节点: jen专用节点"
        echo "节点标签: jen-special-node"
        ;;
    "anli")
        echo "执行节点: anli标准节点"
        echo "节点标签: anli-standard-node"
        ;;
    "tom")
        echo "执行节点: tom备份节点"
        echo "节点标签: tom-backup-node"
        ;;
esac
echo "报告生成时间: $(date)"
EOF

chmod +x generate_report.sh
./generate_report.sh

5. Pipeline 风格的 Multi-configuration 脚本

5.1 使用 matrix 指令(推荐)

groovy
pipeline {
    agent any
    
    parameters {
        // 定义参数
    }
    
    stages {
        stage('Build Matrix') {
            matrix {
                axes {
                    axis {
                        name 'NAME'
                        values 'jen', 'anli', 'tom'
                    }
                    axis {
                        name 'AGE'
                        values '10', '30', '40', '50'
                    }
                }        
                stages {
                    stage('Build') {
                        steps {
                            script {
                                echo "当前组合: NAME=${NAME}, AGE=${AGE}"
                                
                                // 可以遍历所有可能的 NAME
                                def allNames = ['jen', 'anli', 'tom']
                                allNames.each { n ->
                                    if (n == NAME) {
                                        echo "✓ 匹配当前名称: ${n}"
                                    } else {
                                        echo "○ 其他名称: ${n}"
                                    }
                                }
                                
                                // 生成和执行 ECHO.sh
                                sh '''
                                    #!/bin/bash
                                    cat > ECHO.sh << \'SCRIPT_EOF\'
                                    #!/bin/bash
                                    echo "Multi-configuration 执行"
                                    echo "名称: '${NAME}'"
                                    echo "年龄: '${AGE}'"
                                    # 遍历比较
                                    for n in jen anli tom; do
                                        if [ "${NAME}" = "$n" ]; then
                                            echo "当前处理: $n"
                                            case "$n" in
                                                "jen") echo "Jen 任务" ;;
                                                "anli") echo "Anli 任务" ;;
                                                "tom") echo "Tom 任务" ;;
                                            esac
                                        fi
                                    done
                                    SCRIPT_EOF
                                    chmod +x ECHO.sh
                                    ./ECHO.sh
                                '''
                            }
                        }
                    }
                }
            }
        }
    }
}

6. 理解 Multi-configuration 的执行流程

6.1 Jenkins 的执行顺序

Multi-configuration Project
Jenkins 自动创建 12 个独立的执行实例
每个实例获得自己的环境变量:
    - name=jen, age=10
    - name=jen, age=30
    - ...
    - name=tom, age=50
每个实例独立执行构建步骤
每个实例生成自己的 ECHO.sh

6.2 正确的 Shell 脚本示例

#!/bin/bash
# 在 Multi-configuration Project 中正确的处理方式
echo "=== Multi-configuration 执行开始 ==="
# Jenkins 自动提供了 name 和 age 变量
CURRENT_NAME="${name}"
CURRENT_AGE="${age}"
echo "当前配置:"
echo "  - 名称: ${CURRENT_NAME}"
echo "  - 年龄: ${CURRENT_AGE}"
# 定义所有可能的 name 用于比较
POSSIBLE_NAMES="jen anli tom"
# 生成处理脚本
cat > process_combination.sh << 'EOF'
#!/bin/bash
echo "处理脚本开始"
echo "传入参数:"
echo "  name=$1"
echo "  age=$2"
MY_NAME=$1
MY_AGE=$2
# 遍历所有可能的 name
for POSSIBLE_NAME in jen anli tom; do
    if [ "$MY_NAME" = "$POSSIBLE_NAME" ]; then
        echo "√ 找到匹配: $POSSIBLE_NAME"
        # 根据 name 执行不同逻辑
        case "$POSSIBLE_NAME" in
            jen)
                echo "执行 Jen 的特殊处理"
                # Jen 的专用命令
                ;;
            anli)
                echo "执行 Anli 的标准处理"
                # Anli 的标准命令
                ;;
            tom)
                echo "执行 Tom 的备份处理"
                # Tom 的备份命令
                ;;
        esac
    fi
done
# 输出结果
echo "最终输出:"
echo "组合: ${MY_NAME}-${MY_AGE}"
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
EOF
chmod +x process_combination.sh
# 执行脚本
echo "执行处理脚本..."
./process_combination.sh "${CURRENT_NAME}" "${CURRENT_AGE}"
echo "=== Multi-configuration 执行完成 ==="

7. 重要注意事项

  1. 不需要手动循环:Multi-configuration Project 会自动为您创建所有组合

  2. 每个组合独立:每个组合在自己的工作空间中执行

  3. 并行执行:可以在配置中设置并行执行组合

  4. 变量自动注入:name 和 age 变量会自动在每个组合中设置

posted @ 2026-03-13 14:31  JASON_yul  阅读(10)  评论(0)    收藏  举报