3
64 Embedded World www.embeddedworld.co.kr 65 UEST ARTICLE G 적용예시: Jenkins와 PRQA 도구 Part 1 : CI System인 Jenkins 최근 조사에 따르면 무료 또는 상용화된 CI 도 구 중 Jenkins는 가장 유명한 도구로 알려지고 있다. Jenkins는 Hudson CI 시스템이 전신이며, Jenkins를 통해 가장 Active한 시스템을 갖출 수 있었다. Jenkins는 MIT 라이선스에 따라 무료로 사용가 능하며, 다른 오픈 소스와 마찬가지로 기술지원 을 받을 수 있는 유료버전도 있다. 물론 Jenkins 는 오픈 소스 프로젝트이지만 핵심 코드에 대해 서는 핵심 인원만 관리를 하고 있으며 프로그램 설계자인 코슈케카와구치가 그 중 한 인물이다. 시스템 개요 Jenkins는 Java 언어로 작성되었으며, 작은 코 어와 Built-in 웹 서버로 구성되어 있다. Jenkins 를 사용하는 대부분의 사용자는 웹 브라우저에 서 사용이 가능하며 클라이언트 PC에 설치해야 할 SW는 없다. 좋은 CI 시스템의 중요한 특성 중 하나는 어떤 기 업이든지 비즈니스 요구사항을 충족할 수 있도록 유연하게 변경 가능하다는 점이다. Jenkins는 커스 터마이징이 가능하고 확장성을 가질 수 있는 중요 한 2가지 아키텍처 특성을 가지고 있는데 Master/ Slave 두 개로 나눠지는 Build 아키텍처와 Plugin 이다. Master / Slave 아키텍처 Jenkins는 물론 보통은 Master와 Slave로 설정되 지만 PC 한대에서 운용이 가능하다. 코드가 Build 혹은 테스트가 된 후에 Master는 그것을 관리하 고 사용자와 인터페이스를 제공한다. Jenkins에 서 각 작업은 ‘Job’이라고 부른다. 하나 또는 그 이상의 Slave는 실제 Build와 테스트를 수행한다. Build 과정(최종 바이너리 코드, 패키지, 테스트 결과 등등)에서 중요한 결과는 Slave에서 Master 로 옮겨져 저장된다. 오브젝트 파일과 같은 중간 파일은 Slave에 남겨진다. (그리고 주기적으로 삭 제된다.) Master는 모든 Build의 결과를 기록하고 추적성을 확보한다. Slave 머신은 특별한 것이 아니다. 개발과 테스 트 도구가 설치되어 있는 상용화된 보통의 PC다. Slave 머신은 Master와는 다른 운영체제에서 실 행할 수 있다. 여러 개 플랫폼에서 작성된 코드일 경우 중요하다. 또한 Slave는 하드웨어에 직접 연 결할 수 있어 임베디드 코드와 같은 경우 실제 장 비에서 다운로드 받고 테스트 할 수 있다. Slave 는 반드시 물리적 장치가 있어야 하는 것은 아니 다. 가상 머신이 점차 활용되며 클라우드 기반 솔 루션은 점차 효과적인 옵션으로 되어가고 있다. 플러그인 Jenkins에서 실행되는 대부분의 작업들은 플러 그인에서 실행된다. Jenkins 코어는 플러그인 설 코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2 지난 호에서는 SW 공학에 있어 지속적인 통합(Continuous Integration)의 개념과 원리에 대해 알아보았다. SW 개발 주기 를 어떻게 간소화하고 정적 분석이 어떻게 적용되는지에 대해 설명하였다면 이번 호에서는 특정 도구를 통해 실제로 어떻 게 적용되는지 알아보겠다. Jenkins CI와 PRQA의 정적 분석 도구들(QA•C, QA•C++ and QA•Verify)을 이용하여 이 도 구들이 어떻게 통합이 되고 어떤 정보를 생성하는지 알아볼 예정이다. 원저 : Programming Research Ltd. / Jason Masters, R&D Director 번역 : 김관식 / MDS테크놀로지 코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)–Vol. 2 그림 4. Jekins 대쉬보드 오른쪽은 모든 작업의 목록을 보여준다. 왼쪽 아래는 Slave Machine의 목록을 보여주며, 이는 빌드 상태이다.

