[SonarQube] Webhook Additional parameters (소나큐브 비동기 호출 사용자 정의 파라미터 추가)

     

    OS : Window

    SonarQube Ver : sonarqube-8.9.10.6


    플로우를 간단하게 설명하면 다음과 같다.

     

    1.BE 서버에서 소나스캐너를 실행함

    2. 소나스캐너 호출이 완료되면 소나스캐너가 소나큐브 서버로 데이터를 보냄

    3. 소나큐브는 Webhook에서 설정한 BE 서버를 비동기 호출한다.

    4. 호출받은 BE 서버는 소나큐브 Payload를 가지고 이후 로직 처리 진행 

     

    내가 하고 싶었던 것 

    - 4번 절차에서 소나큐브의 응답받은 데이터를 DB 적재하고 싶음

    - 응답 데이터마다 각기 다른 컬럼에 적재되어야 하기 때문에 서비스단에서 분기 처리가 필요함

     

    그래서 어떻게 했는가

     

     

     

    결론 : 소나스캐너 파라미터를 이고지고 BE서버까지 가지고 오면 된다.

    즉, 1번 절차에서 소나스캐너를 실행하는 시점에 파라미터를 추가하여 4번 절차에서 꺼내서 쓰면 된다.

     

    소나스캐너 실행 명령어에 아래 예시와 같이 옵션을 추가하면 된다. (다건 가능)

    - Dsonar.analysis.Hello=world
    - Dsonar.analysis.todayIs=20231202
    

     

    이때, 소나큐브 Webhook Payload를 확인하면 다음과 같은 형식으로 나온다.

    {
        생략..
        "properties": {
             "sonar.analysis.Hello": "world",
             "sonar.analysis.todayIs": "20231202"
        },
        "qualityGate": {
           생략..
        }
    }

     

    이후 Endpoint에서 String 데이터를 JSON 형식으로 파싱 해서 서비스 로직에서 사용하면 된다.

     

    EndPoint 예시

    @RestController
    public class WebhookController {
    
        @PostMapping("/webhook")
        public void webhook(@RequestBody String resultFromSonarQube) {
            try {
                JSONParser jparser = new JSONParser();
                JSONObject jobj = (JSONObject) jparser.parse(resultFromSonarQube);
                
                JSONObject propertiesObj = (JSONObject) jobj.get("properties");
                String properties = propertiesObj.toString();
    
                // 파싱
                HashMap<String, Object> propInfo = new ObjectMapper().readValue(properties, HashMap.class);
    
                // 파라미터 추출
                String helloValue = (String) propInfo.get("sonar.analysis.Hello");
                String todayIsValue = (String) propInfo.get("sonar.analysis.todayIs");
    
                // 비즈니스 로직 시작 ...
    
            } catch (Exception e) {
                // 예외처리 
                e.printStackTrace();
            }
        }
    }

     


    출처 :

    Additional parameters

    A basic authentication mechanism is supported by providing user/password in the URL of the Webhook such as https://myLogin:myPassword@my_server/foo.

    If you provide additional properties to your SonarScanner using the pattern sonar.analysis.*, these properties will be automatically added to the section "properties" of the payload.

    For example these additional parameters:

    sonar-scanner -Dsonar.analysis.buildNumber=12345
    
    

    Would add this to the payload:

    "properties": {
      "sonar.analysis.buildNumber": "12345"
    }
    
    728x90

    댓글