专栏首页运维专栏kubernetes 基于jenkins spinnaker的ci/cd实践二sonarqube的安装与简单使用
原创

kubernetes 基于jenkins spinnaker的ci/cd实践二sonarqube的安装与简单使用

背景:

顺序有点乱了在ci/cd过程中应该是先进行代码的静态扫描再去进行扫描镜像的呢,就佛系的写了。反正步骤都是独立的。这里写一下sonarqube的安装与集成,估计实践的我还要好好研究一下!

helm安装sonarqube

参照官方文档:

https://docs.sonarqube.org/8.9/setup/sonarqube-on-kubernetes/

helm增加repo仓库

[root@k8s-master-01 helm]# helm repo add sonarqube https://SonarSource.github.io/helm-chart-sonarqube
[root@k8s-master-01 helm]# helm repo update
image.png

helm fetch包到本地

[root@k8s-master-01 helm]# helm search repo sonarqube
[root@k8s-master-01 helm]# helm fetch sonarqube/sonarqube-lts
image.png

没有办法,墙裂...手动下载ing,rz上次到服务器

解压缩tgz包并修改value.yaml文件

[root@k8s-master-01 helm]# tar zxvf sonarqube-lts-1.0.20+140.tgz
image.png
image.png

value.yam就修改了存储storageclass:如下

image.png
image.png

helm install安装sonarqube到kube-ops namespace

[root@k8s-master-01 sonarqube-lts]# helm install sonarqube -f values.yaml  . -n kube-ops
image.png
[root@k8s-master-01 anchore-engine1]# kubectl get svc -n kube-ops
[root@k8s-master-01 anchore-engine1]# kubectl get pods -n kube-ops
image.png

ingress对外映射

ingress使用的traefik,详情参照:Kubernetes 1.20.5 安装traefik在腾讯云下的实践

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sonarqube-sonarqube-lts
  namespace: kube-ops
  annotations:
    kubernetes.io/ingress.class: traefik  
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: sonarqube.xxxx.com
    http:
     paths:
     - pathType: Prefix
       path: /
       backend:
          service:
            name:  sonarqube-sonarqube-lts
            port:
              number: 9000
image.png

web登陆sonarqube验证

默认用户名密码admin admin(我蒙的),进去修改了密码

d992bfb411e25358ed409c5daa85277.png
image.png

更改中文语言包(觉得换成中文真心不好,非必要的还是英文吧我觉得!)

image.png
image.png

可能会无法从gitlab下载插件 pod log 日志报错如下

image.png

可以手动下载插件kubectl cp插件到pod /opt/sonarqube/extensions/plugins目录中,然后重启服务,重启服务可以在web操作

image.png

默认语言的扫描插件应该新版本貌似都安装了:

image.png
image.png

当然了 我的还是试了几次在线安装成功了 直接有了restart server的提示,然后重启server!

image.png

重新登陆,成功切换语言为中文

image.png

jenkins集成sonar

参照:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/

创建SonaQube的账户token

image.png

将token保存到Jenkins凭据中

image.png

在Jenkins中安装插件sonarqube scanner。

62c2e9175211fac8d397c4bd96b54b8.png

jenkins配置sonarqube服务器

转到"管理Jenkins>系统配置",向下滚动到SonarQube配置部分,单击Add SonarQube,添加服务器,选择凭据。

image.png
[root@k8s-master-01 anchore-engine1]# kubectl cp sonar-gitlab-plugin-4.1.0-SNAPSHOT.jar sonarqube-sonarqube-lts-0:/opt/sonarqube/lib/extensions/sonar-gitlab-plugin-4.1.0-SNAPSHOT.jar -n kube-ops
Defaulted container "sonarqube-lts" out of: sonarqube-lts, wait-for-db (init), init-sysctl (init), inject-prometheus-exporter (init)
[root@k8s-master-01 anchore-engine1]# kubectl exec -it sonarqube-sonarqube-lts-0 bash -n kube-ops
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulted container "sonarqube-lts" out of: sonarqube-lts, wait-for-db (init), init-sysctl (init), inject-prometheus-exporter (init)
bash-5.0$ cd /opt/sonarqube/lib/extensions/
bash-5.0$ ls
sonar-csharp-plugin-8.22.0.31243.jar     sonar-go-plugin-1.8.3.2219.jar           sonar-javascript-plugin-7.4.4.15624.jar  sonar-ruby-plugin-1.8.3.2219.jar
sonar-css-plugin-1.4.2.2002.jar          sonar-html-plugin-3.4.0.2754.jar         sonar-kotlin-plugin-1.8.3.2219.jar       sonar-scala-plugin-1.8.3.2219.jar
sonar-flex-plugin-2.6.1.2564.jar         sonar-jacoco-plugin-1.1.1.1157.jar       sonar-php-plugin-3.17.0.7439.jar         sonar-vbnet-plugin-8.22.0.31243.jar
sonar-gitlab-plugin-4.1.0-SNAPSHOT.jar   sonar-java-plugin-6.15.1.26025.jar       sonar-python-plugin-3.4.1.8066.jar       sonar-xml-plugin-2.2.0.2973.jar

