linux

Jenkins于Linux如何定制构建脚本

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

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

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

二 Pipeline 方式定制脚本

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 方式定制脚本

#!/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 节点编排

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' }
    }
  }
}

五 最佳实践与排错要点

0
看了该问题的人还看了