코드 품질을 높이기 위한 정적 분석과 지속적인 … World_1405... 69 코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2 68 Embedded

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 코드 품질을 높이기 위한 정적 분석과 지속적인 … World_1405... 69 코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2 68 Embedded

64 Embedded World www.embeddedworld.co.kr 65

UEST ARTICLEG

적용예시: Jenkins와 PRQA 도구

Part 1 : CI System인 Jenkins

최근 조사에 따르면 무료 또는 상용화된 CI 도

구 중 Jenkins는 가장 유명한 도구로 알려지고

있다. Jenkins는 Hudson CI 시스템이 전신이며,

Jenkins를 통해 가장 Active한 시스템을 갖출 수

있었다.

Jenkins는 MIT 라이선스에 따라 무료로 사용가

능하며, 다른 오픈 소스와 마찬가지로 기술지원

을 받을 수 있는 유료버전도 있다. 물론 Jenkins

는 오픈 소스 프로젝트이지만 핵심 코드에 대해

서는 핵심 인원만 관리를 하고 있으며 프로그램

설계자인 코슈케카와구치가 그 중 한 인물이다.

시스템 개요

Jenkins는 Java 언어로 작성되었으며, 작은 코

어와 Built-in 웹 서버로 구성되어 있다. Jenkins

를 사용하는 대부분의 사용자는 웹 브라우저에

서 사용이 가능하며 클라이언트 PC에 설치해야

할 SW는 없다.

좋은 CI 시스템의 중요한 특성 중 하나는 어떤 기

업이든지 비즈니스 요구사항을 충족할 수 있도록

유연하게 변경 가능하다는 점이다. Jenkins는 커스

터마이징이 가능하고 확장성을 가질 수 있는 중요

한 2가지 아키텍처 특성을 가지고 있는데 Master/

Slave 두 개로 나눠지는 Build 아키텍처와 Plugin

이다.

Master / Slave 아키텍처

Jenkins는 물론 보통은 Master와 Slave로 설정되

지만 PC 한대에서 운용이 가능하다. 코드가 Build

혹은 테스트가 된 후에 Master는 그것을 관리하

고 사용자와 인터페이스를 제공한다. Jenkins에

서 각 작업은 ‘Job’이라고 부른다. 하나 또는 그

이상의 Slave는 실제 Build와 테스트를 수행한다.

Build 과정(최종 바이너리 코드, 패키지, 테스트

결과 등등)에서 중요한 결과는 Slave에서 Master

로 옮겨져 저장된다. 오브젝트 파일과 같은 중간

파일은 Slave에 남겨진다. (그리고 주기적으로 삭

제된다.) Master는 모든 Build의 결과를 기록하고

추적성을 확보한다.

Slave 머신은 특별한 것이 아니다. 개발과 테스

트 도구가 설치되어 있는 상용화된 보통의 PC다.

Slave 머신은 Master와는 다른 운영체제에서 실

행할 수 있다. 여러 개 플랫폼에서 작성된 코드일

경우 중요하다. 또한 Slave는 하드웨어에 직접 연

결할 수 있어 임베디드 코드와 같은 경우 실제 장

비에서 다운로드 받고 테스트 할 수 있다. Slave

는 반드시 물리적 장치가 있어야 하는 것은 아니

다. 가상 머신이 점차 활용되며 클라우드 기반 솔

루션은 점차 효과적인 옵션으로 되어가고 있다.

플러그인

Jenkins에서 실행되는 대부분의 작업들은 플러

그인에서 실행된다. Jenkins 코어는 플러그인 설