我的jenkins build节点

我的jenkins是部署在kubernetes集群中的,嗯集群的cri用了containerd....故构建我用了一台单独的服务器安装了docker做build节点使用了jnlp的方式启动一个jar程序包!,嗯主机节点命名是build01。

个人习惯 build(嗯算是soft软件吧)的包都扔到/data/ci/buildtools目录下了,改名也是个人习惯忽略......

[root@k8s-node-06 buildtools]# pwd
/data/ci/buildtools
[root@k8s-node-06 buildtools]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip
[root@k8s-node-06 buildtools]# unzip sonar-scanner-cli-4.6.2.2472-linux.zip
[root@k8s-node-06 buildtools]#mv sonar-scanner-cli-4.6.2.2472-linux.zip sonar-scanner

修改/etc/profile加入环境

vim /etc/profile

export SONAR_SCANNER_HOME=/data/ci/buildtools/sonar-scanner
export PATH=$SONAR_SCANNER_HOME/bin:$PATH

source /etc/profile 
6f3d74e0806848a4f43d0e4b7b5cd27.png

关于sonar-scanner默认的jdk是11,代码都是java8....有必要修改一下.......

7c9278674012cd058ca94dac3aca500.png

use_embedded_jre=true修改为false

image.png

注:当然了前提我的服务器server早安装了java8,毕竟jenkins跑起来了早......,参加/etc/profile中java配置

image.png

sonar pipeline demo

搞一个java的demo

gitlab中仓库以及测试代码

登陆https://start.spring.io/ 生成一个jar包:

image.png

下载到本地上传到自己的gitlab仓库:https://gitlab.xxxx.com/devops/devops-maven-service

image.png

额外扔了一个jenkinsfile,当然了 也可以直接jenkins中Pipeline script

def buildTools = ["maven": "/usr/local/maven/",
                 "sonar" : "/data/ci/buildtools/sonar-scanner/"]




pipeline {
	agent { label  "build01" }	
	options {
		skipDefaultCheckout true
	}

	stages {
		stage("GetCode"){
			steps{
				script{
					println("下载代码 --> 分支: ${env.branchName}")
 					checkout([$class: 'GitSCM', branches: [[name: "${env.branchName}"]],
 							 extensions: [], 
 							 userRemoteConfigs: [[credentialsId: 'gitlab-admin-user', 
 							 						url: "${env.gitHttpURL}"]]])
				}
			}
			
		}

		stage("Build"){
			steps {
				script {

					//sh "/usr/local/maven/bin/mvn clean package"
					sh "${buildTools["maven"]}/bin/mvn clean package"
				}
			}
		}
		stage("SonarScanForPlugin"){
            steps{
                script{
                    withSonarQubeEnv("sonarqube-1"){
                        def sonarDate = sh  returnStdout: true, script: 'date  +%Y%m%d%H%M%S'
                        sonarDate = sonarDate - "\n"

                        sh """ 
                                ${buildTools["sonar"]}/bin/sonar-scanner \
                                -Dsonar.projectKey=${JOB_NAME} \
                                -Dsonar.projectName=${JOB_NAME} \
                                -Dsonar.projectVersion=${sonarDate} \
                                -Dsonar.ws.timeout=30 \
                                -Dsonar.projectDescription="my test project" \
                                -Dsonar.links.homepage=http://www.baidu.com \
                                -Dsonar.sources=src \
                                -Dsonar.sourceEncoding=UTF-8 \
                                -Dsonar.java.binaries=target/classes \
                                -Dsonar.java.test.binaries=target/test-classes \
                                -Dsonar.java.surefire.report=target/surefire-reports  \
                                
                                #echo \$PATH
                           """
                    }
                }
            }
        }

		stage("UnitTest"){
			steps{
				script{
					sh "${buildTools["maven"]}/bin/mvn test"

				}
			}
			post {
				success {
					script{
						junit 'target/surefire-reports/*.xml'
					}
				}
			}
		}

	}

	post {
		always {
			script{
				echo "always......"

			}
		}

		success {
			script {
				echo "success....."
			}
		}
	}

}

