devpi-server 에 index 생성

사전 준비

사전지식 - 인덱스(index)

  • 앞으로 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

인덱스 설정값 확인

  • devpi getjson 으로 인덱스의 설정값을 확인할 수 있다.
1
devpi getjson /{user_name}/{index_name}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 출력
{
    "result": {
        "acl_toxresult_upload": [
            ":ANONYMOUS:"
        ],
        "acl_upload": [
            "{user_name}"
        ],
        "bases": [
            "root/pypi"
        ],
        "mirror_whitelist": [],
        "mirror_whitelist_inheritance": "intersection",
        "projects": [],
        "type": "stage",
        "volatile": true
    },
    "type": "indexconfig"
}

인덱스 설정값 수정

  • devpi index 명령어로 수정할 수 있다.
1
devpi index /{user_name}/{index_name} 설정항목1=설정값1 [설정학목2=설정값2 ...]
1
2
 # 예시
 devpi index /tester/tester_index volatile=False acl_upload=:ANONYMOUS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 설정값 확인
{
    "result": {
        "acl_toxresult_upload": [
            ":ANONYMOUS:"
        ],
        "acl_upload": [
            ":ANONYMOUS:" // 변경됨
        ],
        "bases": [
            "root/pypi"
        ],
        "mirror_whitelist": [],
        "mirror_whitelist_inheritance": "intersection",
        "projects": [],
        "type": "stage",
        "volatile": false // 변경됨
    },
    "type": "indexconfig"
}

인덱스 삭제

  • devpi index --delete 명령어를 통해 인덱스를 삭제한다.
1
devpi index -y --delete /{user_name}/{index_name}
1
index deleted: http://{HOST}:{PORT}/{user_name}/{index_name}

Reference

devpi-quickstart-releaseprocess
devpi-devpi_indices

Comments