코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2

지난 호에서는 SW 공학에 있어 지속적인 통합(Continuous Integration)의 개념과 원리에 대해 알아보았다. SW 개발 주기

를 어떻게 간소화하고 정적 분석이 어떻게 적용되는지에 대해 설명하였다면 이번 호에서는 특정 도구를 통해 실제로 어떻

게 적용되는지 알아보겠다. Jenkins CI와 PRQA의 정적 분석 도구들(QA•C, QA•C++ and QA•Verify)을 이용하여 이 도

구들이 어떻게 통합이 되고 어떤 정보를 생성하는지 알아볼 예정이다.

원저 : Programming Research Ltd. / Jason Masters, R&D Director

번역 : 김관식 / MDS테크놀로지

코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)–Vol. 2

그림 4. Jekins 대쉬보드 오른쪽은 모든 작업의 목록을 보여준다.

왼쪽 아래는 Slave Machine의 목록을 보여주며, 이는 빌드 상태이다.

Page 2: 코드 품질을 높이기 위한 정적 분석과 지속적인 … World_1405... 69 코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2 68 Embedded

www.embeddedworld.co.kr 67

코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2

66 Embedded World

UEST ARTICLEG

치 후 GUI에서 설정하고 사용자가 원하는 시점에

서 설치한 플러그인이 실행할 수 있게 API 정리

가 잘 되어 있다.

800개가 넘는 플러그인이 존재하며 버전관리시

스템, 코드 Build, 테스트, 리포트 그리고 관리를

할 수 있게 해준다. 관련 있는 플러그 인을 설치

함으로써 Jenkins는 프로젝트 Build와 테스트 요

구사항에 맞게 바뀔 수 있는 것이다.

대쉬보드

Jenkins는 모든 작업(job)의 경과를 보여주는 대

쉬보드가 있다. 각 작업(job)의 상태는 점 형태로

보여주며 점의 색깔이 마지막 실행의 상태를 나

타낸다. (기본설정은 빨간색은 실패, 노란색은 불

안정, 푸른색은 성공을 의미한다. Jenkins의 가장

큰 특징으로 이것 또한 변경 가능하다.)

깜박이는 점은 현재 작업(job)이 Build 되고 있는

것을 나타낸다. 태양이나 폭풍우를 나타내는 날

씨 심볼은 최근 Build 과정의 결과를 시각적으로

보여주는 것이다.

Dashboard는 Build를 기다리는 작업 목록의 대

기상태를 보여준다. 또한 어떤 작업이 대기상태

인지 어떤 작업을 실행중인지를 알 수 있는 Slave

의 상태도 보여준다. 그림 4는 Jenkins의대쉬보

드를 나타낸다.

작업(Jobs)

작업은 3개의 단계로 나눌 수 있다.

1. 선Build 단계 : 저장소에서 가장 최신의 코드를

Check-out하며, 보통 정해진 시간 또는 다른

일이 끝난 후 저장소에 Check-in된 코드가 있

는지 확인하는 것으로 시작한다.

2. Build 단계 :이 단계는 컴파일, 링크부터 테스트

실행까지 대부분의 작업이 실행되는 단계이다.

Jenkins는 디버깅을 쉽게 하기 위해 모든 콘솔

명령어를 출력하며 추적한다.

3. 후Build 단계 : 이 단계는 Build된 코드를 테스

트 하는 이후의 단계를 포함하고 있다. 결과를

수집하고대쉬보드에 출력하기 위해 분석하며

필요한 정보들은 Master로 보낸다.

Build와 후 Build 단계는 Build와 테스트의 요구사

항과 어떤 플러그인이 설치됐느냐에 따라 0개 또

는 그 보다 많은 실행과정을 가지고 있다.

간단한 작업은 아래와 같은 설정으로 구성될 수

있다.

1. 선 Build : 버전관리시스템 어플리케이션, 저장

소의 경로 그리고 모듈 이름

