개요
Yocto 프로젝트는 임베디드 리눅스 배포판을 구축하는 데 사용되는 오픈 소스 프로젝트이다. 여러 개발자가 협업하여 다양한 빌드 환경과 패키지를 유지보수할 때는 버전 관리 시스템이 필수적이다. 이를 위해 주로 사용되는 도구가 바로 Git이다. Git을 활용하면 코드 변경 사항을 추적하고, 버전을 관리하며, 여러 개발자가 동시에 프로젝트에 기여할 수 있다.
Git의 기본 개념
저장소 초기화
Yocto 프로젝트를 시작하려면 먼저 Git 저장소를 초기화해야 한다. 저장소를 생성하거나 기존의 원격 저장소를 클론한다.
git init
또는
git clone <repository-url>
기초 명령어
Yocto 프로젝트를 Git으로 관리하기 위해 알아야 할 기본 명령어는 다음과 같다.
git status
: 현재 저장소의 상태를 보여준다. 변화가 있는 파일과 커밋되지 않은 파일 등을 확인할 수 있다.
git status
git add
: 파일을 인덱스에 추가한다. 커밋할 파일을 선택한다.
git add <file>
git commit
: 변경 사항을 커밋한다. 변경된 파일들의 스냅샷을 저장소에 저장한다.
git commit -m "커밋 메시지"
git push
: 로컬 변경 사항을 원격 저장소에 반영한다.
git push origin <branch>
git pull
: 원격 저장소의 변경 사항을 로컬에 반영한다.
git pull origin <branch>
Yocto 프로젝트 구조와 Git
Yocto 레이어와 Git
Yocto 프로젝트는 여러 레이어로 구성되어 있다. 각 레이어는 독립적인 기능을 제공한다. 레이어마다 별도의 Git 저장소로 관리하는 것이 일반적이다.
- meta-layer: 여러 레이어를 활성화하거나 설정을 관리하는 데 사용된다.
- meta-yocto-bsp: 하드웨어 지원을 위한 레이어이다.
- meta-security: 보안 패치를 위한 레이어이다.
각 레이어는 독립적으로 관리할 수 있으며, 프로젝트에 필요한 레이어를 선택하여 포함시킬 수 있다.
Yocto 프로젝트의 복잡성을 줄이기 위해 각 레이어마다 별도의 브랜치 및 태그를 사용하여 관리를 하는 것이 좋다. 예를 들어, 특정 레이어에만 기능을 추가하려면 해당 레이어에 브랜치를 생성하여 개발할 수 있다.
Git을 이용한 브랜치 관리
Yocto 프로젝트에서는 여러 개발자가 동시에 작업을 하고 있다. 따라서 브랜치 관리가 매우 중요하다.
브랜치 생성
새로운 브랜치를 생성하여 독립된 작업 공간을 만든다.
git checkout -b <new-branch>
브랜치 병합
작업이 완료되면 브랜치를 병합하여 메인 브랜치에 변경 사항을 반영한다.
git checkout <main-branch>
git merge <feature-branch>
충돌 해결
병합 중 충돌이 발생하면 직접 해결해야 한다. Git은 충돌된 파일을 표시해 주며, 이를 수정한 후 커밋하면 된다.
git add <resolved-file>
git commit -m "충돌 해결"
태그를 이용한 릴리즈 관리
태그는 특정 커밋을 식별하고, 이를 통해 릴리즈 버전을 관리하는 데 유용하다. 릴리즈마다 고유의 태그를 만들어 나중에 해당 버전으로 쉽게 돌아갈 수 있다.
태그 생성
새로운 태그를 생성한다.
git tag -a <tagname> -m "릴리즈 설명"
태그를 원격 저장소에 푸시한다.
git push origin <tagname>
태그 목록 보기
현재 저장소에 존재하는 태그들을 확인한다.
git tag
특정 태그 체크아웃
특정 태그를 사용 중인 상태로 전환한다. 과거의 특정 릴리즈 상태로 돌아가 작업할 때 유용하다.
git checkout <tagname>
Git을 사용한 협업
Pull Request와 코드 리뷰
Pull Request(PR)는 변경 사항을 메인 브랜치에 병합하기 전에 다른 개발자들이 리뷰할 수 있도록 하는 기능이다. GitHub, GitLab, Bitbucket 등 대부분의 Git 호스팅 서비스에서 지원한다.
- 브랜치 생성 및 작업: 먼저, 새로운 브랜치를 생성하고 작업을 완료한다.
git checkout -b feature-branch
- 브랜치 푸시: 변경 사항을 원격 저장소에 푸시한다.
git push origin feature-branch
-
Pull Request 생성: 호스팅 서비스의 웹 인터페이스에서 Pull Request를 생성한다. 변경 사항을 설명하고 리뷰 요청을 보낸다.
-
코드 리뷰: 다른 개발자들이 변경 사항을 검토하고 피드백을 남깁니다. 필요한 경우 수정을 거친 후 다시 푸시한다.
-
병합: 리뷰가 완료되면 변경 사항을 메인 브랜치에 병합한다.
협업 시 주의 사항
-
커밋 메시지 가이드라인: 명확하고 일관된 커밋 메시지를 사용한다. 커밋 메시지에는 변경 내용을 간략하게 설명하고, 필요 시 자세한 설명을 추가한다.
-
코딩 스타일: 프로젝트의 코딩 스타일 가이드를 준수한다. 코드 일관성을 유지하면, 코드 리뷰와 유지보수가 용이한다.
-
작업 단위 분리: 가능한 작은 단위로 작업을 끊어 커밋한다. 큰 변경 사항은 이해하고 검토하기 어렵기 때문이다.
-
정기적인 Pull: 작업 중에도 정기적으로 원격 저장소의 변경 사항을 Pull하여 로컬 저장소를 최신 상태로 유지한다.
git pull origin main
CI/CD와의 통합
지속적 통합(Continuous Integration, CI) 및 지속적 배포(Continuous Deployment, CD) 시스템은 Yocto 프로젝트의 품질을 유지하고 배포 프로세스를 자동화하는 데 유용하다. Git과 CI/CD 시스템을 연동하면 코드가 변경될 때마다 자동으로 빌드 및 테스트가 수행된다.
CI/CD 설정
- CI 설정 파일 작성: 대부분의 CI 시스템은 설정 파일을 통해 관리된다. 예를 들어 GitLab CI의 경우
.gitlab-ci.yml
파일을 작성하여 빌드 및 테스트 단계를 정의한다.
stages:
- build
- test
build_job:
stage: build
script:
- ./build-script.sh
test_job:
stage: test
script:
- ./test-script.sh
- CI 시스템과 Git 연동: Git 저장소를 CI 시스템에 연동하여, 커밋이나 풀 리퀘스트가 발생할 때마다 자동으로 빌드가 실행되도록 설정한다.