Python ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ์˜ Artifact Registry์— ๋Œ€ํ•œ ์ธ์ฆ ๊ตฌ์„ฑ

์ œ3์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐํ•  ๋•Œ๋Š” Artifact Registry์— ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cloud Build ๋˜๋Š” Google CloudGoogle Kubernetes Engine ๋ฐ Cloud Run๊ณผ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ธ์ฆ์„ ๊ตฌ์„ฑํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Artifact Registry๋Š” Python ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ก์„ธ์Šค ํ† ํฐ: ์ž๋™ํ™”, CI/CD ํŒŒ์ดํ”„๋ผ์ธ, ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ๋˜๋Š” ํ‚ค๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ์—์„œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Python ํ‚ค๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (๋กœ์ปฌ ๊ฐœ๋ฐœ์— ๊ถŒ์žฅ): ๊ฐœ๋ฐœ์ž ์›Œํฌ์Šคํ…Œ์ด์…˜์—์„œ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์ƒˆ๋กœ๊ณ ์นจ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ฆ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  1. ๋Œ€์ƒ ์ €์žฅ์†Œ๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ Python Package Repository๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. Python 3์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์•ˆ๋‚ด๋Š”Google Cloud Python ์„ค์ • ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  3. ์‚ฌ์šฉ ์ค‘์ธ ์‚ฌ์šฉ์ž ๊ณ„์ •์ด๋‚˜ ์„œ๋น„์Šค ๊ณ„์ •์— ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. Google Cloud CLI๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Google Cloud CLI๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

    gcloud init

    ์™ธ๋ถ€ ID ๊ณต๊ธ‰์—…์ฒด(IdP)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋จผ์ € ์ œํœด ID๋กœ gcloud CLI์— ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  5. (์„ ํƒ์‚ฌํ•ญ) cloud CLI ๋ช…๋ น์–ด์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ์šฉ ํ† ํฐ ์ƒ์„ฑ

Artifact Registry์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์ธ์ฆํ•˜๋ ค๋ฉด ๋จผ์ € ์ธ์ฆ ํ† ํฐ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŒจํ‚ค์ง€์—์„œ Artifact Registry๋กœ ์š”์ฒญํ•  ๋•Œ ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Google Cloud ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ oauth2 ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Google Cloud์™ธ๋ถ€์—์„œ oauth2l ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ํ† ํฐ์€ 60๋ถ„ ๋™์•ˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ง์ „์— ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ ์ƒˆ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ ์ƒ์„ฑ

Google Cloud๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ oauth2 ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

export ACCESS_TOKEN="oauth2accesstoken:$(gcloud auth print-access-token)"

์ด์ œ Python ํŒจํ‚ค์ง€์—์„œ Artifact Registry๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ACCESS_TOKEN๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ† ํฐ ์ƒ์„ฑ

oauth2l CLI๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์˜ oauth2l๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    go install github.com/google/oauth2l@latest
    
  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    export ACCESS_TOKEN="oauth2l fetch --scope cloud-platform"
    

    Google Cloud ๋Š” SHA256 ํ•ด์‹œ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ACCESS_TOKEN ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ Python ํŒจํ‚ค์ง€์—์„œ Artifact Registry๋กœ ์š”์ฒญํ•  ๋•Œ ACCESS_TOKEN๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pip๋กœ ์ธ์ฆ

ACCESS_TOKEN๋ฅผ ๋‚ด๋ณด๋‚ธ ํ›„ pip์— ์ „๋‹ฌํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pip install PACKAGE --index-url https://$ACCESS_TOKEN@LOCATION-python.pkg.dev/PROJECT/REPOSITORY/simple/

ํ‚ค๋ง์œผ๋กœ ์ธ์ฆ

