Setup GitLab CI

GitLab의 CI기능을 사용하여 빌드 및 정적분석을 자동화 하는 방법을 설명한다.

1. 용어 설명

1.1. GitLab

GitLab은 Git 저장소 관리, CI/CD(지속적 통합/지속적 배포), 코드 리뷰, 프로젝트 관리 등을 지원하는 웹 기반 DevOps 플랫폼이다. GitLab은 오픈 소스 버전과 상용 버전을 제공하며, 팀이 협업하여 소프트웨어 개발을 효율적으로 진행할 수 있도록 돕는다.

1.2. CI

Continuous Integration(지속적 통합, CI)은 소프트웨어 개발에서 코드 변경 사항을 자동으로 통합하고 테스트하는 프로세스를 의미한다. CI는 개발자들이 코드를 자주 병합하고, 자동화된 빌드테스트를 통해 코드 품질을 유지하며, 배포를 용이하게 한다.

1.3. Static Analysis

Static Analysis(정적 분석)는 소스 코드를 실행하지 않고 코드의 구조, 스타일, 품질 등을 분석하는 기법이다. 이는 코드의 버그, 보안 취약점, 코드 표준 준수 여부 등을 사전에 검토하여 코드 품질을 향상시키는 데 도움을 준다.

1.4. SonarQube

SonarQube는 코드 품질을 분석하고 관리하는 오픈 소스 플랫폼이다. SonarQube는 정적 분석을 통해 코드의 버그, 보안 취약점, 코드 스멜 등을 식별하고, 이를 개선하기 위한 피드백을 제공한다. 정적 분석 결과를 웹에서 시각적으로 확인할 수 있다.

1.5. CD (참고)

Continuous Deployment(지속적 배포, CD)는 소프트웨어 개발에서 코드 변경 사항을 자동으로 배포하는 프로세스를 의미한다. CD는 CI와 함께 사용되어, 코드가 테스트를 통과하면 자동으로 프로덕션 환경에 배포되도록 한다. 이를 통해 배포 주기를 단축하고, 사용자에게 빠르게 새로운 기능을 제공할 수 있다.

2. GitLab의 CI 기능

2.1. 빌드 자동화

GitLab은 Commit 또는 Merge가 발생할 때마다 지정된 스크립트를 자동으로 실행하는 기능을 제공한다. 빌드 스크립트는 자동으로 생성되지 않으며 사용자가 제공해야 한다.

.gitlab-ci.yml 파일을 프로젝트의 최상위 폴더에 작성한다. 이 파일은 GitLab CI가 어떤 작업을 수행할지 지시하는 역할을 한다. 여기에 수행할 작업을 기록하거나 빌드 스클립트를 호출한다.

2.2. 정적 분석 자동화

GitLab CI는 자체적으로 빌드와 정적 분석을 특별히 구분하지 않는다. 정적 분석을 위한 스크립트를 따로 등록할 뿐이다.

3. GitLab CI 설정 방법

Repository에는 CI용 스크립트 대신, 빌드 및 정적분석에 필요한 기본 정보만 저장하고, 정적 분석에 필요한 설정 파일 및 스크립트는 GitLab Runner에서 공통적으로 처리하게 하였다.

개별 Repository에서는 .gitlab-ci.yml 파일과 modgroup-spec.yaml 파일만 작성하면 된다.

3.1. gitlab-ci.yml 파일

  • Git Repository 의 최상위 폴더에 .gitlab-ci.yml 파일을 작성한다. 파일이 없는 경우 전체 파일을 복사한다.

  • 기존에 이미 build job이 등록되어 있는 경우 다음과 같이 analysis job을 추가한다.

    1. stages:analysis를 추가한다.

    2. 중간의 analysis:이하 부분을 기존 파일에 복사한다.

gitlab-ci.yml 템플릿
stages:
  - build
  - analysis

build:
  stage: build
  script:
    - modkit fetch
    - modkit build
  artifacts:
    paths: [dist]
    expire_in: 24 hours
  tags: [vs2022+, pwsh]

