与青藤云官方提供的部署方法不一样,区别于官方在Jenkins主机上起一个扫描pod的方法,我们使用的是耦合性更小,更易排查问题的,
使用pipeline在k8s集群中起docker容器,在docker容器中起扫描pod的方法
听起来很麻烦,但是它的优点在于极少改变pipeline,并且便于排查故障。
效果图
准备:
k8s集群,Jenkins发版平台,将青藤云的扫描镜像拉取到自己的镜像仓库,Jenkins主机节点能访问青藤云平台的8244和8443端口
PS:之前没有理解这个服务端是什么,是部署好的青藤云平台服务端
在Jenkins的构建任务中执行镜像扫描
1.在pipeline中添加镜像扫描的步骤(pipeline是存储在gitlab)
stage('Image scan') {
steps {
container(name: 'docker') {
echo "这是执行镜像扫描的步骤"
script{
echo "定义变量res,将镜像扫描的结果(是否进行阻断)赋值给改变量,如果命中阻断规则,res为非0的值"
echo "以下是扫描指令举例,用户需根据自己的需求进行修改"
sh """
docker run -i --rm -v /root/report:/root -v /etc/machine-id:/etc/machine-id -v /tmp:/tmp -v /var/lib/docker:/var/lib/docker -v /var/run/docker.sock:/var/run/docker.sock --network=host 镜像仓库中镜像位置 scan --comid=xxx --server-host=xxx --htmlfile=/root/sec-report.html --jsonfile=/root/output.json --log-level=debug ${HARBOR_ADDRESS}/${REGISTRY_DIR}/${IMAGE_NAME}:${TAG}
"""
sh "mkdir /home/jenkins/agent/workspace/${JOB_NAME}/report"
sh "cp /root/report/sec-report.html /root/report/output.json /home/jenkins/agent/workspace/${JOB_NAME}/report"
echo "该指令将扫描结果导出到artifacts中"
archiveArtifacts artifacts: 'report/sec-report.html', followSymlinks: false
sh "find / -name sec-report.html"
echo "【可选指令】如果安装了html report插件,该指令将扫描结果上传到插件,可直接在插件中查看结果"
publishHTML([allowMissing: true, alwaysLinkToLastBuild: false, keepAll: true, reportDir: 'report/', reportFiles: 'sec-report.html', reportName: 'HTML Report', reportTitles: "${env.BUILD_NUMBER}"])
}
}
}
}
2.挂载容器中的容器的目录,因为是容器中起容器,将报告映射出来有点麻烦,先将容器A中的容器B映射到主机目录,再将主机目录挂到容器A
在容器A中挂载
- hostPath:
path: "/root/report"
name: "volume-report"
制作挂载目录
- mountPath: "/root/report"
name: "volume-report"
readOnly: false