Python ํ‚ค๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์šด์˜์ฒด์ œ ๋ฐ ์„œ๋“œ ํŒŒํ‹ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์ €์žฅ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” ํ‚ค๋ง ๋ฐฑ์—”๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Artifact Registry๋Š” keyrings.google-artifactregistry-auth ํ‚ค๋ง ๋ฐฑ์—”๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ Artifact Registry ์ €์žฅ์†Œ์˜ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์˜ ์•ˆ๋‚ด์—์„œ๋Š” pip์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์œ ์ผํ•œ ํŒจํ‚ค์ง€ ์ƒ‰์ธ์œผ๋กœ pip๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. pip ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€ ์ƒ‰์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋Œ€์‹  ๊ฐ€์ƒ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Artifact Registry์˜ ๋น„๊ณต๊ฐœ ํŒจํ‚ค์ง€์™€ PyPI์˜ ๊ณต๊ฐœ ํŒจํ‚ค์ง€์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. pip ๋„๊ตฌ๋Š” ํŠน์ • ์ˆœ์„œ๋กœ ํŒจํ‚ค์ง€ ์ƒ‰์ธ์„ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์†Œ๋น„์ž๊ฐ€ ๋น„๊ณต๊ฐœ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜์™€ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ณต๊ฐœ ํŒจํ‚ค์ง€๋ฅผ ์ž˜๋ชป ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—…์ŠคํŠธ๋ฆผ ์†Œ์Šค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…์† ํ•ญ๋ชฉ ํ˜ผ๋™ ์œ„ํ—˜์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ฒ€์ƒ‰ ์ˆœ์„œ

Artifact Registry ํ‚ค๋ง ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋Š” Python ํ”„๋กœ์ ํŠธ์— ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Artifact Registry๊ฐ€ ๋‹ค์Œ ์ˆœ์„œ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด(ADC) - ๋‹ค์Œ ์ˆœ์„œ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ฐพ๋Š” ์ „๋žต

    1. GOOGLE_APPLICATION_CREDENTIALS ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ •์˜๋œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

    2. Compute Engine, Google Kubernetes Engine, Cloud Run, App Engine ๋˜๋Š” Cloud Run ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •์—์„œ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

  2. gcloud auth application-default login ๋ช…๋ น์–ด์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ Google Cloud CLI์—์„œ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

GOOGLE_APPLICATION_CREDENTIALS ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฆ์šฉ ๊ณ„์ •์ด ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ๋ฌธ์ œ ํ•ด๊ฒฐ์ด ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ADC์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณ„์ •์— ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Compute Engine VM, Google Kubernetes Engine ๋…ธ๋“œ, Cloud Run ๋ฒ„์ „์˜ ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •์€ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค๋ง ์„ค์ •

Artifact Registry ํ‚ค๋ง ๋ฐฑ์—”๋“œ๋กœ ์ธ์ฆ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ํ‚ค๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    pip install keyring
    
  2. Artifact Registry ๋ฐฑ์—”๋“œ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    pip install keyrings.google-artifactregistry-auth
    
  3. ๋ฐฑ์—”๋“œ๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ์„ค์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    keyring --list-backends
    

    ์ด ๋ชฉ๋ก์—๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    • ChainerBackend(priority:10)
    • GooglePythonAuth(priority: 9)
  4. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Python ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•  ์ €์žฅ์†Œ ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    gcloud artifacts print-settings python --project=PROJECT \
        --repository=REPOSITORY \
        --location=LOCATION
    

    ๋‹ค์Œ ๊ฐ’์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • PROJECT๋Š” ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • REPOSITORY๋Š” ์ €์žฅ์†Œ ID์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Artifact Registry ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ช…๋ น์–ด์—์„œ ์ƒ๋žต๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • LOCATION์€ ์ €์žฅ์†Œ์˜ ๋ฆฌ์ „ ๋˜๋Š” ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  5. .pypirc ํŒŒ์ผ์— ๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์œ„์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • Linux ๋ฐ macOS: $HOME/.pypirc
    • Windows: %USERPROFILE%\.pypirc
    [distutils]
    index-servers =
        PYTHON-REPO-ID
    
    [PYTHON-REPO-ID]
    repository = https://LOCATION-python.pkg.dev/PROJECT/REPOSITORY/
    

    ๋‹ค์Œ ๊ฐ’์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • PYTHON-REPO-ID๋Š” Twine๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ ID์ž…๋‹ˆ๋‹ค.
    • PROJECT๋Š” ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • REPOSITORY๋Š” ์ €์žฅ์†Œ ID์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Artifact Registry ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ช…๋ น์–ด์—์„œ ์ƒ๋žต๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • LOCATION์€ ์ €์žฅ์†Œ์˜ ๋ฆฌ์ „ ๋˜๋Š” ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  6. ์ €์žฅ์†Œ๋ฅผ pip ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์œ„์น˜๋Š” ์‚ฌ์šฉ์ž๋ณ„ ํŒŒ์ผ์ด๋‚˜ ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ€์ƒ ํ™˜๊ฒฝ๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ• ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

    ์šด์˜์ฒด์ œ ์‚ฌ์šฉ์ž์™€ ์—ฐ๊ฒฐ๋œ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • Unix: $HOME/.config/pip/pip.conf ๋˜๋Š” $HOME/.pip/pip.conf
    • macOS: /Library/Application Support/pip/pip.conf ๋˜๋Š” $HOME/.config/pip/pip.conf
    • Windows: %APPDATA%\pip\pip.ini ๋˜๋Š” %USERPROFILE%\pip\pip.ini

    ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ:

    • Unix ๋ฐ macOS: $VIRTUAL_ENV/pip.conf
    • Windows: %VIRTUAL_ENV%\pip.ini

    ์ €์žฅ์†Œ๋งŒ ๊ฒ€์ƒ‰ํ•˜๋„๋ก pip๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด index-url ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ณ  extra-index-url ์„ค์ •์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ์ƒ‰์ธ์ด ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    [global]
    index-url = https://LOCATION-python.pkg.dev/PROJECT/REPOSITORY/simple/
    

    ์ €์žฅ์†Œ ๊ฒฝ๋กœ ๋์— ์žˆ๋Š” /simple/ ๋ฌธ์ž์—ด์€ ์ €์žฅ์†Œ์—์„œ Python Simple Repository API๋ฅผ ๊ตฌํ˜„ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด์ œ Python ํ™˜๊ฒฝ์ด Artifact Registry๋กœ ์ธ์ฆํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•œ ํ‚ค๋ง ์ธ์ฆ

