목적 및 범위
이 문서는 go-stablenet의 빌드 시스템과 CI/CD 파이프라인 전반을 설명합니다.로컬 환경에서의 바이너리 빌드 방법, CI/CD 파이프라인 구조, 릴리스 아티팩트 생성 과정을 다루며, 패키지 배포는 사전 빌드 바이너리를 중심으로 설명합니다. 사전 빌드된 바이너리 설치 또는 실행 중인 노드 구성에 대한 내용은 설치 및 빌드 및 노드 구성을 참고하세요.
빌드 시스템 아키텍처
go-stablenet 프로젝트는 이중 레이어 빌드 시스템을 사용합니다.- Makefile
개발자가 로컬에서 빠르게 바이너리를 빌드하거나 테스트를 수행하기 위한 인터페이스입니다. - build/ci.go
CI/CD 환경, 크로스 컴파일, 릴리스 아카이브 생성을 담당하는 통합 빌드 도구입니다.
build/ci.go를 호출하며, CI 환경과 로컬 빌드 결과가 최대한 동일하도록 설계되어 있습니다.
빌드 시스템 구성 요소
Makefile: 개발자용 진입점build/ci.go: CI/CD 및 릴리스 자동화 핵심 로직build/bin/: 로컬 빌드 산출물 디렉터리internal/build/: 체크섬, 다운로드, 검증 로직params/version.go: 버전 정보 정의
버전 관리
버전 정보는params/version.go에서 중앙 관리되며, 빌드 시 모든 바이너리에 포함됩니다.
버전 구조
| Component | Source | Example |
|---|---|---|
| Major | params.VersionMajor | 0 |
| Minor | params.VersionMinor | 1 |
| Patch | params.VersionPatch | 0 |
| Meta | params.VersionMeta | stable |
| Git Commit | 빌드 시 주입 | a1b2c3d4 |
| Git Date | 커밋 기준 생성 | 20240115 |
버전 문자열 형식
- Version:
0.1.0 - VersionWithMeta:
0.1.0-stable - ArchiveVersion:
0.1.0-a1b2c3d4 - VersionWithCommit:
0.1.0-stable-a1b2c3d4-20240115
로컬 빌드
Makefile 기반 빌드
Makefile은 가장 일반적인 빌드 작업을 단순화합니다.| Target | Command | Output |
|---|---|---|
| gstable | make gstable | 메인 노드 바이너리 |
| genesis_generator | make genesis_generator | 제네시스 생성 도구 |
| all | make all | 전체 실행 파일 |
| test | make test | 테스트 실행 |
| lint | make lint | 린트 실행 |
| clean | make clean | 빌드 산출물 정리 |
build/bin/ 디렉터리에 생성됩니다.
build/ci.go 기반 빌드
build/ci.go는 CI 환경과 동일한 빌드 조건을 로컬에서 재현하기 위한 도구입니다.
주요 역할:
- 크로스 컴파일
- 릴리스 아카이브 생성
- 체크섬 검증
- CI 전용 빌드 플래그 적용
크로스 컴파일
빌드 시스템은 다음 아키텍처를 지원합니다.amd64386arm(GOARM v5/v6/v7)arm64
ARM64 예제
ARM v7 예제
CI/CD 파이프라인 아키텍처
go-stablenet은 멀티 플랫폼 CI 환경을 사용합니다.CI 플랫폼 매트릭스
| Platform | OS | Architectures | Purpose |
|---|---|---|---|
| Travis CI | Linux | amd64, arm64, 386, arm | 메인 빌드, 테스트 |
| Travis CI | macOS | amd64, arm64 | macOS 바이너리 |
| AppVeyor | Windows | amd64, 386 | Windows 빌드 |
Travis CI
- 트리거: master 브랜치, 태그, PR
- 멀티 Go 버전 테스트
- Docker 이미지 빌드
- 릴리스 아카이브 생성
AppVeyor
- Windows 빌드 전용
- ZIP 아카이브 생성
- 서명된 바이너리 산출
릴리스 아티팩트
아카이브 생성
릴리스 아카이브에는 실행 파일과 라이선스가 포함됩니다.| Archive | Platform |
|---|---|
| tar.gz | Linux / macOS |
| zip | Windows |
gstable-{platform}-{arch}-{version}.{ext}
서명 및 업로드
- 선택적 PGP 또는 Signify 서명
- Azure Blob Storage 업로드
- master 또는 태그 빌드에서만 수행
CI 테스트 및 린팅
테스트
CI 테스트는 다음 조건으로 실행됩니다.- 타임아웃: 20분
- 병렬성 제한(
-p 1) - 통합 테스트 태그 활성화
- 선택적 레이스 감지
린팅
golangci-lint를 사용하며, 주요 활성 린터는 다음과 같습니다.
- goimports
- govet
- staticcheck
- ineffassign
- misspell
- unused
- whitespace
종속성 관리
모든 외부 종속성은build/checksums.txt로 관리됩니다.
- 다운로드 전 SHA256 검증
- 재현 가능한 빌드 보장
- CI 및 로컬 빌드 동일 동작
빌드 플래그 및 링커 설정
빌드 태그
| Tag | Purpose |
|---|---|
| urfave_cli_no_docs | CLI 문서 생성 비활성화 |
| ckzg | KZG 암호화 활성화 |
| integrationtests | 통합 테스트 |
| netgo | 순수 Go 네트워크 |
| osusergo | 순수 Go 사용자 조회 |
링커 플래그
요약
go-stablenet 빌드 및 CI/CD 시스템의 핵심 특징은 다음과 같습니다.- Makefile + build/ci.go 이중 레이어 구조
- 멀티 플랫폼 CI
- 크로스 컴파일 지원
- 재현 가능한 릴리스 아티팩트
- 체크섬 기반 종속성 검증
- 모든 바이너리에 버전 메타데이터 포함

