הקמת שרת PyPI ב-5 דקות


לאחרונה יצא לי לדבר בבלוג לא מעט על הצד היותר ״devopsי״ של פיתוח תוכנה. דיברנו קצת על סביבות וירטואליות, על pip, על יצירת חבילות, ואפילו על git submodules. הפוסט הזה ממשיך את הפוסטים הקודמים לו ומדבר עלי איך אנחנו יוצרים שרת אליו ניתן להעלות חבילות פייתון, וכן, לצרוך אותן.

בחברות רבות, גם בזו בה אני עובד כיום, ישנו איסור על העלאה של קוד לציבור הרחב על מנת שלא לחשוף את סודות החברה.

אבל מה אם בכל זאת אנחנו רוצים לשתף חבילות pip בין צוותים בתוך הארגון?
בפוסט הזה אראה את הדרך הפשוטה ביותר שמצאתי להקים שרת PyPI בסיסי, להעלות אליו חבילות לחלוק אותן עם שאר הארגון.

דרישות - מחשב עם docker עליו (נכון, אפילו לא חייבים פייתון) ומכונת לינוקס שתאחסן את השרת.


קובץ הסיסמאות

תחילה ניצור את קובץ הסיסמאות על מנת שלא לשמור סיסמאות בטסקט על הדיסק, ניתן לעשות את זה באמצעות ה cli של htpasswd או פשוט באתר אינטרנט כלשהו שמייצר קבצי סיסמה מסוג htpasswd.

בכדי לעשות זאת נתקין את הכלי שמייצר סיסמאות באופן הבא:
sudo apt-get install apache2-utils # UBUNTU
or
sudo yum install httpd-tools # Red Hat

וניצור את הקובץ כך:

htpasswd -sc htpasswd.txt <some_username>


לאחר שנריץ את זה נתבקש להזין את הסיסמה שאנחנו רוצים לייצר למשתמש שהכנסנו.
כעת נוצר לנו הקובץ htpasswd.txt על הדיסק (במקרה שלי שמתי אותו בתיקיית הבית '~'). מיד נשתמש בו.

הרצת השרת

נריץ את הפקודה:

sudo docker run -d -p 80:8080 -v ~/htpasswd.txt:/data/.htpasswd -v ~/packages:/data/packages pypiserver/pypiserver:latest -P .htpasswd packages

למרות שזה לא העיקר, אסביר בכמה משפטים את הפקודה:
docker run זו מן הסתם הפקודה שאומרת לדוקר להריץ את ה image שלנו, d- יגיד לו לעשות את זה ברקע, p- יקבל במקרה שלנו את הפורט אותו אנחנו רוצים להנגיש ולאיזה פורט באפליקציה אנחנו רוצים לפנות (כלומר, נפנה ל-80, ונופנה ל-8000. אם לא היינו מציינים את p- היינו צריכים לפנות מבחוץ לפורט 8000 על מנת לתקשר עם השרת). v- יקבל תיקייה על השרת שמארח את הדוקר ותיקייה בדוקר קונטיינר עצמו ויגרום לשיתוף בין התיקיות (כלומר, כל מה שאשים ב packages בתיקייה שלי יימצא אוטומטית ב /data/packages על הקונטיינר). pypiserver/pypiserver:latest זהו שם ה image שלנו, שתראו מורד מהאינטרנט בפעם הראשונה שמתקינים. ו P- מסמן עבודה עם קובץ סיסמאות.

וזהו. יש לנו שרת באוויר!
ניתן לבדוק זאת באמצעות הפקודה docker ps או באמצעות גלישה ל ip של המכונה עליה הקמנו את השרת.

העלאת חבילות לשרת

זה כבר החלק הקל. תחילה אם אינכם יודעים איך לייצר חבילה וכיצד הספרייה setuptools פועלת הכנסו למדריך הזה.

כעת מה שנשאר לעשות זה לכתוב את הקובץ .pypirc למחשב ממנו אנחנו רוצים להעלות את החבילות. (המקום הדיפולטי של הקובץ הוא ״~״ אבל הוא יכול לשבת גם תחת תיקיית הפרויקט)

הקובץ יכלול את הנתונים באמצעותם נעלה את החבילות לשרת ויראה כך:

עכשיו נתקין את החבילה שבאמצעותה מבצעים חיבור מאובטח והעלאה לשרת  - twine
pip install twine באמצעות הפקודה

לאחר שהתקנו את twine נריץ את פקודת ההעלאה -
twine upload -r local dist/*
הפקודה תגיד ל twine להעלות לrepository (-r) בשם local (הקישור בין local לכתובת של השרת שלנו נעשה דרך הקובץ pypirc). הקבצים שיועלו במקרה שלנו הם כל הקבצים בתיקייה dist במיקומינו הנוכחי בתוך ה terminal.

אם נרצה נוכל להוסיף את הדגל skip-existing-- בכדי להתעלם מקונפליקטים שיכולים לצוץ. במקרה שנוסיף את הדגל הזה, גרסה שכבר קיימת בשרת לא תועלה שנית אבל גם לא נקבל שום הודעה על כך.

בנוסף, אם שמנו את הקובץ .pypirc תחת תיקיות הפרויקט נוכל להוסיף לפקודה 'config-file='.pypirc-- ואז קובץ הקונפיגורציה ילקח מאיפה שאנחנו מריצים את הפקודה.

הורדת חבילות מהשרת

ישנן מספר דרכים להוריד חבילות משרת pypi לא רשמי. זאת שאני מצאתי נוחה לי היא להוסיף את הרשומות extra-index-url ו trusted-hosts בקובץ ה requirements.txt.
זה יראה כך:

--trusted-host x.x.x.x
--extra-index-url http://x.x.x.x/simple
my-package==1.0.0

סיכום

בפוסט ראינו איך יוצרים שרת pypi פשוט ברגע, ואיך מעלים אליו חבילות באופן מאובטח.

מבין כל הדרכים לנהל תלויות בתוך החברה שלכם, הדרך הטובה ביותר בעיני היא לעבוד עם חבילות מסודרות ולנהל את הגרסאות שלהן. בדרך זו נוכל לדאוג שכל חבילה חיה, עובדת, נבדקת ומתוחזקת בפני עצמה.

מקור - https://github.com/pypiserver/pypiserver

נתראה בפוסט הבא :)

תגובות

  1. יש לנו ריב במשרד, אולי תוכל לעזור:
    איך אומרים בעברית PYPI
    פיפי או קקי

    השבמחק
    תשובות
    1. פִּיפִּי, יש להגות עם דגש ב-פ'.

      תודה לבלשן ל.א

      מחק

הוסף רשומת תגובה

פוסטים פופולריים מהבלוג הזה

מהם קבצי DLL ואיך להשתמש בהם?

תכנות מונחה עצמים | Dependency Inversion Principle

מה ההבדל בין אוטומציה לפיתוח רגיל