2. Build: make 명령어를 포함하여 실행명령어

순서

3. 후 Build: Build 단계에서 실행한 내용들을 수

집 및 분석

작업이 수행되면 Jenkins는 저장소에서 가장 최

신 코드를 Check-out해오며, make 명령 실행 후

실행 결과물을 master에 복사한다. 만약 실행과

정 중 실패하면 그 이후의 과정은 작동되지 않고

그 작업은 실패상태로 설정된다.

모든 과정이 error없이 완료되어야 성공상태로 설

정된다. 위에서 설명한 간단한 단계에서 Jenkins

의 실행은 밤(night)에 Build하게 설정하여 사용

할 수 있다.

시작하기

Jenkins를 시작하는 것은 매우 간단하다. 웹 어플

리케이션으로 바로 실행 가능한 압축파일을 설치

하면 된다. 압축파일은 간단하게 다운받고 실행

하면 된다. 설치과정이 끝나면 사용자권한을 얻

으며 서비스 / 데몬에 설정된다.

Part 2: PRQA Jenkins 플러그인을 이용한

정적 분석

PRQA는 정적 분석 도구인 제품인 QAC/QAC++

으로 코드를 분석할 수 있게 Jenkins 플러그인을

개발했다. 이 플러그인은 후 Build단계에서 자동

적으로 실행된다.

1. 프로젝트 분석

2. 코딩규칙 만족 결과 리포트 생성

3. 분석한 프로젝트의 코딩 규칙 위반사항 개수와

설정된 위반사항 개수를 비교하여 그 값이 설

정된 값보다 넘어서면 Build 상태를 불안정 상

태로 설정한다. 이것은 뒤따라 오는 과정들을

멈추는 데 사용할 수 있다.

4. 추가적으로 웹 기반 소프트웨어 품질 관리 시

스템인 QA•Verify에 분석 결과를 업로드 할

수 있다.

분석은 Dependency 모드로 실행할 수 있다. 이

는 지난 분석과 비교하여 변경된 코드에 대해서

만 분석하여 분석시간을 가능한 줄이는 방법이

다. 또한 Build 단계에서 분석이 가능하며 (예를

들어 Makefile Integration을 사용한다면) 플러그

인은 어떤 파일이 분석이 되었는지에 대한 정보

를 받는다. 웹 페이지에서의 플러그인 결과 정보

는 그림 5와 같다.

코딩 규칙 만족 그래프와 Build당 위반사항 그래

프를 그려준다. 이 그래프를 통해 코딩 규칙 위

반사항의 개수의 변화를 쉽게 확인할 수 있다.

Compliance Summary 테이블은 프로젝트와 파

그림 5.

Page 3: 코드 품질을 높이기 위한 정적 분석과 지속적인 … World_1405... 69 코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2 68 Embedded

www.embeddedworld.co.kr 69

코드 품질을 높이기 위한 정적 분석과 지속적인 통합(CI)- Vol. 2

68 Embedded World

UEST ARTICLEG

일 별 코딩 규칙 만족 정도와 전체 위반사항의

개수를 나타낸다. (코딩규칙을 지키지 않은 정도

와 다른 자세한 정보는 QAC / QAC++에서 제공

하는 리포트 프로그램으로부터 얻은 결과이다.)

두 번째 테이블은 코딩규칙 레벨 별 위반사항의

개수를 나타낸다. 플러그 인은 프로젝트의 코딩

규칙 만족 정도를 나타내는 모든 리포트들을 자

동으로 정리한다.

코딩 규칙 위반사항 개수의 경계 값은 절대값으

로 설정되어야 한다. 예로 0은 위반사항이 하나도

없어야 한다는 의미이다. 게다가 위반사항 레벨

별로 경계 값을 설정할 수 있어, 코딩규칙 위험정

도에 따라 설정될 수 있다는 의미이다. 유지보수

나 스타일 가이드와 같은 코딩 규칙에 대한 위반

