패키지 레지스트리의 Conan 2 패키지
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
프로젝트의 패키지 레지스트리에 Conan 2 패키지를 게시합니다. GitLab의 Conan 2 패키지 레지스트리는 개발 중이며 기능이 제한적이므로 프로덕션 용도로 사용할 준비가 되지 않았습니다. 패키지 레지스트리에 Conan 2 패키지를 게시하려면 패키지 레지스트리를 원격으로 추가하고 인증합니다.
히스토리
- GitLab 18.1에서
conan_package_revisions_support라는 기능 플래그와 함께 도입되었습니다. 기본적으로 비활성화되어 있습니다. - GitLab 18.3에서 GitLab.com에 활성화되었습니다. 기능 플래그
conan_package_revisions_support가 제거되었습니다.
프로젝트의 패키지 레지스트리에 Conan 2 패키지를 게시합니다. 이후 의존성으로 사용해야 할 때 해당 패키지를 설치합니다.
GitLab의 Conan 2 패키지 레지스트리는 개발 중이며 기능이 제한적이므로 프로덕션 용도로 사용할 준비가 되지 않았습니다. 프로덕션 준비까지 남은 작업과 일정은 이 에픽에 정리되어 있습니다.
패키지 레지스트리에 Conan 2 패키지를 게시하려면 패키지 레지스트리를 원격으로 추가하고 인증합니다.
그러면 conan 명령을 실행해 패키지를 패키지 레지스트리에
게시할 수 있습니다.
Conan 레지스트리는 FIPS를 준수하지 않으며 FIPS 모드가 활성화되면 비활성화됩니다.
Conan 2 패키지 관리자 클라이언트가 사용하는 API 엔드포인트 문서는 Conan v2 API를 참고합니다
Conan 2 패키지 빌드 방법을 확인합니다.
패키지 레지스트리를 Conan 원격으로 추가#
conan 명령을 실행하려면 프로젝트 또는 인스턴스에 패키지 레지스트리를 Conan 원격으로
추가해야 합니다. 그러면 패키지 레지스트리에 패키지를 게시하고
패키지 레지스트리에서 패키지를 설치할 수 있습니다.
프로젝트에 대한 원격 추가#
원격을 설정하면 모든 명령에서 원격 이름을 지정하지 않고도 프로젝트의 패키지를 다룰 수 있습니다.
프로젝트에 원격을 설정할 때 패키지 이름은 소문자여야 합니다.
또한 명령에는 사용자와 채널을 포함한 전체 레시피가 들어가야 합니다.
예를 들면 package_name/version@user/channel 입니다.
원격을 추가하려면 다음을 수행합니다:
-
터미널에서 다음 명령을 실행합니다:
conan remote add gitlab https://gitlab.example.com/api/v4/projects/<project_id>/packages/conan -
Conan 2 명령 끝에
--remote=gitlab을 추가해 원격을 사용합니다.예를 들면 다음과 같습니다:
conan search hello* --remote=gitlab
패키지 레지스트리 인증#
GitLab은 패키지를 업로드할 때, 그리고 비공개 및 내부 프로젝트에서 패키지를 설치할 때 인증을 요구합니다. 다만 공개 프로젝트의 패키지는 인증 없이 설치할 수 있습니다.
패키지 레지스트리에 인증하려면 다음 중 하나가 필요합니다:
- 개인 액세스 토큰. 스코프는
api로 설정합니다. - 배포 토큰. 스코프는
read_package_registry,write_package_registry또는 둘 다로 설정합니다. - CI job 토큰.
인증하지 않으면 비공개 및 내부 프로젝트의 패키지는 표시되지 않습니다.
인증하지 않은 상태에서 비공개 또는 내부 프로젝트의 패키지를 검색하거나 내려받으려 하면
Conan 2 클라이언트에서 unable to find the package in remote 오류가
발생합니다.
GitLab 원격에 자격 증명 추가#
토큰을 GitLab 원격에 연결하면 모든 Conan 2 명령에 토큰을 명시적으로 추가하지 않아도 됩니다.
사전 요구 사항:
- 인증 토큰이 있어야 합니다.
- Conan 원격이 구성되어 있어야 합니다.
터미널에서 다음 명령을 실행합니다. 이 예시에서 원격 이름은 gitlab 입니다.
실제 원격 이름을 사용합니다.
conan remote login -p <personal_access_token or deploy_token> gitlab <gitlab_username or deploy_token_username>
이제 --remote=gitlab과 함께 명령을 실행하면 요청에 사용자 이름과 비밀번호가
포함됩니다.
GitLab 인증은 일정 주기로 만료되므로 개인 액세스 토큰을 다시 입력해야 할 때가 있습니다.
Conan 2 패키지 게시#
Conan 2 패키지를 패키지 레지스트리에 게시하면 프로젝트에 접근할 수 있는 사람이라면 누구나 그 패키지를 의존성으로 사용할 수 있습니다.
사전 요구 사항:
- Conan 원격이 구성되어 있어야 합니다.
- 패키지 레지스트리에 대한 인증이 구성되어 있어야 합니다.
- 로컬에 Conan 2 패키지가 있어야 합니다.
- 프로젝트 개요 페이지에 표시되는 프로젝트 ID가 있어야 합니다.
패키지를 게시하려면 conan upload 명령을 사용합니다:
conan upload hello/0.1@mycompany/beta -r gitlab
CI/CD를 사용해 Conan 2 패키지 게시#
GitLab CI/CD에서 Conan 2 명령을 사용할 때는 명령의 개인 액세스 토큰 대신
CI_JOB_TOKEN을 사용할 수 있습니다.
.gitlab-ci.yml 파일의 각 Conan 명령에 CONAN_LOGIN_USERNAME과 CONAN_PASSWORD를
지정할 수 있습니다. 예를 들면 다음과 같습니다:
create_package:
image: <conan 2 image>
stage: deploy
script:
- conan remote add gitlab ${CI_API_V4_URL}/projects/$CI_PROJECT_ID/packages/conan
- conan new <package-name>/0.1
- conan create . --channel=stable --user=mycompany
- CONAN_LOGIN_USERNAME=ci_user CONAN_PASSWORD=${CI_JOB_TOKEN} conan upload <package-name>/0.1@mycompany/stable --remote=gitlab
environment: production
CI 파일의 기반으로 사용할 적절한 Conan 2 이미지는 공식 가이드에 따라 만듭니다.
동일한 레시피로 패키지 재게시#
기존 패키지와 동일한 레시피(package-name/version@user/channel)를 가진 패키지를 게시하면
이미 서버에 있으므로 Conan 이 업로드를 건너뜁니다.
Conan 2 패키지 설치#
패키지 레지스트리에서 Conan 2 패키지를 설치하면 의존성으로 사용할 수 있습니다. 패키지는 프로젝트 범위에서 설치할 수 있습니다. 동일한 레시피를 가진 패키지가 여러 개이면 패키지를 설치할 때 가장 최근에 게시된 패키지를 가져옵니다.
Conan 2 패키지는 보통 conanfile.txt 파일을 사용해 의존성으로
설치합니다.
사전 요구 사항:
- Conan 원격이 구성되어 있어야 합니다.
- 비공개 및 내부 프로젝트에서는 패키지 레지스트리에 대한 인증을 구성해야 합니다.
-
Conan 2 패키지 가이드에 따라 다른 패키지를 만듭니다. 프로젝트 루트에
conanfile.txt라는 파일을 만듭니다. -
파일의
[requires]섹션에 Conan 레시피를 추가합니다:[requires] hello/0.1@mycompany/beta -
프로젝트 루트에
build디렉터리를 만들고 해당 디렉터리로 이동합니다:mkdir build && cd build -
conanfile.txt에 나열된 의존성을 설치합니다:conan install ../conanfile.txt
이 튜토리얼에서 만든 패키지를 설치하려고 하면 패키지가 이미 존재하므로 설치 명령이 아무 동작도 하지 않습니다. 다음 명령으로 로컬의 기존 패키지를 제거한 뒤 다시 시도합니다:
conan remove hello/0.1@mycompany/beta
Conan 2 패키지 제거#
GitLab 패키지 레지스트리에서 Conan 2 패키지를 제거하는 방법은 두 가지입니다.
-
명령줄에서 Conan 2 클라이언트를 사용합니다:
conan remove hello/0.1@mycompany/beta --remote=gitlab이 명령에는 원격을 명시적으로 포함해야 합니다. 그렇지 않으면 패키지가 로컬 시스템 캐시에서만 제거됩니다.
[!note] 이 명령은 패키지 레지스트리에서 모든 레시피와 바이너리 패키지 파일을 제거합니다.
-
GitLab 사용자 인터페이스를 사용합니다:
프로젝트의 Deploy > Package registry로 이동합니다. Remove repository ([remove])를 선택해 패키지를 제거합니다.
패키지 레지스트리에서 Conan 2 패키지 검색#
전체 또는 일부 패키지 이름으로, 또는 정확한 레시피로 검색하려면
conan search 명령을 실행합니다.
-
특정 패키지 이름을 가진 모든 패키지를 검색합니다:
conan search hello --remote=gitlab -
he로 시작하는 모든 패키지처럼 이름의 일부로 검색합니다:conan search "he*" --remote=gitlab
검색 범위는 Conan 원격 구성에 따라 달라집니다. 접근 권한이 있는 한 대상 프로젝트의 모든 패키지가 검색에 포함됩니다.
검색 결과는 최대 500개 패키지로 제한되며, 가장 최근에 게시된 패키지 순으로 정렬됩니다.
패키지를 검색할 때 Conan v2 CLI는 Conan v2로 업로드한 패키지의 상세 정보만
표시합니다. Conan v1으로 업로드한 패키지는 검색 결과에 나타나지만 상세 정보는
표시되지 않습니다. Conan v2는 패키지 참조에 recipe_hash 필드가 없다고 가정하는데,
이 필드는 Conan v1으로 업로드한 패키지에 존재하기 때문입니다.
Conan 2 패키지 다운로드#
conan download 명령을 사용하면 설정 없이 Conan 2 패키지의 레시피와 바이너리를 로컬 캐시로 내려받을 수 있습니다.
사전 요구 사항:
- Conan 원격이 구성되어 있어야 합니다.
- 비공개 및 내부 프로젝트에서는 패키지 레지스트리에 대한 인증을 구성해야 합니다.
모든 바이너리 패키지 다운로드#
패키지 레지스트리에서 레시피에 연결된 모든 바이너리 패키지를 내려받을 수 있습니다.
모든 바이너리 패키지를 내려받으려면 다음 명령을 실행합니다:
conan download hello/0.1@mycompany/beta --remote=gitlab
레시피 파일 다운로드#
바이너리 패키지 없이 레시피 파일만 내려받을 수 있습니다.
레시피 파일을 내려받으려면 다음 명령을 실행합니다:
conan download hello/0.1@mycompany/beta --remote=gitlab --only-recipe
특정 바이너리 패키지 다운로드#
패키지 참조(Conan 2 문서에서는 package_id로 표기)를 지정해 단일 바이너리 패키지를 내려받을 수 있습니다.
특정 바이너리 패키지를 내려받으려면 다음 명령을 실행합니다:
conan download Hello/0.1@foo+bar/stable:<package_reference> --remote=gitlab
지원되는 CLI 명령#
GitLab Conan 리포지터리는 다음 Conan 2 CLI 명령을 지원합니다:
conan upload: 레시피와 패키지 파일을 패키지 레지스트리에 업로드합니다.conan install: 패키지 레지스트리에서 Conan 2 패키지를 설치합니다.conanfile.txt파일을 사용하는 방식도 포함합니다.conan download: 설정 없이 패키지 레시피와 바이너리를 로컬 캐시로 내려받습니다.conan search: 패키지 레지스트리에서 공개 패키지와 조회 권한이 있는 비공개 패키지를 검색합니다.conan list: 기존 레시피, 리비전 또는 패키지를 나열합니다.conan remove: 패키지 레지스트리에서 패키지를 삭제합니다.
Conan 리비전#
Conan 리비전은 패키지 레지스트리에서 패키지 불변성을 제공합니다. 버전을 바꾸지 않은 채 레시피나 패키지를 변경하면 Conan 이 그 변경을 추적하기 위해 고유 식별자(리비전)를 계산합니다.
리비전 유형#
Conan은 두 가지 유형의 리비전을 사용합니다:
- 레시피 리비전(RREV): 레시피를 내보낼 때 생성됩니다. Conan은 기본적으로 레시피 매니페스트의 체크섬 해시로 레시피 리비전을 계산합니다.
- 패키지 리비전(PREV): 패키지를 빌드할 때 생성됩니다. Conan은 패키지 콘텐츠의 해시로 패키지 리비전을 계산합니다.
리비전 참조#
패키지는 다음 형식으로 참조할 수 있습니다:
| 참조 | 설명 |
|---|---|
lib/1.0@conan/stable |
lib/1.0@conan/stable의 최신 RREV. |
lib/1.0@conan/stable#RREV |
lib/1.0@conan/stable의 특정 RREV. |
lib/1.0@conan/stable#RREV:PACKAGE_REFERENCE |
특정 RREV에 속하는 바이너리 패키지. |
lib/1.0@conan/stable#RREV:PACKAGE_REFERENCE#PREV |
특정 RREV에 속하는 바이너리 패키지 리비전 PREV. |
리비전 업로드#
모든 리비전과 그 바이너리를 GitLab 패키지 레지스트리에 업로드하려면 다음을 실행합니다:
conan upload "hello/0.1@mycompany/beta#*" --remote=gitlab
여러 리비전을 업로드하면 오래된 것부터 최신 순으로 업로드됩니다. 레지스트리에서도 이 상대 순서가 유지됩니다.
리비전 나열#
Conan 2에서 특정 레시피의 모든 리비전을 나열하려면 다음을 실행합니다:
conan list "hello/0.1@mycompany/beta#*" --remote=gitlab
이 명령은 지정한 레시피에서 사용할 수 있는 모든 리비전을 리비전 해시 및 생성 날짜와 함께 표시합니다.
특정 리비전의 상세 정보를 확인하려면 다음을 실행합니다:
conan list "hello/0.1@mycompany/beta#revision_hash:*#*" --remote=gitlab
이 명령은 해당 리비전에서 사용할 수 있는 바이너리 패키지와 패키지 리비전을 보여줍니다.
리비전으로 패키지 삭제#
패키지는 여러 단위로 삭제할 수 있습니다:
특정 레시피 리비전 삭제#
특정 레시피 리비전과 그에 연결된 모든 바이너리 패키지를 삭제하려면 다음을 실행합니다:
conan remove "hello/0.1@mycompany/beta#revision_hash" --remote=gitlab
특정 레시피 리비전의 패키지 삭제#
특정 레시피 리비전에 연결된 모든 패키지를 삭제하려면 다음을 실행합니다:
conan remove "hello/0.1@mycompany/beta#revision_hash:*" --remote=gitlab
리비전의 특정 패키지 삭제#
레시피 리비전에서 특정 패키지를 삭제하려면 다음을 사용합니다:
conan remove "package_name/version@user/channel#revision_hash:package_id" --remote=gitlab
불변 리비전 워크플로#
리비전은 불변으로 설계되었습니다. 레시피나 소스 코드를 수정하면 다음과 같이 동작합니다:
- 레시피를 내보내면 새 레시피 리비전이 생성됩니다.
- 이전 레시피 리비전에 속한 기존 바이너리는 포함되지 않습니다. 새 레시피 리비전용 바이너리를 새로 빌드해야 합니다.
- 리비전을 지정하지 않으면 패키지를 설치할 때 Conan 2가 자동으로 최신 리비전을 가져옵니다.
패키지 바이너리는 레시피 리비전과 패키지 참조(Conan 2 문서에서는 package_id)마다 패키지 리비전을 하나만 두는 것이 좋습니다. 같은 레시피 리비전과 패키지 ID에 패키지 리비전이 여러 개 있다면 패키지가 불필요하게 다시 빌드되었다는 뜻입니다.