Eco CI

Eco CI

CI/CD 파이프라인이 얼마나 에너지를 쓰고 탄소를 배출하는지 궁금한 적 있나요? Eco CI는 파이프라인의 에너지 소비와 탄소 배출을 측정해 주는 오픈 소스 도구예요. 단, GitLab이 관리하거나 지원하는 공식 기능이 아니라 서드파티 도구라는 점을 먼저 짚어둘게요.

출처: 문서

본문

Eco CI는 GitLab CI/CD 파이프라인과 통합되는 서드파티 도구입니다. GitLab은 이 도구를 유지 관리하거나 지원하지 않으며, 이 도구가 어떤 규정이나 컴플라이언스 요구 사항을 충족한다는 보증도 하지 않습니다.

Eco CI는 CI/CD 파이프라인의 에너지 소비와 탄소 배출을 측정하는 오픈 소스 도구입니다.

파이프라인에 Eco CI 추가하기

Eco CI를 파이프라인에 추가하면 잡 실행 중 에너지 소비와 탄소 배출을 측정할 수 있어요.

Eco CI는 ECO_CI_LABEL 변수로 측정값을 식별하고 그룹화하므로, 프로젝트나 파이프라인 스테이지를 잘 나타내는 설명적인 이름을 선택하세요. 기본적으로 측정 데이터는 분석을 위해 Green Coding Solutions 대시보드로 보내지지만, ECO_CI_SEND_DATAfalse로 설정하면 결과를 로컬에만 저장할 수 있습니다.

전제 조건:

  • bash를 지원하는 러너에서 실행되는 파이프라인 잡.
  • curl, jq, awk, bash, git, coreutils 유틸리티가 있는 러너 환경.

파이프라인에 Eco CI를 추가하려면:

  1. .gitlab-ci.yml 파일에서 Eco CI 템플릿을 include하고 프로젝트 식별자를 설정합니다.
variables:
  ECO_CI_LABEL: "my-project-pipeline"
  ECO_CI_SEND_DATA: "false"

include:
  - remote: 'https://raw.githubusercontent.com/green-coding-solutions/eco-ci-energy-estimation/main/eco-ci-gitlab.yml'
  1. 잡에 측정 스크립트를 추가합니다.
build-job:
  image: node:alpine
  before_script:
    - apk add --no-cache curl jq gawk bash git coreutils
  script:
    - !reference [.start_measurement, script]
    - npm install
    - npm run build
    - npm test
    - !reference [.get_measurement, script]
    - !reference [.display_results, script]
  artifacts:
    paths:
      - eco-ci-output.txt
      - metrics.txt
    expire_in: 1 week
  1. 선택 사항 — 명령을 각각 측정하고 싶다면 명령마다 측정 스크립트를 사용합니다.
build-job:
  image: node:alpine
  before_script:
    - apk add --no-cache curl jq gawk bash git coreutils
  script:
    - !reference [.start_measurement, script]
    - npm install
    - !reference [.get_measurement, script]
    - !reference [.display_results, script]

    - !reference [.start_measurement, script]
    - npm run build
    - !reference [.get_measurement, script]
    - !reference [.display_results, script]

    - !reference [.start_measurement, script]
    - npm test
    - !reference [.get_measurement, script]
    - !reference [.display_results, script]
  artifacts:
    paths:
      - eco-ci-output.txt
      - metrics.txt
    expire_in: 1 week

측정 결과 보기

Eco CI는 측정 결과를 잡 아티팩트에 저장하며, GitLab 인터페이스에서 접근할 수 있습니다. 측정 결과에는 다음이 포함됩니다.

  • 에너지 소비: 줄(joules)과 와트(watts)로 표시.
  • 탄소 배출: gCO₂eq(이산화탄소 당량 그램) 단위의 추정 배출량.
  • 지속 시간: 측정 기간의 길이(초).
  • CPU 사용률: 측정 중 평균 CPU 사용률.
  • 소프트웨어 탄소 강도(SCI): 파이프라인 실행당 탄소 배출량.

측정 결과를 보려면:

  1. 파이프라인으로 이동합니다.
  2. Eco CI 측정이 포함된 잡을 선택하세요.
  3. 잡 상세에서 Job artifacts 아래 Browse를 선택합니다.
  4. eco-ci-output.txt 파일을 엽니다.

출력 예시:

