SonarQube + Artifactory 의 완벽한 자동화 파이프라인

이 글은 Fabrice Bellingard가 작성한 Fully Automated Promotion Pipelines with SonarQube and Artifactory를 번역한 글입니다.

이 블로그 포스트는 Jonathan Roquelaure(JFrog)과 Fabrice Bellingard(SonarSource)가 공동 작성했으며, JFrog blog에 최초로 게재하였습니다.

JFrog 웹사이트에 게제한 이전 포스트를 통해 Artifactory와 SonarQube를 연동하고, 더 높은 품질의 소프트웨어에 대한 결정을 내리는 데 활용할 수 있음을 설명했습니다. 기존 파이프라인에 간단한 스크립트를 추가하는 것만으로 손쉽게 Artifactory에 SonarQube를 통합할 수 있고, quality gate 만족 여부에 따라 이후의 파이프라인 진행 여부를 결정할 수 있습니다.

이게 전부일까요?

우리는 아티팩트들에 quality gate를 연결할 수 있습니다. 조금 더 생각해봅시다. 단순히 이를 Artifactory의 메타데이터 정보로 사용하는 대신, 이 데이터를 기초로 자동적으로 프로모션을 트리거링할 수 (혹은 하지 않을 수) 있을 것입니다 – 예를 들면, 다음 스테이지 페이즈에서 아티팩트들을 사용할 수 있도록 해당 아티팩트들을 복사하거나 이동시켜 두는 작업들이 될 수 있습니다. 모든 회사들은 각각 고유의 워크플로우를 가지고 있으며, 자동화된 프로모션을 위해 필요한 로직들을 구현할 수 있어야만 합니다.

또한 실제 프로젝트들은 복잡한 빌드 파이프라인으로 구성되어 있으며, 개발팀들은 가능한 빠른(Jez Humble과 Dave Farley가 Continuous Delivery 책에서 말한 것과 같은 커밋당 빌드를 수행하는 파이프리안과 같은) 피드백을 원합니다. SonarQube는 프로젝트를 분석해 quality gate 상태를 제공하기 위한 약간의 시간이 필요한데 Artifactory와 통합을 하는 과정에서 파이프라인을 블럭시키면 안됩니다: 또한 잠재적인 후속 작업들 역시 SonarQube의 분석 보고서 처리와 관련없이 동시에 수행되어야 합니다.

그럼, Artifactory와 SonarQube를 활용해 이제 파이프라인을 블로킹하지 않고, 커스터마이이제이션 가능한 자동화 된 솔루션을 만들어 보겠습니다. 바로 여러분이 최고 품질의 소프트웨어를 전달할 수 있도록 말입니다.

커스터마이제이션 가능한 자동화 된 통합

여러분은 이 단어들을 듣는 순간 웹훅(webhooks), API 및 사용자 플러그인들을 떠올릴 것입니다.

SoanrQube Webhooks

CI/CD 프로세스를 구성하는 많은 파이프라인 중 하나로, SonarQube는 웹훅(webhooks)을 사용해 다른 서비스들을 대상으로 분석 보고서 처리가 완료되었음을 알립니다. HTTPS 콜은 처리 태스크의 상태에 관계없이 생성되며, Artifactory의 사용자 플러그인은 이 콜의 페이로드에 담긴 많은 정보들을 활용해 지정된 아티팩트를 어떻게 처리할지 결정할 수 있습니다. 아래는 SonarQube 웹훅을 통해 전달되는 JSON 페이로드 예시입니다:

{ "analysedAt": "2016-11-18T10:46:28+0100", "project": { "key": "org.sonarqube:example", "name": "Example" }, "properties": { }, "qualityGate": { "conditions": [ { "errorThreshold": "1", "metric": "new_security_rating", "onLeakPeriod": true, "operator": "GREATER_THAN", "status": "OK", "value": "1" }, { "errorThreshold": "1", "metric": "new_reliability_rating", "onLeakPeriod": true, "operator": "GREATER_THAN", "status": "ERROR", "value": "1" }, ... ], "name": "SonarQube way", "status": "ERROR" }, "serverUrl": "http://localhost:9000", "status": "SUCCESS", "taskId": "AVh21JS2JepAEhwQ-b3u" }

