패키지 캐싱 자동화 스크립트

목적

  • devpi 인덱스에 패키지 + 모든 의존성 wheel/sdist를 미리 캐시해두기 위함
  • CI, 서버 초기화, 개발 환경을 폐쇄망으로 이전하기 전에 1회 실행하는 작업

기본 스크립트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env bash
set -e

DEVPI_INDEX="http://{HOST}:{PORT}/{user}/{index}/+simple"
PKG_LIST="pandas pydantic numpy scipy"

python -m venv .warmup-venv
source .warmup-venv/bin/activate

pip install -U pip

pip download \
  --index-url "$DEVPI_INDEX" \
  --dest ./wheelhouse \
  $PKG_LIST
  • wheelhouse/모든 결과물 보존
  • devpi 서버에 캐시

requirements 파일 사용시

1
2
3
4
5
# requirements.txt
pandas
requests
pydantic
fastapi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env bash
set -e

DEVPI_INDEX="http://{HOST}:{PORT}/{user}/{index}/+simple"
REQ_FILE="./requirements.txt"

python -m venv .warmup-venv
source .warmup-venv/bin/activate

pip install -U pip

pip download \
  --index-url "$DEVPI_INDEX" \
  --dest ./wheelhouse \
  -r $REQ_FILE

파이썬 버전 및 플랫폼 고려

1
2
3
4
5
# requirements.txt
pandas
requests
pydantic
fastapi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env bash
set -e

DEVPI_INDEX="http://{HOST}:{PORT}/{user}/{index}/+simple"
DEST_DIR="./wheelhouse"

# 캐싱 대상 패키지 (버전 고정 권장)
REQ_FILE="./requirements.txt"

# Python 버전 (cp 태그 기준)
PY_VERSIONS=(39 310 313)

# 플랫폼 목록
PLATFORMS=(
  "manylinux2014_x86_64"
  "win_amd64"
  "macosx_11_0_arm64"
)

python -m venv .warmup-venv
source .warmup-venv/bin/activate
pip install -U pip

mkdir -p "$DEST_DIR"

for PLATFORM in "${PLATFORMS[@]}"; do
  for PY in "${PY_VERSIONS[@]}"; do
    echo ">>> platform=${PLATFORM}, python=cp${PY}"
    pip download \
      --index-url "$DEVPI_INDEX" \
      --platform "$PLATFORM" \
      --python-version "$PY" \
      --implementation cp \
      --abi "cp${PY}" \
      --only-binary=:all: \
      --dest "$DEST_DIR" \
      -r $REQ_FILE
  done
done

캐싱 자동화 스크립트 사용

  • 자동화 스크립트의 이름은 devpi-warm-up.sh 라고 가정한다.
  • 아래 명령어들을 실행시킨 뒤, 패키지들이 성공적으로 모두 설치되는지 확인한다.
1
2
chmod 755 devpi-warm-up.sh
./devpi-warm-up.sh

Comments