关于jenkins job

jenkinsfile中用了参数化构建,先把这两个参数搞上了,另外新点的gitlab中分支都叫main了,不再是master了。也注意一下:

image.png
image.png

构建任务

构建完成发现一个问题:jenkins配置sonarqube服务器的过程中我写的集群内的内网地址。然后这样sonar的连接点开都无法跳转,所以我将sonarqube的服务器配置最后设置为了公网地址:

image.png
image.png
image.png

空白demo没有什么太大看的就先跑通一下。后续再整合看看怎么优化,因为自己的项目也都是聚合项目要看一下怎么去玩一下!

php项目

我其他的项目大部分是php了也扫描一下试试吧!这个仓库比较坑下面有7-8个子项目,我平时做的是参数化构建的。这里就摘出来一个做测试

image.png
image.png
def buildTools = ["maven": "/usr/local/maven/",
                 "sonar" : "/data/ci/buildtools/sonar-scanner/"]
pipeline {
    
	agent { label  "build01" }
	stages {
 		stage("GetCode"){
		    agent { label  "build01" }
			steps{
				script{
					println("下载代码 --> 分支: ${env.branchName}")
 					checkout([$class: 'GitSCM', branches: [[name: "${env.branchName}"]],
 							 doGenerateSubmoduleConfigurations: false, 
                             extensions: [[$class: 'CloneOption', depth: 1, noTags: false, reference: '', shallow: true]], 
                             submoduleCfg: [], 
 							 userRemoteConfigs: [[credentialsId: 'xxxxx', 
 							 url: "${env.gitHttpURL}"]]])
				}
			}
         }
		stage("SonarScanForPlugin"){
            agent { label  "build01" }
            when {
                environment name: 'xxxx', value: 'true'
            }		
            steps{
                script{
                    withSonarQubeEnv("sonarqube-1"){
                        def sonarDate = sh  returnStdout: true, script: 'date  +%Y%m%d%H%M%S'
                        sonarDate = sonarDate - "\n"

                        sh """   cd xxxx/html
                                ${buildTools["sonar"]}/bin/sonar-scanner \
                                -Dsonar.projectKey=${JOB_NAME}-xxxxx \
                                -Dsonar.projectName=${JOB_NAME}-xxxx \
                                -Dsonar.projectVersion=${sonarDate} \
                                -Dsonar.ws.timeout=30 \
								                 -Dsonar.language=php \
                                -Dsonar.projectDescription="my php project" \
                                -Dsonar.sources=. \
                                -Dsonar.sourceEncoding=UTF-8 \
                                
                                #echo \$PATH
                           """
                    }
                }
            }
        }       
        stage('docker build laya-maker') {
            agent { label  "build01" }
            when {
                environment name: 'xxxx', value: 'true'
            }
            steps {
                sh " cd laya-maker&&docker build -t ccr.ccs.tencentyun.com/xxxxx/xxxx:$data ."
                withCredentials([usernamePassword(credentialsId: 'xxxxx', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
                    sh "docker login -u ${dockerUser} -p ${dockerPassword} ccr.ccs.tencentyun.com"
                    sh "docker push ccr.ccs.tencentyun.com/xxxxx/xxxx:$data"
        }       
            }
            }

    }
}

运行基本就是下面这个样子:

image.png

有点懵逼哈哈哈。

image.png

看了一眼漏洞这样的基本都可以忽略。有时间研究一下怎么深入使用!

image.png

讲一下比较刺激的

扫了一下线上java仓库的代码,小伙伴都不加method = {RequestMethod.GET, RequestMethod.POST})这样的?,前段时间无聊看别人写的java代码 安全性来说 这不是规范吗......请原谅一下我们这些野生的.....看不下去了.......

image.png

总结:

本文着重于安装以及配置。实战要深入研究一下,也希望小伙伴能分享一下更多实战的例子让我学习一下......

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • 【技术创作101训练营】开源云原生持续交付平台简介

    大家好,今天,我们将一起来学习基于Spinnaker的持续交付实践,相信各位同学之前应该都听过Spinnaker吧,但是你实际上去部署的时候 肯定是很困难的,更...

    DevOps云学堂
  • 2021 年 25 大 DevOps 工具(上)

    DevOps 正在改变全球软件开发的状态,DevOps 正以某种形式有效地提高提高全球软件公司的上市速度、可销售性、创新和产品质量。

    陈琦聊测试
  • 解读与部署:基于 Kubernetes 的基础设施即代码

    在基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊中,我们使用一系列脚本,尽可能地对所有环境的安装和配置工作进行了自动化...

    灵雀云
  • 有赞持续集成容器化实践

    目前我厂 Jenkins CI 采用的是 Master-Slave 架构, Master 和 Slave 都是物理机搭建。主要用于跑单测,集成测试等。由于早期没...

    有赞coder
  • Happy Second Birthday Jenkins X!

    始于 2019 年初的 Jenkins X 项目在去年的1月14号庆祝了它的第一个生日,这对任何开源项目来说都是一件大事,我们刚刚又庆祝了它的第二个生日。

    LinuxSuRen
  • 构建基于Python的持续交付-附书单推荐

    在互联网行业高速发展的今天,掌握CI/CD已经成了加薪必不可少的技能了。要真正做到CI/CD,对于我们测试的要求是相当的高了,芒果在昨天一天的时间里就听了数次的...

    TestOps
  • 完整的 CI/CD 集合[教程]

    LinuxSuRen
  • 在 Kubernetes 上使用 Spinnaker 构建部署流水线

    Spinnaker 是一种持续交付平台,最初由 Netflix 开发,用于快速、可靠地发布软件更改。Spinnaker 使开发人员可以更轻松地专注于编写代码,而...

    我是阳明
  • Kubernetes搭建spinnaker服务

    2017-2018年左右的吧,不记得看什么了看到了spinnaker,但是当时真的安装不起来。各种被墙裂。2020年底学习了泽阳大佬的spinnaker实践课程...

    对你无可奈何
  • 2020年务必要了解的最好用的14款CI/CD工具

    企业正在朝着DevOps方法论和敏捷文化迈进,以加快交付速度并确保产品质量。在DevOps中,连续和自动化的交付周期是使快速可靠的交付成为可能的基础。

    Peter Shen
  • 在Kubernetes环境中采用Spinnaker的意义

    该博客的目的是帮助开发人员,架构师和商业从业人员了解采用Kubernetes环境时使用Spinnaker的重要性。您将了解:

    DevOps云学堂
  • 【云+社区年度征文】在Kubernetes环境中采用Spinnaker的意义

    Spinnaker是最初由Netflix设计和开发的开源多云连续交付工具。它有助于将应用程序部署到各种云提供商,例如Google Cloud Platform(...

    DevOps云学堂
  • 初试 Netflix 开源持续云交付平台 Spinnaker

    目录 Spinnaker 介绍 环境、软件准备 安装 Development Spinnaker 配置依赖环境 配置并安装 Spinnaker 演示 Spi...

    哎_小羊
  • 隆重介绍!CI/CD手下的开源界六大金刚

    Jenkins 2 image based on Red Hat Enterprise Linux的镜像

    魏新宇
  • ApacheCN DevOps 译文集(二)20211230 更新

    ApacheCN_飞龙
  • Docker搭建sonarqube

    SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量。同时 SonarQube 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集...

    对你无可奈何
  • 从零开始针对 .NET 应用的 DevOps 运营实践 - 运行环境搭建

    最近的一段时间,在公司里我都在进行基于 Jenkins 和 SonarQube 配合已有的 Gitlab 搭建部门的持续集成环境的工作,虽然之前有使用过 Git...

    梁规晓
  • 5步实现规模化的Kubernetes CI/CD 流水线

    在近几年,Kubernetes迅速成为了容器编排的事实上的开源标准。与虚拟机不同,Kubernetes在抽象化基础架构的同时可靠地大规模编排容器,这可以帮助开发...

    JFrog杰蛙科技
  • 6 张图带你搞懂 CI/CD 流水线

    在 CI/CD 和 DevOps 领域中,持续交付和持续部署是一个老生常谈的话题。持续集成这个术语最早是在1994年由 Grady Booch 提出。微服务提出...

    DevOps时代

扫码关注腾讯云开发者

领取腾讯云代金券