[Gitlab] .gitlab-ci.yml 스크립트 작성 중급 (feat. stages, SonarQube, Jira)
2024. 10. 21. 23:24ㆍIT/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
반응형