יצא לנו לאחרונה להחליף אתר CMS Umbraco ישן באתר WordPress חדש.
מכיוון שהאתר הישן רכב על תשתיות Azure App Service, היה זה טבעי שאת האתר החדש גם כן נקים על אותן תשתיות ב Azure.
את הפרוייקט הובילו צוותי הפיתוח ואני נדרשתי לתת את דעתי לפני ה- go live, להעיף מבט של ארכיטקט. סך הכל פרויקט יחסית קטן של WordPress. לא רצו להטריד יותר מדי את מנוחתו השלווה של הארכיטקט בזוטות.
תשובתי היתה קצרה ותמציתית – אם ב- WordPress מדובר, אנא תדאגו שהנ"ל ירכב על תשתית Linux ולא Windows. ויתירה מכך, אם כבר מדובר ב Linux ע"ג תשתיות App Service, אנא תדאגו לארח על תשתיות Azure App service for containers.
הסיבה לכך פשוטה:
• פיתוח ע"ג טכנולוגיית Docker Containers, כך שמחזור הפיתוח יהיה זריז וזהה בכל רמות ה- life cycle.
• שימוש ביתרונות של Azure App Service עבור אירוח אתרים. מדובר לדעתי בשירות מצויין ומאובטח אשר מוריד באופן דראסטי את האופרציה וניהול התשתיות. למשל שימוש ב deployment slots למעבר חלק ושקוף של האתר מסביבת פיתוח לסביבת ייצור.
• שימוש בשירות Azure Devops (git) לאירוח של הקוד ויצירת pipeline (CI / CD)
• אגב, Azure App Service for containers, אחד מהייתרונות של שירות זה שהוא מעלה את האפליקציה לעבודה על הדיסק המקומי של Azure App Service, ולא משתמש ב Azure Files (ניתן לבחירה).
חזרו אלי מהפיתוח ותשובתם הייתה – תמצא לנו דרך להעלות את הקוד אל תוך ה- container image ותסביר לנו איך לנהל את כל האופרציה הזו, כולל עדכונים בקוד ועל כך נדבר כאן.
הנחת העבודה שלי הייתה:
• למצוא Docker Image ב- Docker HUB עבור WordPress שכולל את ה- Dockerfile.
• להעלות את פרויקט הDocker- WordPress ואת פרויקט ה WordPress של הפיתוח לתוך GIT (Azure Devops)
• עמדת פיתוח עם Docker Containers. להתקין עליה git. לבצע git clone מתוך ה Azure Devops שיהיה ניתן לפתח מקומית (לא חובה, ניתן לעבוד ישירות מול azure app service slot של פיתוח)
• ACR (Azure Container Registry) עבור Registry פרטי.
• Azure App Service אשר יארח את האתר (יקושר ל ACR)
• Azure Devops. ישמש כ GIT ויבצע את כל ה Pipeline.
וכך תיראה האופרציה של הסביבה:
ע"מ למצוא את ה Docker Image project המתאים, כולל ה- Dockerfile, הקמתי ישירות מתוך Azure Marketplace את ה Wordpress on Azure App Services. בצורה זו ניתן לדעת בדיוק את הנתיב ל Dockerfile ואת ה variables שנצטרך להשתמש בשלב יותר מאוחר ב application settings.
האמת שלא אהבתי את ה שימוש ב- alpine אז לקחתי את הגרסה של PHP ישירות מתוך Docker HUB.
שימו לב שה Docker HUB נותן לינק ישירות ל Git HUB, היכן שפרויקט ה- Dockerfile נמצא.
ה- Dockerfile הינו המתכון אשר ממנו נבנה ה image של docker container.
http://bit.ly/docker_wordpress
לחיצה על הלינק של Dockerfile תביא אותכם ישירות ל- Dockerfile. יש ללכת לתיקיית האב של הפרויקט על מנת שנוכל להעתיק את כולו לתוך ה- Azure Devops. נלחץ על Clone ונעתיק את הלינק.
http://bit.ly/docker-library-wordpress
לאחר שהעתקנו את הלינק, נוכל לגשת ל Azure Devops ולהקים את הפרויקט.
נלחץ על Create project. לאחר שהפרויקט מוקם, נבצע ייבוא מתוך ה Git HUB על ידי repos > files > import > paste the cloned url
בשלב זה יש לנו פרויקט WordPress נקי אשר מאוחסן ב- git פרטי (Azure Devops). כעת ניתן לבנות קונטיינר של WordPress דרך Dockerfile. זהו אתר WordPress אבל אתר בתולי. אנחנו עדיין בבעיה איך "לדחוף" את הקוד של הפיתוח לתוך הקונטיינר הנקי.
ישנן מספר אופציות לבצע זאת. יש כאלו שיקימו git בתוך הקונטיינר. אני הלכתי על פתרון פשוט יותר. להעתיק את הקוד (ספריות) כתת תיקייה בתוך הproject (שהקמנו עבור wordpress). להגדיר ב Dockerfile את השורה הבאה COPY Myproject /var/www/html
בתצורה הזו אני דואג למעשה גם ל pipeline. כל פעם שמפתח ישנה את הקוד ויבצע git commit, יתבצע תהליך של docker build. בכל תהליך docker build יועתק הקוד החדש ל -docker image על ידי ה Dockerfile.
משהו נוסף.
מכיוון שאנו עובדים בשכפול סביבות, פיתוח, ייצור וכו', אנו צריכים לדאוג להוציא את כל הסיסמאות והמשתנים מחוץ לקוד (database name, password). מכיוון שהנ"ל מוגדר בתוך תיקיית wp-config.php בהרצה הראשונה, ערכתי את קובץ ה wp-config.php והכנסתי לא שימוש במשתנים. הנ"ל ישמשו אותי בהגדרות של Azure app service app settings, או בהכנסת -e בהרצת docker run מתחנת Docker מקומית.
עכשיו נוכל להשתמש באותו הקוד בסביבות שונות, אשר כל סביבה תהיה מקושרת לבסיס הנתונים שלה (בסיס נתונים נפרד לפיתוח ובסיס נתונים נפרד לייצור).
מזל טוב. הקוד מוגדר בפרויקט, אפשר להריץ את האתר ולבנות את ה pipeline ב Azure Devops.
השלב הבא הוא להקים Azure Container Registry (ACR), לבנות Docker image, לפרסם אותו ב ACR, להריץ Docker image שהורדנו דרך ה ACR. אני השתמשתי בתחנת dockerמקומית, אבל לפשט את העניין אני אריץ הכל דרך Azure App Service for containers.
את Azure Container Registry ניתן להקים למטרות בדיקה על ה sku הנמוך basic אשר מאפשר עד שני webhook, קישור מתוך ה app service.
http://bit.ly/Create-private-container
נצטרך לספק בסיס נתונים לאתר ה WordPress
http://bit.ly/Create-Azure-Database
אלו הפקודות שהשתמשתי בהן להריץ את ה Docker image מתחנת docker מקומית:
• Install azure cli on linux
• az acr login --name omerregistry
• docker pull omerregistry.azurecr.io/wordpressapp
• docker run -d -e DATABASE_HOST=omery.mysql.database.azure.com -e DATABASE_NAME=wp -e DATABASE_PASSWORD=**** -e DATABASE_USERNAME=omery@omery --name myimage -p 8080:80 omerregistry.azurecr.io/wordpressapp
• docker exec -it myimage /bin/bash
• cat wp-config.php
כעת נדגיר build pipeline אשר יבנה את ה Docker image ויפרסם אותו ב- ACR. ז"א שבכל פעם שהמפתח יבצע git commit יבוצע תהליך של בניית ה image ופרסומו לתוך ה ACR.
נחזור ל- Azure Devops.
מתוך פורטל ה- Azure Devops ניגש לתפריט מצד שמאל pipelines > builds.
עבור תהליך ה build נשתמש בשני tasks. ה task הראשון יבנה את ה Docker image:
• יש לבחור בתפריט ה- command באופציה build.
• נצטרך לבחור את ה- azure subscription שה- ACR מותקן וכן את הנתיב ל Dockerfile.
• בכדי לפשט את הנושא, אני מגדיר latest tag > $(Build.Repository.Name):latest.
ה- task השני ייקח את ה Docker image ויעלה אותו ל ACR. כאן נבחר בתפריט ה command את האופציה push.
לסיום, יש להגדיר continues integration בtrigger menu.
לאחר שמירה,
נבצע הפעלה ידנית של תהליך build שבסופו נקבל image בתוך ה ACR.
חזרה לתפריט ה builds, נוכל ללחוץ על ה build שהרצנו ולראות את התהליך בזמן אמת ואת השגיאות במידה וישנן. להפעלה ידנית של ה build יש ללחוץ על Queue.
השלב הבא הוא ליצור את השירות Azure App service ולמשוך את ה Container image מתוך ה- ACR. מטעמי נוחיות, אני עושה את תהליך ההקמה (app service) ישירות מתוך ה ACR, ולאחר מכן עושה שינויים נדרשים.
נחזור לפורטל Azure > ACR.
ב- repository menu נגיע עד ל- tags וממנו נבחר deploy to web app. הנ"ל יבנה לנו Azure app service עם קישור ל-ACR.
לאחר ששירות ה azure app service הוקם, יש להעתיק את הסיסמא של ה- ACR. היא מוגדרת כמשתנה DOCKER_REGISTRY_SERVER_PASSWORD ב app setting
זה הזמן לחזור ל Azure Devops ולבנות את ה Release pipeline.
ב Release pipeline נגדיר את ה ACR בתור artifact. ז"א שבכל פעם שמבוצע תהליך build שבסיומו נכנס image חדש לACR, יבוצע תהליך של הרצת image חדש של WordPress. במידה והגדרתי Deployment slots אז אצור תהליך מלא של:
• upon new image on the ACR > deploy to staging slot
• upon approval, do swap from stage to prod (manual approval)
ה pipeline שלי יראה בצורה הנ"ל
עבור ה- artifact, אצטרך להגדיר ACR
לאחר הגדרת ה ACR בתור artifact יש להגדיר את ה pipeline עצמו. ז"א להריץ את ה docker image ע"ג ה Azure App Service עם ההגדרות הנכונות (הקמה ל app service staging slots או ישר לייצור במידה ולא הגדרתי deployment slots).
יש לבחור את ה template של App Service Deployment.
במידה והגדרתי deploymentslots אז אצור pipeline נוסף עם swap slot template.
חשוב מאוד לזכור להגדיר ב app settings את המשתנים:
DATABASE_HOST
DATABASE_NAME
DATABASE_PASSWORD
DATABASE_USERNAME
DOCKER_ENABLE_CI > true
WEBSITE_TIME_ZONE > "Israel Standard Time"
DOCKER_REGISTRY_SERVER_URL
DOCKER_REGISTRY_SERVER_USERNAME
WEBSITES_ENABLE_APP_SERVICE_STORAGE > false
בגדול סיימנו. מומלץ להריץ את תהליך ה- ci/cd על ידי הפעלה ידנית של ה- build ולוודא שכל ה- pipeline רץ תקין.
תהליךזה מראה כיצד במספר פעולות פשוטות ניתן להרים תשתית WordPress מלאה. החלמסביבת הפיתוח עד הפצת גרסאות לייצור.
שימוש מושכל ברכיבי Microsoft Azure כדוגמת AzureApp Service, Azure Devops מאפשריםלהרים פרויקט איכותי בזמן שיא תוך דגש מקסימאלי למחזור חיי האפליקציה.
יצא לנו לאחרונה להחליף אתר CMS Umbraco ישן באתר WordPress חדש.
מכיוון שהאתר הישן רכב על תשתיות Azure App Service, היה זה טבעי שאת האתר החדש גם כן נקים על אותן תשתיות ב Azure.
את הפרוייקט הובילו צוותי הפיתוח ואני נדרשתי לתת את דעתי לפני ה- go live, להעיף מבט של ארכיטקט. סך הכל פרויקט יחסית קטן של WordPress. לא רצו להטריד יותר מדי את מנוחתו השלווה של הארכיטקט בזוטות.
תשובתי היתה קצרה ותמציתית – אם ב- WordPress מדובר, אנא תדאגו שהנ"ל ירכב על תשתית Linux ולא Windows. ויתירה מכך, אם כבר מדובר ב Linux ע"ג תשתיות App Service, אנא תדאגו לארח על תשתיות Azure App service for containers.
הסיבה לכך פשוטה:
• פיתוח ע"ג טכנולוגיית Docker Containers, כך שמחזור הפיתוח יהיה זריז וזהה בכל רמות ה- life cycle.
• שימוש ביתרונות של Azure App Service עבור אירוח אתרים. מדובר לדעתי בשירות מצויין ומאובטח אשר מוריד באופן דראסטי את האופרציה וניהול התשתיות. למשל שימוש ב deployment slots למעבר חלק ושקוף של האתר מסביבת פיתוח לסביבת ייצור.
• שימוש בשירות Azure Devops (git) לאירוח של הקוד ויצירת pipeline (CI / CD)
• אגב, Azure App Service for containers, אחד מהייתרונות של שירות זה שהוא מעלה את האפליקציה לעבודה על הדיסק המקומי של Azure App Service, ולא משתמש ב Azure Files (ניתן לבחירה).
חזרו אלי מהפיתוח ותשובתם הייתה – תמצא לנו דרך להעלות את הקוד אל תוך ה- container image ותסביר לנו איך לנהל את כל האופרציה הזו, כולל עדכונים בקוד ועל כך נדבר כאן.
הנחת העבודה שלי הייתה:
• למצוא Docker Image ב- Docker HUB עבור WordPress שכולל את ה- Dockerfile.
• להעלות את פרויקט הDocker- WordPress ואת פרויקט ה WordPress של הפיתוח לתוך GIT (Azure Devops)
• עמדת פיתוח עם Docker Containers. להתקין עליה git. לבצע git clone מתוך ה Azure Devops שיהיה ניתן לפתח מקומית (לא חובה, ניתן לעבוד ישירות מול azure app service slot של פיתוח)
• ACR (Azure Container Registry) עבור Registry פרטי.
• Azure App Service אשר יארח את האתר (יקושר ל ACR)
• Azure Devops. ישמש כ GIT ויבצע את כל ה Pipeline.
וכך תיראה האופרציה של הסביבה:
ע"מ למצוא את ה Docker Image project המתאים, כולל ה- Dockerfile, הקמתי ישירות מתוך Azure Marketplace את ה Wordpress on Azure App Services. בצורה זו ניתן לדעת בדיוק את הנתיב ל Dockerfile ואת ה variables שנצטרך להשתמש בשלב יותר מאוחר ב application settings.
האמת שלא אהבתי את ה שימוש ב- alpine אז לקחתי את הגרסה של PHP ישירות מתוך Docker HUB.
שימו לב שה Docker HUB נותן לינק ישירות ל Git HUB, היכן שפרויקט ה- Dockerfile נמצא.
ה- Dockerfile הינו המתכון אשר ממנו נבנה ה image של docker container.
http://bit.ly/docker_wordpress
לחיצה על הלינק של Dockerfile תביא אותכם ישירות ל- Dockerfile. יש ללכת לתיקיית האב של הפרויקט על מנת שנוכל להעתיק את כולו לתוך ה- Azure Devops. נלחץ על Clone ונעתיק את הלינק.
http://bit.ly/docker-library-wordpress
לאחר שהעתקנו את הלינק, נוכל לגשת ל Azure Devops ולהקים את הפרויקט.
נלחץ על Create project. לאחר שהפרויקט מוקם, נבצע ייבוא מתוך ה Git HUB על ידי repos > files > import > paste the cloned url
בשלב זה יש לנו פרויקט WordPress נקי אשר מאוחסן ב- git פרטי (Azure Devops). כעת ניתן לבנות קונטיינר של WordPress דרך Dockerfile. זהו אתר WordPress אבל אתר בתולי. אנחנו עדיין בבעיה איך "לדחוף" את הקוד של הפיתוח לתוך הקונטיינר הנקי.
ישנן מספר אופציות לבצע זאת. יש כאלו שיקימו git בתוך הקונטיינר. אני הלכתי על פתרון פשוט יותר. להעתיק את הקוד (ספריות) כתת תיקייה בתוך הproject (שהקמנו עבור wordpress). להגדיר ב Dockerfile את השורה הבאה COPY Myproject /var/www/html
בתצורה הזו אני דואג למעשה גם ל pipeline. כל פעם שמפתח ישנה את הקוד ויבצע git commit, יתבצע תהליך של docker build. בכל תהליך docker build יועתק הקוד החדש ל -docker image על ידי ה Dockerfile.
משהו נוסף.
מכיוון שאנו עובדים בשכפול סביבות, פיתוח, ייצור וכו', אנו צריכים לדאוג להוציא את כל הסיסמאות והמשתנים מחוץ לקוד (database name, password). מכיוון שהנ"ל מוגדר בתוך תיקיית wp-config.php בהרצה הראשונה, ערכתי את קובץ ה wp-config.php והכנסתי לא שימוש במשתנים. הנ"ל ישמשו אותי בהגדרות של Azure app service app settings, או בהכנסת -e בהרצת docker run מתחנת Docker מקומית.
עכשיו נוכל להשתמש באותו הקוד בסביבות שונות, אשר כל סביבה תהיה מקושרת לבסיס הנתונים שלה (בסיס נתונים נפרד לפיתוח ובסיס נתונים נפרד לייצור).
מזל טוב. הקוד מוגדר בפרויקט, אפשר להריץ את האתר ולבנות את ה pipeline ב Azure Devops.
השלב הבא הוא להקים Azure Container Registry (ACR), לבנות Docker image, לפרסם אותו ב ACR, להריץ Docker image שהורדנו דרך ה ACR. אני השתמשתי בתחנת dockerמקומית, אבל לפשט את העניין אני אריץ הכל דרך Azure App Service for containers.
את Azure Container Registry ניתן להקים למטרות בדיקה על ה sku הנמוך basic אשר מאפשר עד שני webhook, קישור מתוך ה app service.
http://bit.ly/Create-private-container
נצטרך לספק בסיס נתונים לאתר ה WordPress
http://bit.ly/Create-Azure-Database
אלו הפקודות שהשתמשתי בהן להריץ את ה Docker image מתחנת docker מקומית:
• Install azure cli on linux
• az acr login --name omerregistry
• docker pull omerregistry.azurecr.io/wordpressapp
• docker run -d -e DATABASE_HOST=omery.mysql.database.azure.com -e DATABASE_NAME=wp -e DATABASE_PASSWORD=**** -e DATABASE_USERNAME=omery@omery --name myimage -p 8080:80 omerregistry.azurecr.io/wordpressapp
• docker exec -it myimage /bin/bash
• cat wp-config.php
כעת נדגיר build pipeline אשר יבנה את ה Docker image ויפרסם אותו ב- ACR. ז"א שבכל פעם שהמפתח יבצע git commit יבוצע תהליך של בניית ה image ופרסומו לתוך ה ACR.
נחזור ל- Azure Devops.
מתוך פורטל ה- Azure Devops ניגש לתפריט מצד שמאל pipelines > builds.
עבור תהליך ה build נשתמש בשני tasks. ה task הראשון יבנה את ה Docker image:
• יש לבחור בתפריט ה- command באופציה build.
• נצטרך לבחור את ה- azure subscription שה- ACR מותקן וכן את הנתיב ל Dockerfile.
• בכדי לפשט את הנושא, אני מגדיר latest tag > $(Build.Repository.Name):latest.
ה- task השני ייקח את ה Docker image ויעלה אותו ל ACR. כאן נבחר בתפריט ה command את האופציה push.
לסיום, יש להגדיר continues integration בtrigger menu.
לאחר שמירה,
נבצע הפעלה ידנית של תהליך build שבסופו נקבל image בתוך ה ACR.
חזרה לתפריט ה builds, נוכל ללחוץ על ה build שהרצנו ולראות את התהליך בזמן אמת ואת השגיאות במידה וישנן. להפעלה ידנית של ה build יש ללחוץ על Queue.
השלב הבא הוא ליצור את השירות Azure App service ולמשוך את ה Container image מתוך ה- ACR. מטעמי נוחיות, אני עושה את תהליך ההקמה (app service) ישירות מתוך ה ACR, ולאחר מכן עושה שינויים נדרשים.
נחזור לפורטל Azure > ACR.
ב- repository menu נגיע עד ל- tags וממנו נבחר deploy to web app. הנ"ל יבנה לנו Azure app service עם קישור ל-ACR.
לאחר ששירות ה azure app service הוקם, יש להעתיק את הסיסמא של ה- ACR. היא מוגדרת כמשתנה DOCKER_REGISTRY_SERVER_PASSWORD ב app setting
זה הזמן לחזור ל Azure Devops ולבנות את ה Release pipeline.
ב Release pipeline נגדיר את ה ACR בתור artifact. ז"א שבכל פעם שמבוצע תהליך build שבסיומו נכנס image חדש לACR, יבוצע תהליך של הרצת image חדש של WordPress. במידה והגדרתי Deployment slots אז אצור תהליך מלא של:
• upon new image on the ACR > deploy to staging slot
• upon approval, do swap from stage to prod (manual approval)
ה pipeline שלי יראה בצורה הנ"ל
עבור ה- artifact, אצטרך להגדיר ACR
לאחר הגדרת ה ACR בתור artifact יש להגדיר את ה pipeline עצמו. ז"א להריץ את ה docker image ע"ג ה Azure App Service עם ההגדרות הנכונות (הקמה ל app service staging slots או ישר לייצור במידה ולא הגדרתי deployment slots).
יש לבחור את ה template של App Service Deployment.
במידה והגדרתי deploymentslots אז אצור pipeline נוסף עם swap slot template.
חשוב מאוד לזכור להגדיר ב app settings את המשתנים:
DATABASE_HOST
DATABASE_NAME
DATABASE_PASSWORD
DATABASE_USERNAME
DOCKER_ENABLE_CI > true
WEBSITE_TIME_ZONE > "Israel Standard Time"
DOCKER_REGISTRY_SERVER_URL
DOCKER_REGISTRY_SERVER_USERNAME
WEBSITES_ENABLE_APP_SERVICE_STORAGE > false
בגדול סיימנו. מומלץ להריץ את תהליך ה- ci/cd על ידי הפעלה ידנית של ה- build ולוודא שכל ה- pipeline רץ תקין.
תהליךזה מראה כיצד במספר פעולות פשוטות ניתן להרים תשתית WordPress מלאה. החלמסביבת הפיתוח עד הפצת גרסאות לייצור.
שימוש מושכל ברכיבי Microsoft Azure כדוגמת AzureApp Service, Azure Devops מאפשריםלהרים פרויקט איכותי בזמן שיא תוך דגש מקסימאלי למחזור חיי האפליקציה.
הודעתך לא התקבלה - נסה שוב מאוחר יותר
Oops! Something went wrong while submitting the form