ํ‚ค๋ง์„ ์„ค์ •ํ•œ ํ›„์— gcloud CLI์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ํ‚ค๋ง์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python Package Repository์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „์— Google Cloud CLI์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud auth login

์„œ๋น„์Šค ๊ณ„์ • ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ํ‚ค๋ง ์ธ์ฆ

ํ‚ค๋ง์„ ์„ค์ •ํ•œ ํ›„์— ์ธ์ฆ์„ ์œ„ํ•œ ์„œ๋น„์Šค ๊ณ„์ •์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ž๋™ํ™”์— ์‚ฌ์šฉํ•  ๊ธฐ์กด ์„œ๋น„์Šค ๊ณ„์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ์ €์žฅ์†Œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ๊ณ„์ •์— ์ ์ ˆํ•œ Artifact Registry ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด(๊ถŒ์žฅ)

      ์ €์žฅ์†Œ์™€ ์—ฐ๊ฒฐํ•  ๋•Œ Artifact Registry ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋„์šฐ๋ฏธ๊ฐ€ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ํŒŒ์ผ ์œ„์น˜๋ฅผ ๋ณ€์ˆ˜ GOOGLE_APPLICATION_CREDENTIALS์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

      export GOOGLE_APPLICATION_CREDENTIALS=KEY-FILE
      
    • gcloud CLI ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

      ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „์— ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. Artifact Registry๋Š” gcloud CLI์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ณด๋‹ค VM ์„œ๋น„์Šค ๊ณ„์ • ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๋จผ์ € ์ฐพ์œผ๋ฏ€๋กœ Compute Engine VM์—์„œ ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

      gcloud auth activate-service-account --key-file=KEY-FILE
      

    KEY-FILE์„ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ ๊ตฌ์„ฑ

