原来的写法

        stage('代码编译'){
           when { environment name: 'deploy_env', value: 'deploy' }
           steps {
             sh """
                cnpm install --unsafe-perm --registry=https://registry.npmmirror.com/
                cnpm run build:prod
                pwd
                """ 
           }
        }

在Jenkins Pipeline中,可以通过添加try-catch逻辑来处理npm install失败的情况。如果npm install失败,可以通过error函数直接终止Pipeline的执行,避免未编译成功的代码被部署到线上。以下是优化后的代码:

groovy复制

// 项目
// 需要修改前端项目部署的目录
def project_webdir = "dmpweb"
// 需要修改对应服务的git地址
def git_address = "http://git.wanyanzhenjiang.net/hz/web/dmp-web.git"
// 认证
def git_auth = "gitlab-creds-bj" //git login auth

pipeline {
    agent { label 'jnlp-slave' }

    parameters {
        gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '选择发布的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH_TAG' //PT_BRANCH_TAG获取分支和TAG
        choice (choices: ['prod'], description: '选择发布环境', name: 'Namespace')
        choice choices: ['deploy'], description: '''deploy发布新代码''', name: 'deploy_env'
    }

    stages {
        stage('拉取代码') {
            steps {
                checkout([$class: 'GitSCM', 
                branches: [[name: "${params.Branch}"]], 
                doGenerateSubmoduleConfigurations: false, 
                extensions: [], submoduleCfg: [], 
                userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]
                ])
            }
        }

        stage('代码编译') {
            when { environment name: 'deploy_env', value: 'deploy' }
            steps {
                script {
                    try {
                        sh """
                            cnpm install --unsafe-perm --registry=https://registry.npmmirror.com/
                            cnpm run build:prod
                            pwd
                        """
                    } catch (Exception e) {
                        echo "编译失败,终止Pipeline执行。"
                        error("编译失败,无法继续部署。")
                    }
                }
            }
        }

        stage('部署') {
            when { environment name: 'deploy_env', value: 'deploy' }
            steps {
                sh """
                    rsync -avz --delete dist/ /data/webapps/${project_webdir}
                    pwd
                """
            }
        }
    }
}

优化点:

  1. 加入try-catch逻辑

    • 代码编译阶段,使用script块包裹sh命令。

    • 如果cnpm installcnpm run build:prod失败,会抛出异常并捕获。

    • 使用error函数直接终止Pipeline的执行,避免未编译成功的代码被部署。

  2. 日志提示

    • 在捕获异常时,通过echo输出日志,方便排查问题。

  3. 代码清晰性

    • 保持原有逻辑不变,只在关键步骤加入错误处理机制,确保代码的可读性。

通过这种方式,可以有效避免因编译失败而导致的未编译代码被部署到线上环境。

更多推荐