어떻게 코드의 품질을 강제적으로 통제합니까

3547 단어 jenkins

배경


이전의 글에서 우리는 JENkins와sonarqube가 어떻게 집적되었는지 묘사했다. 오늘 우리는 이 글에서 어떻게gerrit+JENkins+sonar를 사용하여 코드 품질 관리를 하는지를 묘사했다.주로sonarqube에서 코드를 분석하는 능력을 이용하여 통제한다.
일반적인 절차는 개발자가 코드를 제출하기만 하면 자동으로 CI/CD를 터치하여 컴파일 결과에 따라 코드가merge에 들어갈 수 있는지 판단하는 것이다.코드의 질은 통제할 수 없다.그렇다면 우리는 어떻게 통제할 것인가?전체적으로 다음과 같은 절차를 채택한다.gerrit 제출 코드 -->jenkins job--->컴파일한 후sonar 보고서를 업로드한다-->shell 스크립트가sonar의 API를 호출하여 관건적인 품질 데이터를 얻어 조건 충족 여부를 판단한다-->jenkins는 실행 결과를gerrit-->jenkins의 반환 결과에 따라merge 코드 여부를 판단한다.
2. 구체적 실현
이 간단한 절차에서 가장 기본적인 것은gerrit와 Jenkins의 통합과sonarqube 보고서를 어떻게 업로드하는가이다.물론 본고는 어떻게 집적해야 하는지를 설명하는 것이 아니다. 본고는 주로 셸 스크립트를 어떻게 써야 하는지를 설명한다.
전체 셸 스크립트는 다음 세 단계로 나눌 수 있습니다.
  • sonar보고서가 업로드에 성공했다고 판단하여 이번에 대응하는sonar보고서를 제출할 것을 보증합니다
  • curl 명령으로api를 호출하여 관건적인 품질 데이터를 얻기
  • 품질 데이터에 따라 서로 다른 값을 반환하고 1을 반환하면 품질이 관문을 통과하지 못한다는 것을 의미하며 JENkins job도 실패하고 JENkins는gerrit에게 -1 조작을 반환한다.0 반환은 품질 통과를 의미하며, JENkins job은 성공 상태이며, JENkins는gerrit에게 +1 조작
  • 을 반환합니다.
    뒤에 첫 번째 단계를 빼는 것을 고려한다. 왜냐하면 각 팀들이 주목하는 품질 지표가 다를 수 있지만 각 스크립트는 첫 번째 단계를 수행해야 하기 때문이다.그래서 두 개의 스크립트가 생겼습니다:sonarCheckStatus.sh、sonarCheckQuality.sh; 
    첫 번째sonarCheckStatus.sh의 구체적인 실현은 다음과 같다.
    #!/bin/bash
    
    #set -ox
    
    projectName=$1
    url="$SONAR_address"
    
    function getStatus(){
        urls=$url'api/ce/component?component='$projectName;
        flag=12;
        while [ $flag -gt 5  ]
        do
            result=`curl -k -X GET $urls`;
            #if sonar project is private
            #result=`curl -k -u $username:$password -X GET $urls`;
            analyze=`echo $result | awk -F : '{print $11}' | awk -F '"' '{print $2}' `;
            if [ "$analyze" == "SUCCESS" ];then
              echo "sonarqube report analyze successfully!!!!! Please execute check script"  
              break;
            fi
            echo "report is analyzing!!! sleep 20 seconds and scanning again"
        sleep 20;
        ((flag--));
        done
      if [ $flag -le 5 ];then
        echo "Don't get the analysis result, please adjust the value of flag or check url & projectName"
        return 1;
      fi
    }
    
    getStatus

    이 스크립트는 일반적인sonarqube분석 프로젝트를 분석할 때 2분을 넘지 않기 때문에 매번sonar의api를 호출하여 보고서의 업데이트 여부를 판단하고 업데이트되면 0으로 되돌아간다. 만약sonar가 보고서를 분석하고 있다면 20초 동안 수면한 후에 이 API를 계속 호출하고 120초도 성공하지 못하면 스크립트는 -1로 되돌아간다. Jenkinsjob은 실패한다.
    2단계sonarCoverageCheck.sh 스크립트도 비슷한 사상이지만 첫 번째 단계에 비해 더욱 복잡하다. 왜냐하면 부동점수의 비교가 있기 때문이다.이 셸 스크립트를 원하시는 분은 댓글이나 사적인 대화를 남겨도 됩니다.
    기타
    1.python 스크립트가 아닌 셸 스크립트를 사용하는 이유는 무엇입니까?
    처음에 모든 linux 시스템은 셸 스크립트를 직접 사용할 수 있기 때문에,python 스크립트는 수동으로python을 설치해야 하기 때문에, 최소한의 영향을 고려하여 셸을 선택해야 한다.그런데 사실 지금의 시스템은 자동으로 파이톤을 설치하는 거예요.7. 모두 자신이 할 수 있는 언어를 선택하면 된다.
    2.sonarqube의 보고서가 pending 상태에 있어서 스크립트가 -1로 되돌아오고 코드가merge에 들어갈 수 없습니다
    이 문제는sonarqube 자체로 인해sonarqube의 임무 집행은 단일 대기열의 형식으로 임무가 막힐 때 다른 임무를 블로킹한다.코드가merge가 되지 않는 것은 JENkins가gerrit에게 -1을 되돌려주었기 때문이다. 개발 학생들은 -1을 본 후에 코드를 주 지점으로 합병하는 것에 동의하지 않을 것이다.(gerrit에서도 설정할 수 있다. Jenkins가 -1을 되돌려주면 누구도merge 코드를 사용할 수 없다)
    3. 스크립트는 어디에 두어야 하는가
    스크립트는 Jenkins job에 놓여 있으며, 스크립트가 1 또는 0으로 되돌아와 Jenkins job의 상태를 제어하고gerrit에 대응하는 상태 코드를 되돌려줍니다
    4. 프로세스의 장점과 단점은 이 프로세스가 전체적으로 품질 관리와 제어의 수요를 만족시키고 관건적인 품질 데이터에 대해 체크포인트를 할 수 있다는 것이다.그리고 너무 많은 추가 의존이 필요하지 않다는 단점은sonarqube의 능력을 통해 품질을 관리하기 때문에sonarqube의 상태에 의존해야 하기 때문에sonar에 이상이 생기면 이 절차가 정상적으로 작동하지 못한다는 것이다.그리고 셸 스크립트를 완성하고 관리하는 데 추가 비용이 필요합니다
    위챗 공식 계정: DevOps 시작 안내서
    여러분 위챗 공중번호를 주목해 주세요!또한 devops/ci/cd와 관련된 화제 토론과 문제 해결 방안을 위한 위챗 그룹을 새로 만들었다.관심 있으시면 위챗:crazyboy-smile

    좋은 웹페이지 즐겨찾기