linux - 从 gitlab docker runner 启动 Sonar Scanner

标签 linux docker sonarqube gitlab-ci sonarscanner

我有一个集成了 linting 作业和代码质量作业的 CI 工作流程。我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本。然后我的代码质量工作应该启动一个 Sonar 扫描器 docker 实例,检查我的代码并将报告发送回我的 sonarqube 实例。

问题主要在于我无法使用以下任一解决方案正确启动 Sonar 扫描仪:

Sonar 扫描器 Docker https://github.com/newtmitch/docker-sonar-scanner
在这一点上,运行者运行图像但是当启动它的脚本时(它只是 sonar-scanner(带有潜在参数) 我得到这个错误响应:

sonar scanner unrecognized option -c

我不明白也无法控制,因为它是从 docker hub 中提取的已经制作好的 docker 镜像

在 docker 容器中从头开始安装 Sonar Scanner
在这里,我所做的是通过将其下载到容器中来安装 Sonar 扫描仪,如下所示:

Dockerfile

FROM java:alpine  
ENV SONAR_SCANNER_VERSION 3.3.0.1492

RUN apk add --no-cache wget && \  
    wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux.zip && \  
    unzip sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux && \  
    cd /usr/bin && ln -s /sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux/bin/sonar-scanner sonar-scanner && \  
    apk del wget

COPY sonar-scanner-run.sh /usr/bin
RUN ["chmod", "+x", "/usr/bin/sonar-scanner-run.sh"]

我在这里添加了 wget 以便能够下载文件,然后我从他们的官方 documentation 上找到的链接下载最新版本的 Sonar 扫描仪。 .然后我解压缩它,然后创建一个指向二进制文件的符号链接(symbolic link),这样我就可以从任何地方执行脚本。我终于清除了 wget 缓存,复制了我将从 gitlab-ci.yml 执行的 shell 脚本,并运行 chmod 命令来绕过任何权限问题。

sonar-scanner-run.sh

URL="https://mysonarqubeserver"
USER="myusertoken"
SONAR_PROJECT_KEY="myprojectkey"


COMMAND="sonar-scanner -Dsonar.host.url=\"$URL\" -Dsonar.login=\"$USER\" -Dsonar.projectKey=\"$SONAR_PROJECT_KEY\""

eval $COMMAND

环境变量都是sonarqube在你创建工程后给定的。

这里我有一个我认为是“Linux 问题”的地方,因为我在 gitlab ci 日志中收到此错误代码,所以我的符号链接(symbolic link)没有创建:

Unkown command sonar-scanner

编辑 符号链接(symbolic link)现在可以使用(问题是解压缩的文件夹名称不正确),但会弹出另一条消息。 Sonar 扫描仪现在可以正常工作了,这里是错误:

INFO: ------------- Run sensors on module mytherapy
INFO: Load metrics repository
INFO: Load metrics repository (done) | time=121ms
INFO: Sensor JavaSquidSensor [java]
INFO: Configured Java source version (sonar.java.source): none
INFO: JavaClasspath initialization
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 14.285s
ERROR: Error during SonarQube Scanner execution
INFO: Final Memory: 25M/284M
INFO: ------------------------------------------------------------------------
ERROR: Please provide compiled classes of your project with sonar.java.binaries property

我的项目是一个 react-native,因此是 javascript 项目。我不明白为什么它需要 java 编译类

这是我的 gitlab-ci.yml 文件,以防出现问题:

gitlab.ci.yml

cache:
  paths:
  - node_modules/

stages:
  - analysis
  - test

lint:
  stage: analysis
  image: "node:latest"  
  script: npm i && npm run lint
  tags: ["nodejs"]

code quality:
  stage: analysis
  image: <My image from the registry>
  script: 
    - /usr/bin/sonar-scanner-run.sh
pass tests:
  stage: test
  image: "node:latest"
  script: npm i && npm run test
  tags: ["nodejs"]

最佳答案

经过进一步调查,我可以说我为 Sonar 扫描仪制作了一个可以与 gitlab ci 一起工作的工作 docker 图像。

DOCKERFILE

FROM openjdk:8

LABEL maintainer="Aria Groult <aria.groult@outlook.fr>"

RUN apt-get update
RUN apt-get install -y curl git tmux htop maven sudo

# Install Node - allows for scanning of Typescript
RUN curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
RUN sudo apt-get install -y nodejs build-essential

WORKDIR /usr/src

RUN curl --insecure -o ./sonarscanner.zip -L https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip && \
    unzip sonarscanner.zip && \
    rm sonarscanner.zip && \
    mv sonar-scanner-3.0.3.778-linux /usr/lib/sonar-scanner && \
  ln -s /usr/lib/sonar-scanner/bin/sonar-scanner /usr/local/bin/sonar-scanner

ENV SONAR_RUNNER_HOME=/usr/lib/sonar-scanner
COPY sonar-scanner-run.sh /usr/bin
RUN ["chmod", "+x", "/usr/bin/sonar-scanner-run.sh"]

Sonar 扫描仪中的嵌入式 JRE 可能会出现问题。如果发生这种情况,请通过将 useembeddedjava 设置为 false 来修改二进制文件。

gitlab-ci.yml & sonar-scanner-run.sh 不变

sonar-project.properties

sonar.projectKey=projectkey
sonar.projectName=projectname
sonar.sourceEncoding=UTF-8
sonar.exclusions=node_modules/**,coverage/**
sonar.sources=./components
sonar.gitlab.project_id=linkToGit
sonar.host.url=hosturl
sonar.login=sonarqubeloginkey
sonar.exclusions=test/**, node_modules/**

重要的是要指定 node_modules 被排除在 nodejs 项目中,因为它们包含一些 java 文件,这些文件会在 sonar-scanner 进程中造成一些困惑。通常只在 Sonar 扫描仪文件列表中包含未生成的文件

关于linux - 从 gitlab docker runner 启动 Sonar Scanner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56251725/

相关文章:

php - 如何使用 php exec() 在 Linux 中执行命令并将输出绑定(bind)到数组?

php - 未创建 Wordpress 图像缩略图

docker - 保存 Dockerfile ENV 变量以供将来使用

grails - Grails/groovy项目的静态代码分析

configuration - 在 Sonar 上配置小部件不起作用

java - eclipse 中的 Sonarlint 规则集文件在哪里?

linux - 我在/proc文件系统中找不到 'fdinfo'

linux - 'output to stdout'是什么意思

Docker 撰写 : volumes without colon (:)

java - Wasabi自动重启docker容器