Harbor 레지스트리

Harbor 레지스트리 활성화

Harbor 레지스트리를 활성화하려면 그룹이나 프로젝트의 Harbor 통합을 구성해야 합니다. Harbor 구성에는 url, project_name, usernamepassword 네 가지 필드가 필요합니다.

필드 설명
url Harbor 인스턴스의 URL입니다.
project_name Harbor 인스턴스의 프로젝트 이름입니다.
username Harbor 인스턴스에 로그인하는 데 사용되는 사용자 이름입니다.
password Harbor 인스턴스에 로그인하는 데 사용되는 비밀번호입니다.

GitLab CI/CD predefined variables와 다음 Harbor 레지스트리 변수를 함께 사용하여 Harbor 인스턴스에서 데이터를 요청할 수 있습니다.

변수 설명
HARBOR_URL Harbor 인스턴스의 URL입니다.
HARBOR_HOST Harbor 인스턴스 URL의 호스트입니다.
HARBOR_OCI Harbor 인스턴스 URL의 OCI입니다.
HARBOR_PROJECT Harbor 인스턴스의 프로젝트 이름입니다.
HARBOR_USERNAME Harbor 인스턴스에 로그인하는 데 사용되는 사용자 이름입니다.
HARBOR_PASSWORD Harbor 인스턴스에 로그인하는 데 사용되는 비밀번호입니다.

설정 테스트

설정을 테스트할 때 Harbor 인스턴스의 /api/v2.0/ping으로 요청이 전송됩니다. 성공적인 테스트는 상태 코드 200을 반환합니다. 이 테스트는 주로 Harbor 인스턴스가 올바르게 구성되었는지 확인하는 용도입니다. 이 테스트는 usernamepassword가 올바른지 검증하지는 않습니다.

코드 구조

app/controllers/concerns/harbor
├── access.rb
├── artifact.rb
├── repository.rb
└── tag.rb

app/controllers/projects/harbor
├── application_controller.rb
├── artifacts_controller.rb
├── repositories_controller.rb
└── tags_controller.rb

app/controllers/groups/harbor
├── application_controller.rb
├── artifacts_controller.rb
├── repositories_controller.rb
└── tags_controller.rb

app/models/integrations/harbor.rb

app/serializers/integrations/harbor_serializers
├── artifact_entity.rb
├── artifact_serializer.rb
├── repository_entity.rb
├── repository_serializer.rb
├── tag_entity.rb
└── tag_serializer.rb

lib/gitlab/harbor
├── client.rb
└── query.rb

app/controllers/projects/harborapp/controllers/groups/harbor의 컨트롤러는 프론트엔드 호출을 위한 API 인터페이스를 제공합니다.

app/controllers/concerns/harbor 하위의 모듈은 컨트롤러에서 사용되는 일부 공통 메서드를 제공합니다.

Harbor 통합 모델은 app/models/integrations에 있으며 Harbor 통합에 대한 구성 정보가 포함되어 있습니다.

app/serializers/integrations/harbor_serializers 하위의 직렬화기는 app/controllers/projects/harborapp/controllers/groups/harbor의 컨트롤러에서 사용되며 응답의 JSON 데이터를 직렬화하는 데 도움을 줍니다.

lib/gitlab/harbor 디렉토리에는 Harbor 클라이언트가 포함되어 있으며 Harbor 인스턴스로 데이터를 검색하기 위해 API 요청을 보냅니다.

순서도

Harbor 인스턴스GitLabClientHarbor 인스턴스GitLabClientHarbor 레지스트리 요청API를 통한 저장소 데이터 요청저장소 데이터저장소 데이터 반환Harbor 레지스트리 아티팩트 요청API를 통한 아티팩트 데이터 요청아티팩트 데이터아티팩트 데이터 반환Harbor 레지스트리 태그 요청API를 통한 태그 데이터 요청태그 데이터태그 데이터 반환

정책

그룹 및 프로젝트의 read_harbor_registry 정책은 사용자가 Harbor 레지스트리에 액세스할 수 있는지를 제어하는 데 사용됩니다. 이 정책은 적어도 Reporter 역할을 가진 모든 사용자에게 활성화됩니다.

프론트엔드 개발

관련 프론트엔드 코드는 app/assets/javascripts/packages_and_registries/harbor_registry/ 디렉토리에 있습니다. 파일 구조는 다음과 같습니다.

├── components
│   ├── details
│   │   ├── artifacts_list_row.vue
│   │   ├── artifacts_list.vue
│   │   └── details_header.vue
│   ├── list
│   │   ├── harbor_list_header.vue
│   │   ├── harbor_list_row.vue
│   │   └── harbor_list.vue
│   ├── tags
│   │   ├── tags_header.vue
│   │   ├── tags_list_row.vue
│   │   └── tags_list.vue
│   └── harbor_registry_breadcrumb.vue
├── constants
│   ├── common.js
│   ├── details.js
│   ├── index.js
│   └── list.js
├── pages
│   ├── details.vue
│   ├── harbor_tags.vue
│   ├── index.vue
│   └── list.vue
├── index.js
├── router.js
└── utils.js

참고: REST API 대신 GraphQL을 사용하는 이유를 확인하려면 이 토론을 확인할 수 있습니다.

파일 harbor_registry/pages/index.vue에는 단일 Vue router-view 컴포넌트만 포함되어 있으며 router.js를 통해 이미지 목록, 이미지 상세, 태그 목록 페이지로 이동합니다.

registry_breadcrumb.vue 컴포넌트는 다중 수준 경로를 지원하지 않기 때문에, harbor_registry/components/harbor_registry_breadcrumb.vue 컴포넌트를 다시 구현했습니다.

harbor_registry_breadcrumb.vue에 경로 배열을 전달하여 다중 수준의 breadcrumb 컴포넌트를 생성할 수 있습니다.

const routeNameList = [];
const hrefList = [];

this.breadCrumbState.updateName(nameList);
this.breadCrumbState.updateHref(hrefList);