사항은 통과지만, 버그와 같은 오류를 가지는 코

드는 실패 상태로 남길 수 있는 것이다.

강력한 기능 중 하나는 QAC 분석 결과를 QA·Verify

에 업로드 할 수 있다는 것이다. 개발자들이 위반사

항의 내용이 포함된 분석 결과를 면밀히 검토할 수

있으며, 정확하게 코딩 규칙 위반사항 위치를 확인

할 수 있다. 검출된 위반사항에 대해 제거(devia-

tion)할 수 있으며 MISRA C와 같은 코딩 규칙을

만족한 것을 증명할 리포트관리를 할 수 있다.

QA·Verify는 프로젝트의 품질을 관련자(관리자

또는 고객)들에게 정보를 제공할 수 있다.

개발자들은 보통 때처럼 코드를 Commit할 수 있

다. (단계 저장소에서 모든 테스트를 만족하여 실

제저장소로 옮기는 일련의 작업으로) 일이 QAC

/ QAC++이 코드를 분석할 수 있게 CI서버에 설

정이 되어 있어야 한다. CI서버에서 코드가 얼마

나 코딩 규칙을 만족했는지에 대한 정보를 확인

할 수 있으며, 또한 분석 결과에 대해 자동으로

QA·Verify에 업로드한다. 개발자는 코딩 규칙을

위반한 코드의 정확한 위치를 웹 브라우저에서

확인할 수 있으며, 다시 Commit 하기 전에 코드

를 수정할 수 있다.

다른 관련자들도 QA·Verify에서 위반사항 내용

이 추가된 코드를 확인할 수 있고 코드를 보는 낮

은 레벨이 아닌 그 보다 높은 레벨의 정보를 원

하는 매니저나 QA 팀에게는 추가적인 정보를 제

공한다.

관리자는 코드를 보고 싶어하지 않고 코드에 결

함이 얼마나 있는지 그리고 줄어들고 있는지 늘

어나고 있는지를 알고 싶어 한다. 프로젝트 단

위의 정보를 보여주는 것으로 프로젝트에 자원

에 대한 재할당과 같은 결정을 내릴 수 있게 도

와준다.

결론

정적 분석을 통해 코드에 베스트 프랙티스를 적

용하는 것은 CI를 이용하여 적은 양을 자주 실행

하는 것으로 쉽게 적용할 수 있다. CI를 개발단계

에서만 적용하는 것이 아니라 통합 테스트 단계

까지 적용하면 더 많은 이점이 있다. 심각한 문제

가 되기 전에 문제를 알려주며, 높은 품질의 코드

가 저장소에 Commit 될 수 있게 해준다.

PRQA 정적 분석 도구인 QAC와 QAC++는 플

러그인을 통해 Jenkins와 쉽게 적용할 수 있고,

이를 통해 코딩 규칙의 만족 정도에 대한 결과

를 바로 알려준다. 위반사항에 대한 면밀한 분석

과 코드가 어떻게 변화하고 있는지 추적을 확인

할 수 있게 플러그 인은 QA·Verify에 결과를 자

동으로 업로드 한다. CI와 PRQA 정적 분석 도구

의 궁합은 정해진 시간과 개발비용에서 개발할

수 있게 해주며 높은 품질을 가질 수 있게 해준

다. (단계 저장소에서 모든 테스트를 만족하여 실

제저장소로 옮기는 일련의 작업으로) 일이 QAC

/ QAC++이 코드를 분석할 수 있게 CI서버에 설

정이 되어 있어야 한다. CI서버에서 코드가 얼마

나 코딩 규지 추적을 확인할 수 있게 플러그 인은

QA·Verify에 결과를 자동으로 업로드 한다. CI와

PRQA 정적 분석 도구의 궁합은 정해진 시간과

개발비용에서 개발할 수 있게 해주며 높은 품질

을 가질 수 있게 해준다.

그림 6.