앞으로 devpi, 그리고 PyPI 서버에 대해 알아가다보면 인덱스(index)라는 용어가 자주 등장한다.
인덱스란, ”패키지를 담는 논리적인 저장소 단위”로, 파이썬 패키지와 버전을 그룹으로 관리하는 공간을 뜻한다.
패키지를 저장하고 배포하는 논리적인 채널(channel)이자 저장소(storage)이고
패키지를 패키지의 이름과 릴리즈(버전) 및 목적과 정책 등으로 분리 관리하기 위한 구조이며
패키지의 실제 동작을 일으키는 소스 및 설치 파일, 그리고 패키지에 대한 메타데이터가 저장된다.
어떤 인덱스는 자신이 아닌 다른 인덱스를 참조할 수 있다.
개인적으로는 패키지 레지스트리(package registry) 라고 표현하면 가장 정확한 표현이 아닐까 생각이 된다.
index 생성 작업 순서
(1) devpi-client 가 server 를 가리키도록 설정
(2) devpi-server 로그인 → 인덱스 생성
생성 방법
🤖 : devpi 가 설치된 서버
🧑💻 : 사용자. devpi 로 패키지 설치 요청을 보내는 클라이언트
이번 포스팅은 어느 곳에서 해도 상관 없습니다!
devpi 클라이언트가 devpi-server 를 가리키게 하기
1
devpi use http://{HOST}:{PORT}
1
2
3
4
5
6
7
8
# 출력
using server: http://{HOST}:{PORT}/ (not logged in)
no current index: type'devpi use -l' to discover indices
/root/.config/pip/pip.conf: no config file exists
/root/.config/uv/uv.toml: no config file exists
/root/.pydistutils.cfg: no config file exists
/root/.buildout/default.cfg: no config file exists
always-set-cfg: no
신규 사용자 추가
앞으로 사용할 임의의 사용자 이름과 비밀번호를 지정
1
devpi user -c{user_name}password={password}
1
2
# 출력
user created: {user_name}
사용자 로그인
생성한 사용자 계정으로 로그인
1
devpi login {new_user_name}--password={password}
1
2
# 출력
logged in'{new_user_name}', credentials valid for 10.00 hours
인덱스 생성
1
2
3
4
devpi index -c{new_index_name}bases={base_user}/{base_index}# -c : create. 새로운 인덱스 생성# bases : 참조할 상위 인덱스
1
2
3
4
5
6
7
8
9
# 출력
http://{HOST}:{PORT}/{new_user_name}/{new_index_name}?no_projects=:
type=stage
bases={base_user}/{base_index}volatile=True
acl_upload={new_user_name}acl_toxresult_upload=:ANONYMOUS:
mirror_whitelist=mirror_whitelist_inheritance=intersection
새로 생성한 인덱스 사용
1
devpi use {new_user_name}/{new_index_name}
1
2
3
4
5
6
7
8
9
# 출력
current devpi index: http://{HOST}:{PORT}/{new_user_name}/{new_index_name}(logged in as {new_user_name})
supported features: push-no-docs, push-only-docs, push-register-project, server-keyvalue-parsing
/root/.config/pip/pip.conf: no config file exists
/root/.config/uv/uv.toml: no config file exists
/root/.pydistutils.cfg: no config file exists
/root/.buildout/default.cfg: no config file exists
always-set-cfg: no
인덱스 생성 결과 확인
브라우저를 통해 http:{HOST}:{PORT} 로 접속하면 신규 유저의 인덱스가 생성된 것을 볼 수 있다.
devpi cli 에서는 devpi use -l 명령어를 통해 사용 가능한 인덱스를 확인할 수 있다.
1
devpi use -l
1
2
3
# 출력
root/pypi bases=volatile=False
tester/tester_index bases=root/pypi volatile=True
인덱스 설정
인덱스 설정값
앞서서 인덱스를 새로이 생성했을 때 출력된 내용에서 인덱스의 설정값들을 확인할 수 있다.
1
2
3
4
5
6
7
8
9
# 출력
http://{HOST}:{PORT}/{new_user_name}/{new_index_name}?no_projects=:
type=stage
bases={base_user}/{base_index}volatile=True
acl_upload={new_user_name}acl_toxresult_upload=:ANONYMOUS:
mirror_whitelist=mirror_whitelist_inheritance=intersection
설정 항목
설명
값
type
- 인덱스의 종류
- stage : 일반 사용자 인덱스. 업로드, 설치, base 상속이 가능 - mirror : PyPI 미러
bases
- 이 인덱스가 상속하는 상위(base) 인덱스 - 현재 인덱스에 없는 패키지는 이 base 인덱스에서 검색된다.
- {base_user}/{base_index} - 예) root/pypi
volatile
- 패키지를 재업로드(덮어쓰기)할 수 있는지 여부 - 개발용 인덱스에서는 보통 True - 직역하면 휘발성
- True : 재업로드(덮어쓰기) 허용 - False : 한 번 업로드된 버전은 변경 불가
acl_upload
- 이 인덱스에 패키지를 업로드할 수 있는 사용자 목록
- :ANONYMOUS: : 비인증 사용자도 허용함 - 혹은 특정 유저 지정
acl_toxresult_upload
- tox 테스트 결과를 업로드할 수 있는 주체 목록
- :ANONYMOUS: : 비인증 사용자도 허용함 - 혹은 특정 유저 지정
mirror_whitelist
- mirror/base 인덱스에서 허용할 패키지 이름 목록 - 비어 있으면 제한을 두지 않는다.
- requests, numpy .. 등 패키지
mirror_whitelist_inheritance
- bases가 여러 개일 때 whitelist를 어떻게 상속/결합할지 결정
- intersection : 모든 bases의 whitelist 교집합만 허용 - union : 모든 bases 의 whitelist 허용
인덱스 생성시에 설정값 부여
아래와 같이 생성과 동시에 설정값을 부여할 수 있다.
1
2
3
4
5
6
devpi index -c dev \bases=root/pypi \volatile=True \acl_upload=dev1,dev2 \mirror_whitelist=requests,numpy \mirror_whitelist_inheritance=intersection
Comments