지금 우리가 이야기하고 있는 컨텍스트에 해당하는 정보들을 추려보면 아래와 같습니다:

  • TaskId – Artifactory의 지정된 아티팩트를 식별하기 위해 사용합니다

  • quality gate status – 지정된 아티팩트의 프로모션 여부를 결정하기 위해 필요한 가장 중요한 정보입니다.

SonarQub의 웹훅은 프로젝트 단위(project settings 메뉴) 혹은 글로벌 레벨에서 설정할 수 있습니다. 대부분의 프로젝트를 SonarQube로 분석하고 Artifactory를 통해 관리하는 경우에는 글로벌 레벨에서 웹훅을 설정하는 것이 보다 편리할 것입니다.

Artifactory 사용자 플러그인

Artifactory Pro 및 Enterprise를 사용하면 Groovy 스크립트로 작성한 사용자 플러그인으로 손쉽게 Artifactory의 기능을 확장할 수 있습니다. 플러그인을 사용하면 정기적인 태스크(예. 클린업 등) 또는 특정한 이벤트와 연동된 사용자 정의 태스크(예: 다운로드 응답을 변경하거나 특정한 보안 정책을 변경하는 등)를 실행할 수 있는 것은 물론 새로운 API 엔드포인트를 노출시킬 수도 있습니다(예, SonarQube 웹훅을 기반으로 하는 특정한 워크플로우를 구현하는 등).

다음 코드 스닙펫을 볼까요?

executions { //Expose a new endpoint for sonarqube webhook updateSonarTaskStatus(httpMethod: 'POST', users: ["admin"], groups: [], params:[targetRepo: '']) { params, ResourceStreamHandle body -> targetRepo = getStringProperty(params, 'targetRepo', true) bodyJson = new JsonSlurper().parse(body.inputStream) sonarTaskId = bodyJson.taskId //Implement your workflow based on SonarQube quality gate result } }

위 코드를 통해 생성한 새로운 엔드포인트는 SonarQube 웹훅에서 아래 URL로 사용할 수 있습니다:

http://admin:password@<ARTIFACTORY_URL>:8081/artifactory/api/plugins/execute/updateSonarTaskStatus?params=targetRepo=gradle-staging-local

Jenkins 활용하기

우리는 Jenkins CI 서버에 커밋 빌드를 구현해 커미터에게 빠른 피드백을 제공하며, (이전 포스트에 기술했던 것 처럼) 소나큐브 분석(taskId)과 Artifactory 빌드 정보(및 관련 산출물)을 연결합니다.

전체적인 그림

Jenkins 서버에는 커밋 빌드가 매 커밋에 대한 빠른 피드백을 제공합니다(내가 작성한 코드가 공용 환경에서 빌드되었는지, 내 코드가 기존 소프트웨어를 망가뜨리지는 않았는지, 계속 코드를 작성해도 되는지 등).

커밋 빌드 워크플로우(commit build workflow)는 다음과 같습니다:

SonarQube의 quality gate 결과과 관련된 로직들은 두번째 “staging” 워크플로우에 구현되어 있습니다. 여기에서 여러분은 빌드를 계속 진행하거나(프로모트) 보다 높은 수준의 테스트, 통합, 배포 등을 수행하기 위해 외부 도구들을 트리거링 할 수 있습니다.

스테이징 워크플로우(staging workflow)는 다음과 같습니다:

시도해 보십시오

SonarSource와 JFrog의 협업이 결실을 맺고 있어서 매우 흥분됩니다. 이 통합 과정을 시도해보고 여러분이 느낀 것들을 알려주십시오. Integration GitHub project에 이슈를 생성해서 저희와 대화를 시작할 수 있습니다.

© 2017-2018 Moses Kim.

별도의 언급이 없는 한, 이 스페이스의 컨텐츠는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
SONARQUBE는 SonarSource SA의 트레이드 마크입니다. 모든 트레이트 마크 및 저작권은 각 소유자의 소유물입니다.

::: SonarQube 관련 문의 : 이메일 :::