"build-job: Label: my-project-pipeline: Energy Used [Joules]:" 5.82
"build-job: Label: my-project-pipeline: Avg. CPU Utilization:" 22.69
"build-job: Label: my-project-pipeline: Avg. Power [Watts]:" 1.91
"build-job: Label: my-project-pipeline: Duration [seconds]:" 3.04
----------------
"build-job: Energy [Joules]:" 5.82
"build-job: Avg. CPU Utilization:" 22.69
"build-job: Avg. Power [Watts]:" 1.91
"build-job: Duration [seconds]:" 3.04
----------------
🌳 CO2 Data:
CO₂ from energy is: 0.001944 g
CO₂ from manufacturing (embodied carbon) is: 0.000442 g
Carbon Intensity for this location: 334 gCO₂eq/kWh
SCI: 0.002386 gCO₂eq / pipeline run emitted

대시보드 통합

ECO_CI_SEND_DATAtrue로 설정하면 측정 데이터가 자동으로 Eco CI 지표 대시보드로 전송됩니다. 대시보드는 과거 기록, 추세 분석, 파이프라인 실행 간 비교를 제공해요. 기본적으로 대시보드는 공개되어 누구나 볼 수 있습니다.

시간 경과에 따른 에너지 소비 추세, 탄소 배출 패턴을 보고, 서로 다른 브랜치·커밋·기간 간 측정값을 비교할 수 있어요. 프로젝트의 ECO_CI_LABEL 식별자로 대시보드에 접근하세요.

프로젝트에 배지 추가하기

프로젝트의 README.md 파일에 Eco CI 배지를 표시해 에너지 소비 지표를 보여줄 수 있습니다.

전제 조건:

  • ECO_CI_SEND_DATAtrue로 설정되어 있어야 합니다.
  • Eco CI를 활성화한 파이프라인이 최소 하나는 성공적으로 실행되어야 해요.

README.md 파일에 배지를 추가하려면:

  1. 다음을 README.md 파일에 복사해 붙여 넣습니다.
[![Eco CI](https://api.green-coding.io/v1/ci/badge/get?repo=<namespace>/<project>&branch=<branch>&workflow=<project-id>)](https://metrics.green-coding.io/ci.html?repo=<namespace>/<project>&branch=<branch>&workflow=<project-id>)
  1. 플레이스홀더를 바꿉니다. <namespace>/<project>는 GitLab 프로젝트 경로(예: mygroup/myproject), <branch>는 브랜치 이름(예: main), <project-id>는 GitLab 프로젝트 ID(예: 52215136)로요.
  2. 예시:
[![Eco CI](https://api.green-coding.io/v1/ci/badge/get?repo=lyspin/eco-ci-demo&branch=main&workflow=52215136)](https://metrics.green-coding.io/ci.html?repo=lyspin/eco-ci-demo&branch=main&workflow=52215136)

문제 해결

Eco CI로 작업할 때 다음 문제가 발생할 수 있어요.

오류: Date has returned a timestamp that is not accurate to microseconds

다음과 같은 오류 메시지를 만날 수 있습니다.

ERROR: Date has returned a timestamp that is not accurate to microseconds! You may need to install `coreutils`.

이 문제는 기본적으로 GNU coreutils가 포함되지 않은 Alpine Linux나 다른 경량 배포판을 사용할 때 발생해요.

이 문제를 해결하려면 coreutils를 설치하세요. 예를 들어 Alpine에서는:

before_script:
  - apk add --no-cache coreutils

아티팩트에 측정 데이터가 나타나지 않을 때

잡 아티팩트에 eco-ci-output.txt 파일이 보이지 않는 문제입니다.

이 문제는 잡에 artifacts 구성이 빠져 있을 때 발생합니다.

이 문제를 해결하려면 잡에 올바른 artifacts 구성이 있는지 확인하세요.

artifacts:
  paths:
    - eco-ci-output.txt
    - metrics.txt

측정값이 에너지 소비 0으로 표시될 때

eco-ci-output.txt 파일에 Energy [Joules]: 0.00 같은 값이 표시되는 문제입니다.

이 문제는 측정 스크립트가 잘못된 위치에 배치되었을 때 발생해요.

이 문제를 해결하려면 측정 스크립트가 CPU 집약적 명령을 감싸도록 하세요.

script:
  - !reference [.start_measurement, script]
  - npm install  # CPU-intensive command
  - npm run build  # CPU-intensive command
  - !reference [.get_measurement, script]
  - !reference [.display_results, script]

더 알아보기

Eco CI를 붙일 때 핵심은 .start_measurement.get_measurement 사이에 CPU 집약적 명령을 두는 것이에요. 측정을 에너지로 전환해서 볼 수 있으니, 탄소 배출량을 줄이고 싶은 팀이라면 파이프라인 단계별 소비를 비교해 보면 어디가 큰지 드러나죠. 다음으로는 공식 Eco CI 문서와 Green Coding 대시보드 활용법을 함께 살펴보는 걸 추천해요.