devops===》Jenkins(pipeline)+gitlab+sonar代码扫描漏洞扫描

一、sonar基本概念及使用

Sonarqube是一个开源的代码质量检测工具,可以单独使用,也可以作为一个检测步骤放在Jenkins的pipeline CI/CD 流水线。简单的理解,他通过一个snarqube scanner 的工具来扫描代码,然后把结果发给 sonarqube server,用户可以在这个sonarqube server的网页界面查看报告。

当我们把Jenkins和 sonarqube整合的时候,Jenkins调用 sonarqube scanner 扫描,把结果发送给sonarqube 服务器,然后服务器完成报告之后,通过 webhook再把结果发过Jenkins,Jenkins根据结果判断是否继续运行pipeline

1.sonar创建webhooks

在这里插入图片描述
url填写jenkins的地址:http://jenkinsurl/sonarqube-webhook/(密码可不填)
在这里插入图片描述

2.Jenkins的pipeline

以Java代码为例(两种方法)

#1.第一种方法:在gitlab代码目录下上传sonar-project.properties文件,内容如下:

# must be unique in a given SonarQube instance
sonar.projectKey=test
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=test
sonar.projectVersion=0.0.1

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**

sonar.java.source=1.8
sonar.java.target=1.8

# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

#####pipeline:
pipeline {
agent any

parameters {
gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH', type: 'PT_BRANCH'
string defaultValue: 'mvn clean package -U', description: '打包命令', name: 'mvnArgs', trim: false}
tools {
maven 'MAVEN'
jdk 'JDK'
nodejs 'NODEJS'
}

stages {
stage('pull') {
steps {
cleanWs()
checkout([$class: 'GitSCM', branches: [[name: "${params.BRANCH}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '0-4a15-b78d-708e01dfcc07', url: "ssh://git仓库地址"]]])
}
}

stage('SonarQubeanalysis') {   #代码扫描
steps{
script {
scannerHome = tool 'sonarscanner'   #与Jenkins全局变量设置里名称一致
}
withSonarQubeEnv('sonarqube') {    #与Jenkins系统设置里name一致
sh "${scannerHome}/bin/sonar-scanner -Dsonar.java.binaries=. -Dsonar.sources=."
}
}
}
stage("Quality Gate") {   
steps {
script {
            sleep(10)   //这里遇到一个坑  返回状态出现阻塞现象 加sleep 后正常

            timeout(15) {

                  //利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail

                  def qg = waitForQualityGate()

                      if (qg.status != 'OK') {

                          error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"

                          bearychatSend message:"Jenkins发布项目 ${env.JOB_NAME}${env.BUILD_NUMBER},代码静态检测结果:未通过:${qg.status}",webhook: "${bearychat_url}"

                      }

                  }

              }

}

stage('MVN') {
steps {
sh "${params.mvnArgs}"
}
}
}

}
#2.第二种方法(直接编写pipeline不用定义sonar-project.properties文件,所需参数通过-D指定):
 def createVersion() {
    return new Date().format('yyyyMMddHHmmss')
}
 pipeline {
    agent any
environment {
        _version = createVersion()
    }
parameters {
  gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH', type: 'PT_BRANCH'
  string defaultValue: 'mvn clean package', description: '打包命令', name: 'mvnArgs', trim: false}    
 tools {
        maven 'MAVEN'
        jdk 'JDK'
        nodejs 'NODEJS'
    }
     
stages {
        stage('pull') {
            steps {
                cleanWs()
                checkout([$class: 'GitSCM', branches: [[name: "${params.BRANCH}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '07-4a15-b78d-708e01d07', url: "ssh://git仓库地址"]]])
            }
        }
 stage('SonarQubeanalysis') {
            steps{
                script {
                 scannerHome =  tool 'sonarscanner'
                }
            withSonarQubeEnv('sonarqube') {
                sh "${scannerHome}/bin/sonar-scanner  -Dsonar.projectKey=devops-iov-base -Dsonar.projectVersion=${_version} -Dsonar.projectName=devops-iov-base -Dsonar.java.binaries=.  -Dsonar.sources=."
            }
            }
        }
           stage("Quality Gate") {
               steps {
                   timeout(time: 1, unit: 'HOURS') {      
                   sleep (10)      
                   waitForQualityGate abortPipeline: true     
                       }
                }
        }
 
        stage('MVN') {
            steps {
            sh  "${params.mvnArgs}"
            }
        }
  stage('docker-build') {
            steps {
                 
              script{
                    env.COMMIT= sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                  	sh """
                  	#!/bin/bash
                   echo ${COMMIT}
                   echo ${_version}
				   docker login test.com --username 123456 --password eyJhbGciOiJSUzI1NiIsImtpZCI6IlZVRFM6
                   docker build  --build-arg test -t test.com/test/test:${params.BRANCH}-${COMMIT}-${_version} . 
                   docker push  test.com/test/test:${params.BRANCH}-${COMMIT}-${_version}
                   docker rmi test.com/test/test:${params.BRANCH}-${COMMIT}-${_version}
			    """
              }
            }
        } 
        stage('docker-deploy') {
            steps {
                 
              script{
                    env.COMMIT= sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                  	sh """
                  	#!/bin/bash
                   echo ${COMMIT}
                   echo ${_version}
				   cp /data/jenkins/deploy/devops/service-deploy.sh .
				   cp /data/jenkins/deploy/devops/test.yml .
				   sed  -i 's/:5.0_beta/:'${params.BRANCH}-${COMMIT}-${_version}'/'  test.yml
				   sed -i "/sleep 2/i docker pull test.com/test/test:${params.BRANCH}-${COMMIT}-${_version}" service-deploy.sh
				   scp -P 22 service-deploy.sh  root@172.17.1:/data/ota-deploy/scripts
				   scp -P 22 test.yml  root@172.17:/data/ota-deploy/scripts
				  ssh -p 22 -tt root@172.17 << remotessh
				  cd /data/ota-deploy/scripts 
				  sh service-deploy.sh iov-base
				  exit
				  remotessh
			    """
              }
            }
        }
}

}

构建成功后会在sonar的web的界面生成项目,也可在Jenkins上查看
在这里插入图片描述
在这里插入图片描述

<think>好的,用户现在想了解如何从零基础入门实践Jenkins Pipeline脚本。我需要先回顾之前的对话,用户之前询问了DevOps的总体介绍,现在可能对具体的工具使用感兴趣,特别是Jenkins Pipeline。用户可能是刚接触DevOps的新手,或者是开发人员想要学习自动化部署流程。 首先,用户需要的是零基础入门指导,所以应该从基础概念讲起,比如什么是Jenkins Pipeline,为什么使用它。然后分步骤讲解如何安装Jenkins,配置环境,创建第一个Pipeline。需要确保步骤清晰,适合没有经验的用户。 接下来,可能需要包括Pipeline脚本的基本结构,比如声明式脚本式两种语法,因为这是常见的分类。同时,用户可能需要示例代码,比如简单的Hello World,以及逐步添加步骤,比如执行Shell命令、集成Git构建Java项目等。 还要考虑常见的错误调试方法,比如查看日志、处理超时等,帮助用户避免常见陷阱。最后,提供进一步学习的资源,如官方文档社区,帮助用户继续深入学习。 需要注意使用中文,避免专业术语过于复杂,必要时用代码块展示示例,并确保步骤详细,用户能够一步步跟随操作。同时,检查是否需要强调某些最佳实践,比如保存Jenkinsfile到代码库,使用环境变量等,这些对新手来说很重要。 最后,确认回答的结构是否清晰,是否覆盖了用户的需求,有没有遗漏重要步骤,比如插件安装或者环境配置,这些都是新手可能遇到的问题。确保回答友好、易懂,并鼓励用户实践提问。</think>以下是一份针对零基础学习者的 **Jenkins Pipeline 脚本实践入门指南**,通过具体场景逐步掌握核心用法: --- ### 一、环境准备 1. **安装 Jenkins** - 下载地址:https://www.jenkins.io/download/ - 本地启动(Java 11+ 环境): ```bash java -jar jenkins.war --httpPort=8080 ``` - 首次访问 `http://localhost:8080`,按向导完成初始化 2. **安装必要插件** 进入 **Manage Jenkins → Plugins**,安装: - Pipeline - Git - Blue Ocean(可视化管道编辑器) --- ### 二、第一个 Pipeline 脚本 #### 1. 创建新任务 1. 点击 **New Item** → 输入任务名(如 `my-first-pipeline`)→ 选择 **Pipeline** 2. 在 **Pipeline** 配置页底部,选择 **Pipeline script** 输入框 #### 2. 编写 Hello World 脚本 ```groovy pipeline { agent any // 指定执行节点(any 表示任意可用节点) stages { stage('Greeting') { // 阶段1:打招呼 steps { echo 'Hello Jenkins Pipeline!' sh 'date' // 执行Shell命令 } } } } ``` 点击 **Save** → **Build Now**,在控制台输出中查看结果。 --- ### 三、Pipeline 语法精讲 #### 1. **两种编写方式** | 类型 | 特点 | 适用场景 | |------------|----------------------------------|--------------------| | **声明式** | 结构化语法,易读性强 | 推荐新手使用 | | **脚本式** | 基于 Groovy 的编程灵活性 | 复杂逻辑控制 | #### 2. **声明式 Pipeline 结构模板** ```groovy pipeline { agent any // 或指定 docker/node 标签 options { timeout(time: 1, unit: 'HOURS') // 超时设置 } stages { stage('Build') { steps { // 构建步骤(如 mvn clean package) } } stage('Test') { steps { // 测试步骤(如运行单元测试) } } } post { // 后置处理 always { // 无论成功失败都执行(如清理临时文件) } success { // 构建成功时执行(如发送邮件通知) } } } ``` --- ### 四、实战案例:自动化构建 Java 项目 #### 1. 场景描述 - 从 Git 仓库拉取代码 - 用 Maven 编译打包 - 将生成的 JAR 包归档 #### 2. Pipeline 脚本 ```groovy pipeline { agent any environment { // 定义环境变量 MAVEN_HOME = '/opt/maven' PATH = "$MAVEN_HOME/bin:$PATH" } stages { stage('Checkout') { steps { git branch: 'main', url: 'https://github.com/user/java-demo.git' } } stage('Build') { steps { sh 'mvn clean package -DskipTests' archiveArtifacts artifacts: 'target/*.jar', fingerprint: true } } } post { success { emailext body: '构建成功!访问构建产物:${BUILD_URL}artifact/', subject: 'SUCCESS: ${JOB_NAME}', to: 'team@example.com' } } } ``` --- ### 五、关键技巧与调试 #### 1. **可视化编辑(Blue Ocean)** - 点击 **Open Blue Ocean** → 图形化添加阶段/步骤 - 支持实时验证语法 #### 2. **调试方法** - 查看 **Console Output** 日志(重点关注红色错误) - 使用 `sh 'pwd'` 确认当前工作目录 - 逐步注释代码定位问题 #### 3. **常用代码片段** ```groovy // 并行执行任务 stage('Parallel Jobs') { parallel { stage('Unit Test') { steps { sh 'mvn test' } } stage('Static Analysis') { steps { sh 'mvn sonar:sonar' } } } } // 人工审核步骤 stage('Deploy Approval') { steps { timeout(time: 2, unit: 'DAYS') { input message: '确认部署到生产环境?', ok: '批准' } } } ``` --- ### 六、学习资源推荐 1. **官方文档** https://www.jenkins.io/doc/book/pipeline/ 2. **语法生成器** Jenkins 页面 → Pipeline Syntax → 生成代码片段 3. **实战课程** - Udemy《Jenkins Pipeline 大师班》 - 极客时间《DevOps实战笔记》 --- **下一步建议**: 1. 在本地 Jenkins 复现上述 Java 构建案例 2. 尝试将脚本迁移到 Jenkinsfile 并提交到代码库 3. 扩展流水线(如添加 Docker 镜像构建步骤) 遇到具体错误时,可提供控制台日志片段,我会帮您分析解决!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值