温馨提示×

Jenkins于Linux如何定制构建脚本

小樊
38
2025-11-14 14:16:20
栏目: 智能运维

在 Linux 上定制 Jenkins 构建脚本的实用指南

一 选择项目类型与存放方式

  • 项目类型
    • Pipeline:用 Groovy 编写,推荐以 Jenkinsfile 纳入代码仓库,便于版本化与复用(Declarative 或 Scripted 均可)。
    • Freestyle:通过图形界面添加构建步骤,适合简单任务或快速接入。
  • 存放方式
    • Inline:在 Jenkins 任务配置里直接写脚本(适合临时或简单脚本)。
    • SCM:从 Git 等拉取脚本(推荐,便于团队协作与审计)。
  • 基本流程
    • 新建任务(选择 PipelineFreestyle)→ 配置源码管理(如 Git)→ 配置构建步骤(Pipeline 的 stages/steps,或 Freestyle 的 Execute shell)→ 保存并运行。以上两种方式在 Linux 上均适用。

二 Pipeline 方式定制脚本

  • 基本结构与常用步骤
    • 使用 agent any 或按标签调度节点;在 stages 中划分 Build/Test/Deploy;在 steps 中使用 sh 执行 Shell 命令;按需使用 post 做清理与通知。
  • 示例 Jenkinsfile(含参数、测试报告归档与通知)
    • 将以下文件提交到仓库根目录(如 Jenkinsfile),在任务中选择 Pipeline script from SCM 指向该文件。
    • 参数说明:通过 parameters 定义 DEPLOY_ENV(部署环境)、VERSION(构建版本)、ROLLBACK(是否回滚);测试阶段归档 JUnit 报告;构建后发送邮件通知。
    • 安全建议:敏感信息使用 Credentials 绑定,避免在脚本中明文出现密码或密钥。
pipeline {
  agent any
  parameters {
    choice(name: 'DEPLOY_ENV', choices: ['dev','test','prod'], description: '部署环境')
    string(name: 'VERSION', defaultValue: '', description: '构建版本/标签')
    booleanParam(name: 'ROLLBACK', defaultValue: false, description: '是否回滚')
  }
  environment {
    // 推荐用 withCredentials 绑定 SSH 私钥或用户名/密码
    // 例如:withCredentials([sshUserPrivateKey(credentialsId: 'deploy-ssh-key', keyFileVariable: 'SSH_KEY')])
  }
  stages {
    stage('Checkout') {
      steps {
        checkout scmGit(branches: [[name: env.BRANCH_NAME]], extensions: [], userRemoteConfigs: [[url: 'git@github.com:org/repo.git']])
      }
    }
    stage('Build') {
      steps {
        sh 'mvn -B -DskipTests clean package'
      }
    }
    stage('Test') {
      steps {
        sh 'mvn test'
      }
      post {
        always {
          junit '**/target/surefire-reports/*.xml'
        }
      }
    }
    stage('Deploy') {
      when {
        expression { !params.ROLLBACK }
      }
      steps {
        script {
          if (params.DEPLOY_ENV == 'dev') {
            sh 'scp target/app.jar user@dev-server:/opt/app/'
            sh 'ssh user@dev-server "systemctl restart app && systemctl is-active --quiet app || exit 1"'
          } else if (params.DEPLOY_ENV == 'test') {
            sh 'scp target/app.jar user@test-server:/opt/app/'
            sh 'ssh user@test-server "systemctl restart app"'
          } else if (params.DEPLOY_ENV == 'prod') {
            // 生产环境可接入审批、灰度、金丝雀等策略
            input '确认部署到生产环境?'
            sh 'scp target/app.jar user@prod-server:/opt/app/'
            sh 'ssh user@prod-server "systemctl restart app"'
          }
        }
      }
    }
  }
  post {
    always {
      echo "构建完成,环境:${params.DEPLOY_ENV},版本:${params.VERSION}"
    }
    failure {
      emailext(
        subject: "【构建失败】${env.JOB_NAME} #${env.BUILD_NUMBER}",
        body: "详情:${env.BUILD_URL}",
        to: 'team@example.com'
      )
    }
    success {
      emailext(
        subject: "【构建成功】${env.JOB_NAME} #${env.BUILD_NUMBER}",
        body: "版本:${params.VERSION},环境:${params.DEPLOY_ENV}",
        to: 'team@example.com'
      )
    }
  }
}

三 Freestyle 方式定制脚本

  • 新建 Freestyle 任务 → 在 源码管理 选择 Git → 在 构建 添加 Execute shell,直接编写 Shell 脚本;如需参数,勾选 This project is parameterized 添加 Choice/Text/Boolean/Password 等参数,脚本中通过 $参数名 引用。
  • 示例 Execute shell(配合参数使用)
    • 说明:脚本中使用 $DEPLOY_ENV$VERSION 等参数;可按需加入 tar 打包、备份、SCP 上传、远程启停服务等步骤。
#!/usr/bin/env bash
set -euo pipefail

echo "部署环境:$DEPLOY_ENV,版本:$VERSION"

# 示例:打包
tar czf app-${VERSION}.tar.gz target/app.jar

# 示例:备份旧包
ssh user@${DEPLOY_ENV}-server "mkdir -p /opt/backups && [ -f /opt/app/app.jar ] && cp /opt/app/app.jar /opt/backups/app-${VERSION}-$(date +%F_%H%M%S).jar"

# 示例:上传并重启
scp target/app.jar user@${DEPLOY_ENV}-server:/opt/app/app.jar
ssh user@${DEPLOY_ENV}-server "systemctl restart app && systemctl is-active --quiet app || { echo '启动失败'; exit 1; }"

四 多平台与 Linux 节点编排

  • 使用 agent { label ‘linux’ } 指定在带有 linux 标签的节点运行;也可在 agent none 下为不同阶段指定不同 label(如 windowsmacoslinux),实现跨平台流水线。
  • 示例(片段)
    • 说明:不同操作系统使用各自工具链(如 msbuildmake),通过标签将任务调度到对应代理节点。
pipeline {
  agent none
  stages {
    stage('Build on Linux') {
      agent { label 'linux' }
      steps { sh 'mkdir -p build && cd build && cmake .. && make' }
    }
    stage('Build on Windows') {
      agent { label 'windows' }
      steps { bat 'mkdir build && cd build && cmake .. && msbuild MyApp.sln /t:Rebuild /p:Configuration=Release' }
    }
  }
}

五 最佳实践与排错要点

  • 脚本与权限
    • 将脚本纳入 Git 管理,保持与代码一致;在 Linux 上确保脚本具备可执行权限(如 chmod +x),并在脚本首行声明解释器(如 #!/usr/bin/env bash)。
  • 节点与环境
    • 为 Linux 代理打上明确 label(如 linux),在 agentnode 中精确调度;必要时使用 tool auto-provisioningDocker 镜像统一构建环境。
  • 参数与凭证
    • 通过 parameters 驱动环境/版本/开关;敏感信息使用 Credentials 插件(如 Username with passwordSSH Username with private key),在 withCredentials 中使用,避免明文。
  • 稳定性与可观测性
    • 在关键阶段使用 set -euo pipefail、显式退出码;为测试阶段归档 JUnit 报告;在 post 中统一处理 成功/失败 通知与清理。
  • 安全与合规
    • 禁止在脚本中硬编码密码/密钥;最小权限运行 Jenkins Agent;必要时启用 audit loggingapproval 门禁(生产部署)。

0