์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋Š” ์žฅ๊ธฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

  • ์ €์žฅ์†Œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „์šฉ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค ๊ณ„์ •์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ Artifact Registry ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„ํ‹ฐํŒฉํŠธ๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— Artifact Registry ๋ฆฌ๋”๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐ์ง์˜ ๊ทธ๋ฃน์— ํŠน์ • ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์•ก์„ธ์Šค ์ˆ˜์ค€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์ด ์•„๋‹Œ ์ €์žฅ์†Œ ์ˆ˜์ค€์—์„œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ด€๋ฆฌ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์ธ์ฆ์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Œ€์‹  ์ž‘๋™ํ•˜๋„๋ก ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ž๋™ํ™”์— ์‚ฌ์šฉํ•  ๊ธฐ์กด ์„œ๋น„์Šค ๊ณ„์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    Artifact Registry๋กœ ์ธ์ฆ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ํŒŒ์ผ์˜ ์œ„์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ณ„์ •์˜ ๊ฒฝ์šฐ ์„œ๋น„์Šค ๊ณ„์ • ํŽ˜์ด์ง€์—์„œ ํ‚ค๋ฅผ ๋ณด๊ณ  ์ƒˆ ํ‚ค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์„œ๋น„์Šค ๊ณ„์ • ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. ์ €์žฅ์†Œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ๊ณ„์ •์— ์ ์ ˆํ•œ Artifact Registry ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Python ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•  ์ €์žฅ์†Œ ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    gcloud artifacts print-settings python --project=PROJECT \
        --repository=REPOSITORY \
        --location=LOCATION \
        --json-key=KEY-FILE
    

    ๋‹ค์Œ ๊ฐ’์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • PROJECT๋Š” ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • REPOSITORY๋Š” ์ €์žฅ์†Œ ID์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Artifact Registry ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ช…๋ น์–ด์—์„œ ์ƒ๋žต๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • LOCATION์€ ์ €์žฅ์†Œ์˜ ๋ฆฌ์ „ ๋˜๋Š” ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
    • KEY-FILE์€ ์„œ๋น„์Šค ๊ณ„์ • JSON ํ‚ค ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
  4. .pypirc ํŒŒ์ผ์— ๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋ณ„ pip ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ์œ„์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • Linux ๋ฐ macOS: $HOME/.pypirc
    • Windows: %USERPROFILE%\.pypirc
    [distutils]
    index-servers =
        PYTHON-REPO-ID
    
    [PYTHON-REPO-ID]
    repository = https://LOCATION-python.pkg.dev/PROJECT/REPOSITORY/
    username: _json_key_base64
    password: KEY
    

    ๋‹ค์Œ ๊ฐ’์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • PYTHON-REPO-ID๋Š” Twine๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ ID์ž…๋‹ˆ๋‹ค.
    • PROJECT๋Š” ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • REPOSITORY๋Š” ์ €์žฅ์†Œ ID์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Artifact Registry ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ช…๋ น์–ด์—์„œ ์ƒ๋žต๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • LOCATION์€ ์ €์žฅ์†Œ์˜ ๋ฆฌ์ „ ๋˜๋Š” ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
    • KEY๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ํŒŒ์ผ์˜ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ํ‚ค์ž…๋‹ˆ๋‹ค.
  5. ์ €์žฅ์†Œ๋ฅผ pip ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. pip ๊ตฌ์„ฑ ํŒŒ์ผ ์œ„์น˜๋Š” ์‚ฌ์šฉ์ž๋ณ„ ํŒŒ์ผ ๋˜๋Š” ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ€์ƒ ํ™˜๊ฒฝ๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ• ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

    ์šด์˜์ฒด์ œ ์‚ฌ์šฉ์ž์™€ ์—ฐ๊ฒฐ๋œ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • Unix: $HOME/.config/pip/pip.conf ๋˜๋Š” $HOME/.pip/pip.conf
    • macOS: /Library/Application Support/pip/pip.conf ๋˜๋Š” $HOME/.config/pip/pip.conf
    • Windows: %APPDATA%\pip\pip.ini ๋˜๋Š” %USERPROFILE%\pip\pip.ini

    ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ:

    • Unix ๋ฐ macOS: $VIRTUAL_ENV/pip.conf
    • Windows: %VIRTUAL_ENV%\pip.ini

    ๋‹ค์Œ ์ค„์„ pip ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    [global]
    index-url = https://_json_key_base64:KEY@LOCATION-python.pkg.dev/PROJECT/REPOSITORY/simple/
    
    • KEY๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ํŒŒ์ผ์˜ ๋น„๊ณต๊ฐœ ํ‚ค์ž…๋‹ˆ๋‹ค.
    • ์ €์žฅ์†Œ ๊ฒฝ๋กœ ๋์— ์žˆ๋Š” /simple/ ๋ฌธ์ž์—ด์€ ์ €์žฅ์†Œ์—์„œ Python Simple Repository API๋ฅผ ๊ตฌํ˜„ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„