Category Archive : SonarQube

打造K8S与Jenkins的持续集成系统-CI部分

说明

持续集成系统包括CI和CD。在这篇文章里,我们只讨论CI的实现。关于K8S,Jenkins,私有仓库的安装这里不进行说明,只讲解如何将这些工具组合在一起。

1.拥有一个K8S集群

我的环境是6台虚拟机,3台Master,3台Slaver。如下图所示

运行结果如下图:

2.Jenkins中安装好了kubernetes插件


安装好之后,在系统设置中,能够添加kubernetes信息

3.根据Jenkins的配置要求,去自己的K8S平台上找到对应的信息。填入Jenkins中


我们根据图中的要求,可以在K8S里进行一个个的查找我们想要的信息

字段
查找方法
Kubernetes 地址
IP地址是在keepalived里配置的虚拟IP

在搭建k8S平台时,用到了haproxy,当时指向了**443端口
kubernetes名称 随意填写
kubernetes命名空间 需要在K8S里创建一个命名空间,然后在这个地方使用
凭据
1.进入K8S机器上,输入命令kubectl config view –minify –flatten查看凭据

2.把凭据信息复制成一个文件

3.在Jenkins里上传这个文件

4.这个凭据信息即可在Jenkins配置里使用
JENKINS地址 配置本次使用的Jenkins的url即可
Pod Retention 选择Never,Jenkins任务完成后就删除pod

4.添加私有密钥用于拉取我们的docker私有镜像

在K8S里输入如下命令
kubectl create secret docker-registry repo-k8s \
-n k8s-jx \
--docker-server='repo.local:5000' \
--docker-username='
zhenwei.li
' \
--docker-password='*******' \
--docker-email='357244849@qq
.com
'

5.在Jenkins里编写一个最简单的流水线任务。来测试Jenkins是否可以拉起K8S的节点,产生pod

5.1.从github上抄一段代码示例下来https://github.com/jenkinsci/kubernetes-plugin/blob/master/src/test/resources/org/csanchez/jenkins/plugins/kubernetes/pipeline/jnlpWorkingDir.groovy

podTemplate(label:'jnlp-slave',cloud: 'kubernetes',containers: [
    containerTemplate(name: 'busybox', image: 'nginx:latest', ttyEnabled: true)
],imagePullSecrets:['secret/repok8s']) {
    node ('jnlp-slave') {
        stage('Run') {
            sh 'env | sort'
            container('busybox') {
                sh 'echo "hello"'
                sh 'pwd'
                sh 'ls'
            }
        }
    }
}

5.2创建一个流水线任务

5.3运行这个流水线任务,查看结果

5.4在K8S上输入查找pod的命令,应该会发现有一个pod被运行起来了,名字中含有jnlp-slave的字样,2/2运行两个容器,一个是jnlp容器,一个是busybox容器

kubectl get pods --all-namespaces -o wide

6.在代码仓库中添加CI所需要的Jenkinsfile和BuildPod.yaml等流水线文件

文件名
用处
sonar-project.properties 定义代码需要执行什么语言的扫描,哪些目录需要剔除
JenkinsfileTag 定义打tag操作对应的流水线行为
Jenkinsfile 定义代码提交与合并的流水线行为
BuildPod.yaml K8S产生的pod中,包含哪些容器,容器的环境变量等参数设置

7.BuildPod.yaml中需要包含哪些内容(以nodejs代码举例)

8.Jenkinsfile中需要包含哪些内容

最后在Jenkins里查看运行效果


 

sonarQube解决sonar.java.binarie必填参数的问题

问题阐述

新版的sonarQube在扫描java代码的时候,要求sonar-project.properties里sonar.java.binaries字段必须填写。这个sonar.java.binaries是“指向包含与源文件对应的已编译字节码文件的目录”,一般来说,maven框架的话,是target/classes。
但是!问题来了,有的时候,我们的代码静态扫描是在还没有编译之前就开始的。例如我们从Jenkins的pipeline里定义了git 拉取代码,然后直接执行SonarQube analysis。并不进行编译。这样我们的Jenkins里是会报错的。那我们该如何处理呢?

解决方案

1.错误的解决方案:网上流行的是去sonarQube的plugins下面的sonar-java替换成4.10版本。但是,这样做其实是不对的,这样会引发其他的不兼容报错
2.正确的解决方案是:先生成一个空的目录,然后把sonar-project.properties指向这个目录。这样就能避免这个错误。下面提供一段pipeline,以供参考

Talk is cheap,show me the code

stage('create empty folder') {
            steps {
                sh "mkdir /tmp/empty"
                sh "echo -e 'sonar.java.binaries=/tmp/empty' >> ./sonar-project.properties"
            }
        }
stage('SonarQube analysis') {
    steps {
        script {
            def scannerHome = tool 'sonarqubescanner4.0'
            withSonarQubeEnv('sonar') { // If you have configured more than one global server connection, you can specify its name
                sh "${scannerHome}/bin/sonar-scanner"
            }
        }
    }
}

苏ICP备18047533号-2