analysis:
  stage: analysis
  variables:
    GIT_DEPTH: "0"
  script:
    - modkit fetch
    - modkit analyze
  artifacts:
    when: always
    paths: [build/*.txt]
    expire_in: 24 hours
  allow_failure: true
  tags: [vs2022+, pwsh]

3.2. modgroup-spec.yaml 파일

  • Git Repository 의 최상위 폴더에 modgroup-spec.yaml 파일을 작성한다.

    1. 템플릿을 복사한 후 name:의 값을 프로젝트 명으로 변경한다.

    2. deliverabletesttool 영역에 vcxproj 파일명을 넣는다.

    3. deps: 영역에 의존 모듈을 추가한다.

modgroup-spec.yaml 템플릿
name: DART

role:
  deliverable:
    - AutoLogCleaner
    - DartSmLib
    - DcsBindingDataLogger
    - GraphLib
    - TrendGraphViewer

  testtool:
    - BindingDataLogViewer
    - SharedMemoryViewer

deps:
  DcsBindingDataLogger: [DartSmLib]
  GraphLib: [DartSmLib]
  SharedMemoryViewer: [DartSmLib]
  TrendGraphViewer: [DartSmLib, GraphLib]

description:

external:

additional_deps:

build_target:

3.3. modkit (참고)

GitLab Runner에 설치되어 CI 빌드 및 정적 분석시에 실행된다.

모듈(VC Project 파일 단위)들의 빌드, 정적 분석을 배치 처리하기 위한 도구.

  • build : 모듈들을 빌드. vcxproj 파일에 저장된 설정에 따라 빌드한다.

  • analyze : 모듈들을 정적 분석. vcxproj 파일에 저장된 설정에서 일부 옵션을 변경하여 사용한다.

  • fetch : 정의된 외부 모듈들을 Extern 폴더에 다운로드한다. (참조 정보가 있는 경우)

3.4. 기타 Repo 설정 파일

Git Repository용 설정 파일을 C1401_Tool RepoConfig 에서 복사하여 사용한다.

  • .gitignore

  • .editorconfig

  • .clang-tidy

  • .clang-format

3.4.1. Legacy

기존에 사용하던 GitLab CI용 스크립트 파일은 다음과 같다.

  • Tool/ci_build.bat

  • Tool/buid_<project>_for_swrepo.bat

  • Tool/save_<project>_for_swrepo.bat

4. SonarQube 연동 (참고)

GitLab 프로젝트에 analysis를 등록하면 SonarQube에도 신규 프로젝트를 등록해야 한다. 또, modkit에 GitLab 프로젝트와 SonarQube 프로젝트 연결 정보를 등록해야 한다.

4.1. SonarQube에 신규 프로젝트 등록

  1. SonarQube에 접속한 후 Projects 메뉴에서 *Create Project*를 클릭한다. 이후 나오는 팝업에서 *From GitLab*을 선택한다.

  2. GitLab 프로젝트를 선택하고 웹 페이지 상단에서 *Import*를 클릭한다.

  3. Set up project for Clean as You Code 화면이 나오면 *Use the global setting*을 선택한다.

  4. 페이지 하단의 Create Project 버튼을 클릭한다.

4.2. modkit analyze 명령에 SonarQube Key 등록

  1. SonarQube에 접속한 후 Portal 메뉴에서 신규 생성한 Project를 클릭한다.

  2. Project Settings 메뉴에서 *Update Key*를 클릭한다.

  3. New Key 입력란에 표시된 Key 값을 복사한다.

  4. GitLab-Runner에서 ModKit 홈 디렉토리로 이동한다.

  5. project_key_db.py 파일을 열고, 아래와 같이 Key를 등록한다.

PROJ_KEY_TABLE = {
    .....
    "J2403_DART": "2024_J2403_DART_0c4cedf1-969f-497d-9990-71077ac90d72",
    .....
}
  • 위의 예시에서 "J2403_DART"는 GitLab 프로젝트 이름이며, "0c4cedf1-969f-497d-9990-71077ac90d72"는 SonarQube 프로젝트 Key이다.