[Gitlab] .gitlab-ci.yml 스크립트 작성 중급 (feat. stages, SonarQube, Jira)

2024. 10. 21. 23:24IT/Git

반응형

오늘은 저번에 이어 .gitlab-ci.yml 스크립트 작성을 진행해보자.
이번에는 stages, needs 를 활용한 깃랩 CI 스크립트이며,
소나큐브 코드 품질 분석과 그 결과물에 이슈가 있을 경우 지라 티켓 발행까지 하는 스크립트이다.

대부분의 내용을 스크립트의 주석을 달아두었으니, 충분히 이해하고 실행할 수 있을 것으로 보인다.



stages:
  - sonarqube_analysis # 1. 소나큐브 실행
  - create_jira_ticket # 2. 소나큐브 이슈 검출 시 지라 티켓 생성

sonarqube-check:
  stage: sonarqube_analysis
  tags:
    - sonarqube-test
  image: 
    name: sonarsource/sonar-scanner-cli:latest
    entrypoint: [""] 
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # 캐시 위치
    GIT_DEPTH: "0"  # 모든 브랜치를 가져옴
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script: 
    - sonar-scanner
  allow_failure: true
  rules: # 깃랩 master 브랜치에 MR 진행 시 소나큐브 동작하는 조건 
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'

create-jira-ticket:
  stage: create_jira_ticket
  tags:
    - sonarqube-test
  script:
    - |
      # 프로젝트 이름 정의 (필요에 따라 변경 가능)
      PROJECT_NAME="my_project_name"

      # SonarQube API를 사용하여 해당 프로젝트의 컴포넌트 키를 가져옵니다.
      COMPONENT_KEY=$(curl -s "http://localhost:9000/api/projects/search?projects=$PROJECT_NAME" | jq -r '.components[0].key')

      if [ -z "$COMPONENT_KEY" ]; then
        echo "프로젝트 $PROJECT_NAME 의 컴포넌트 키를 찾을 수 없습니다."
        exit 1
      fi

      echo "프로젝트 컴포넌트 키: $COMPONENT_KEY"

      # SonarQube API로부터 BLOCKER와 CRITICAL 이슈를 가져옵니다.
      ISSUES=$(curl -s "http://localhost:9000/api/issues/search?pageSize=500&componentKeys=$COMPONENT_KEY&severities=BLOCKER,CRITICAL&types=BUG,VULNERABILITY")

      # 가져온 이슈가 있는지 확인합니다. 리눅스 환경에 jq 툴이 설치되어 있어야 한다. 모르면 구글링 ㄱㄱ
      ISSUE_COUNT=$(echo $ISSUES | jq '.total')

      if [ "$ISSUE_COUNT" -gt 0 ]; then
        echo "$ISSUE_COUNT 건의 Blocker 및 Critical 이슈가 발견되었습니다. 개별 지라 티켓을 생성합니다."
        
        # 각 이슈에 대해 개별 티켓 생성. jq 라는 툴은 json 결과물을 파싱하고 가공할 수 있는 강력한 툴이다.
        echo $ISSUES | jq -c '.issues[]' | while read issue; do
          MESSAGE=$(echo $issue | jq -r '.message')
          SEVERITY=$(echo $issue | jq -r '.severity')
          COMPONENT=$(echo $issue | jq -r '.component')
          LINE=$(echo $issue | jq -r '.line')

          # 각 이슈에 대해 Jira 티켓 생성. curl 로 지라 API 실행하여 티켓 생성을 하자.
          curl -X POST \
          -H "Authorization: Bearer <key>" \
          -H "Content-Type: application/json" \
          -d '{
              "fields": {
                "project": {"key": "<key>"},
                "summary": "'[$SEVERITY] $MESSAGE (컴포넌트: $COMPONENT, 라인: $LINE)'",
                "description": "Detected $SEVERITY issue:\nMessage: '"$MESSAGE"'\nSeverity: '"$SEVERITY"'\nComponent: '"$COMPONENT"'\nLine: '"$LINE"'",
                "issuetype": {"id": 10004} # 지라 프로젝트에서 지원하는 이슈 타입에 대한 정수(integer) 코드를 넣어야 한다.
              }
            }' \
          https://your-jira-instance/rest/api/2/issue

        done
      else
        echo "Blocker 또는 Critical 이슈가 없습니다. 지라 티켓을 생성하지 않습니다."
      fi
  only:
    - master

반응형