في مقال سابق، استعرضنا كيفية أتمتة التوزيعات على Heroku باستخدام GitLab CI/CD. كان هذا الإعداد يوزع التطبيق على بيئته الإنتاجية في كل مرة نرسل فيها كود إلى الفرع main
.
في هذا المقال، سنأخذ في الاعتبار مقاربة أكثر دقة قليلاً: ماذا لو كان لدينا بيئات متعددة؟ معظم المنظمات الهندسية تستخدم على الأقل ثلاث بيئات: بيئة التطوير المحلي، وبيئة التشغيل، وبيئة الإنتاج.
بالإضافة إلى ذلك، يتبع بعض فرق الهندسة استراتيجية Gitflow الفرعية، حيث لديهم فرع dev
وفرع main
. هذه الاستراتيجية لم تعد تفضيلية وتم استبدالها باستراتيجية التطوير القائم على الساق الرئيسي، ولكن من غير غير المألوف أن تجد منظمات لا تزال تتبع هذه الممارسة.
اليوم، سنستعرض كيفية إعداد GitLab CI/CD لتنفيذ تطبيقنا في بيئة الاستدلال عند دفعنا إلى الفرع dev
و تنفيذ تطبيقنا في بيئة الإنتاج عند دفعنا إلى الفرع main
.
البداية
قبل أن نبدأ، سنحتاج لشيئين: حساب Heroku وحساب GitLab.
Heroku هي مكان رائع لاستضافة و تنفيذ تطبيقاتك. كمنصة كخدمة (PaaS)، تتيح لك Heroku التركيز على بناء أشياء رائعة بينما تغطي جزءًا كبيرًا من تعقيد البنية التحتية. يمكنك إنشاء حساب Heroku هنا.
GitLab هو مكان رائع لاستخدام كودك. بجانب كونه أداة لإدارة الكود المصدر، يقدم GitLab أيضًا capacités CI/CD أصلية يمكنك من إعداد أنابيب لاختبار و تنفيذ كودك دون الحاجة إلى أداة ثالثة. يمكنك إنشاء حساب GitLab هنا.
التطبيق العرضي الموضح في هذا المقال يستخدم كلاً من GitLab و Heroku. يمكنك إيجاد جميع الكود في مستودع GitLab هنا.
تشغيل التطبيق محليًا
يمكنك تشغيل التطبيق محليًا عن طريق استنساخ الم repository، وتثبيت التبعيات، وتشغيل أمر البدء. في terminal، قم بما يلي:
$ git clone https://gitlab.com/tylerhawkins1/heroku-gitflow-staging-production-gitlab-cicd-demo.git $ cd heroku-gitflow-staging-production-gitlab-cicd-demo $ npm install $ npm start
بعد بدء التطبيق، قم بزيارة هذا ال=localhost في متصفحك، وسترى التطبيق يعمل محليًا:
تطبيق Demo على Heroku
نشر تطبيقنا على Heroku
الآن بعد أن يعمل التطبيق محليًا، دعونا ننشره على Heroku حتى يمكنك الوصول إليه في كل مكان، وليس فقط على جهازك.
تذكر أننا سننشر تطبيقك في بيئة staging وبيئة إنتاج.这意味着 أننا سنكون لدينا تطبيقين Heroku يعتمدين على نفس repository GitLab.
إذا لم يكن لديك Heroku CLI مثبتًا على جهازك، فأنت بحاجة إلى تثبيته قبل المتابعة.
بعد تثبيت Heroku CLI، قم بتنفيذ الأوامر التالية من terminal لفحص الفرع main
، إنشاء تطبيق Heroku جديد للإنتاج، نشره إلى بيئة الإنتاج، وفتحه في متصفحك:
$ git checkout main $ heroku create heroku-gitlab-ci-cd-production --remote heroku-production $ git push heroku-production main $ heroku open --remote heroku-production
بذلك، يجب أن ترى نفس التطبيق، ولكن هذه المرة يعمل على عنوان Heroku بدلاً من localhost. عمل جيد — لقد نشرت تطبيقك على Heroku في الإنتاج!
لكن، لم ننتهي بعد. نحتاج أيضًا إلى تهيئة ونشر تطبيق staging الخاص بك. للقيام بذلك، قم بتنفيذ نفس مجموعة الأوامر المماثلة التي تظهر أدناه:
$ git checkout dev $ heroku create heroku-gitlab-ci-cd-staging --remote heroku-staging $ git push heroku-staging main $ heroku open --remote heroku-staging
الآن سيتم نشر التطبيق نفسه مرة أخرى، ولكن هذه المرة إلى عنوان URL مختلف سيخدم كبيئة staging الخاصة بك. الأن لدينا كلا البيئتين configurated!
لاحظ الفروق وال相似 بين الأوامر للتطبيق الإنتاجي والتطبيق staging:
- التطبيق الإنتاجي يستخدم الفرع
main
، والتطبيق staging يستخدم الفرعdev
. - التطبيق الإنتاجي يُدعى
heroku-gitlab-ci-cd-production
، والتطبيق staging يُدعىheroku-gitlab-ci-cd-staging
. - git remote للتطبيق الإنتاجي يُدعى
heroku-production
، وgit remote للتطبيق staging يُدعىheroku-staging
. - كلا التطبيقين الإنتاجي والstaging git remotes يستخدمان فرع
main
، لأن Heroku يوزع التطبيق فقط عندما يتم دفع الكود إلى فرعه الرئيسي.
تذكر أن هذا الفرع main
يختلف عن فرعك من main
و dev
. الفرع main
الذي تقوم بدفع الكود إليه هو الفرع main
على git remote خاصتك — في هذه الحالة، Heroku.
عندما تكون في فرعك المحلي main
وتمرر الأمر git push heroku-production main
، فأنت تقوم بدفع فرعك main
إلى فرع main
لتطبيق Heroku الإنتاجي. وعندما تكون في فرعك المحلي dev
وتمرر الأمر git push heroku-staging main
، فأنت تقوم بدفع فرعك dev
إلى فرع main
لتطبيق Heroku الاستعجالي.
جعل التغييرات على تطبيقنا
الآن بعد أن لدينا تطبيق Heroku يعمل، ماذا لو أردنا إجراء بعض التغييرات؟ تبعًا لتقريب تقريبية استراتيجية Gitflow، يمكننا القيام بما يلي:
- التحقق من الفرع
dev
- جعل التغييرات في الكود
- إضافة، وتأكيد، وتحديث هذه التغييرات إلى الفرع
dev
- نشر هذه التغييرات على تطبيق Heroku الاستعجالي عن طريق تشغيل الأمر
git push heroku-staging main
- التحقق من الفرع
main
- دمج الفرع
dev
في الفرعmain
- نشر هذه التغييرات على تطبيق Heroku الإنتاجي عن طريق تشغيل الأمر
git push heroku-production main
(إذا كنا نتبع حقًا Gitflow، لقمنا بإنشاء فرع ميزة للدمج في dev
، وفرع إصدار للدمج في main
،但我们 تجاهلنا هذه الخطوات للحفاظ على البساطة.)
الآن، ألن يكون من الجيد لو могли أتمتة النشر إلى أي من بيئاتنا بدلاً من الحاجة إلى نشرها يدويًا دائمًا؟
هذا هو المكان الذي يأتي فيه GitLab CI/CD في اللعب.
التكامل المستمر / التوزيع المستمر
التكامل المستمر (CI) يتعلق بالمشاركة بشكل متكرر و الحفاظ على حالة البناء في أفضل حالاته دائمًا. عادةً ما يمكنك التحقق من حالة البناء عن طريق تشغيل الفحوصات في pipeline CI. قد تشمل هذه الفحوصات مُحسنات، اختبارات وحدة، و/أو اختبارات نهاية إلى نهاية.
التوزيع المستمر (CD) يتعلق بالتوزيع بشكل متكرر. إذا اجتازت الفحوصات في pipeline CI، يتم توزيع البناء. إذا فشلت الفحوصات في pipeline CI، لا يتم توزيع البناء.
باستخدام GitLab CI/CD، يمكننا تكوين pipeline CI الخاص بنا للقيام بهذا تمامًا – تشغيل اختباراتنا ثم توزيع تطبيقنا على Heroku إذا اجتازت الاختبارات جميعها. الأكثر أهمية لمنظمتنا، يمكننا تكوين قواعد داخل pipeline CI لتحديد مكان توزيع التطبيق.
تكوين GitLab CI/CD
يمكننا إنشاء pipeline CI في GitLab programmatically باستخدام ملف .gitlab-ci.yml
. ملفنا يبدو هكذا:
image: node:20.10.0
cache:
paths:
- node_modules/
before_script:
- node -v
- npm install
stages:
- test
- deploy
unit-test-job:
stage: test
script:
- npm test
deploy-job:
stage: deploy
variables:
HEROKU_APP_NAME: $HEROKU_APP_NAME_PRODUCTION
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
variables:
HEROKU_APP_NAME: $HEROKU_APP_NAME_PRODUCTION
- if: $CI_COMMIT_REF_NAME =~ /dev/
variables:
HEROKU_APP_NAME: $HEROKU_APP_NAME_STAGING
script:
- apt-get update -yq
- apt-get install -y ruby-dev
- gem install dpl
- dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY
pipelines CI في GitLab تتكون من مراحل وأعمال. يمكن لكل مرحلة احتواء عمل أو أكثر. في pipeline الخاص بنا، لدينا مرحلتين: test
و deploy
. في مرحلة test
، ننفذ اختباراتنا الوحدة في unit-test-job
. في مرحلة deploy
، نوزع تطبيقنا على Heroku في deploy-job
.
يمكننا فقط التقدم إلى المرحلة التالية إذا اجتازت جميع الأعمال في المرحلة السابقة.这意味着 إذا فشلت اختبارات الوحدة، فلن يتم توزيع التطبيق، وهذا أمر جيد! لا نريد توزيع تطبيقنا إذا كان في حالة سيئة.
ستلاحظ أن مرحلة deploy
تحتوي على قسم rules
يحتوي على بعض المنطق الشرطي. هنا نحدد إلى أي بيئة يجب نشر تطبيقنا. إذا كنا في الفروع main
، فإننا ننشر تطبيق الإنتاج. وإذا كنا في الفروع dev
، فإننا ننشر تطبيق الاستدلال.
ستلاحظ أيضًا أن مرحلة deploy
تشير إلى متغيرات متعددة تُدعى $HEROKU_APP_NAME_PRODUCTION
، $HEROKU_APP_NAME_STAGING
، و$HEROKU_API_KEY
. هذه يتم تخزينها كمتغيرات CI/CD داخل GitLab.
إذا كنت تقوم بتهيئة هذا في حساب GitLab الخاص بك، ستحتاج أولاً إلى إيجاد مفتاح API في حساب Heroku الخاص بك. داخل إعدادات حساب Heroku الخاص بك، يجب أن ترى قسمًا لمفتاح API. إذا لم تكن قد أنشأت مفتاح API بعد، أنشئ واحدًا الآن.

ثم، في مشروع GitLab الخاص بك، انقر على إعدادات > CI/CD > المتغيرات. قم بتمديد هذا القسم وأضف ثلاثة متغيرات جديدة:
- Value for
$HEROKU_API_KEY
will be the API key from your Heroku account. - The value for
$HEROKU_APP_NAME_PRODUCTION
will be the name of your production Heroku app. My production app’s name isheroku-gitlab-ci-cd-production
, but since Heroku app names are universally unique, yours will be something different. - 价值变量
$HEROKU_APP_NAME_STAGING
将是你暂存 Heroku 应用的名称。我的暂存应用名称是heroku-gitlab-ci-cd-staging
。再说一次,因为 Heroku 应用名称是全局唯一的,所以你的将会是不同的。

这样,你的 GitLab CI 管道就已经准备好使用了!让我们来测试一下。
将我们的 Heroku 应用部署到暂存环境
让我们切换到 dev
分支,并且对我们应用中的代码做出更改。我对标题文本进行了简单的更改,并在用户界面的文本中添加了几行新内容。你可以在你的代码中做出类似的更改。
现在,将这个更改添加、提交并推送到 dev
分支。这将启动 GitLab CI 管道。你可以在 GitLab 中查看管道,并实时看到进度。

如果一切顺利,你应该会看到 test
和 deploy
阶段都已经通过。现在,访问你的托管在暂存环境 URL 的 Heroku 应用。GitLab CI 管道已经为你部署了应用,所以你现在应该会看到你的更改实时显示在暂存环境中!

有了暂存环境,你就有了一个绝佳的地方,可以在托管环境中手动测试你的代码。这也是一个完美的位置,可以让质量保证测试员或产品经理在代码上线前验证更改。
现在,检查你的生产应用 URL。你会注意到它仍然显示旧的 UI,没有最新的更改。这是因为 GitLab CI 管道只将更改部署到了暂存环境,而没有部署到生产环境。
لقد قمنا بالتحقق من أن الكود يبدو جيدًا في بيئة الاختبار لدينا، دعونا نرفعنه إلى بيئة الإنتاج.
نشر تطبيق Heroku الخاص بنا إلى بيئة الإنتاج
لنقم بالتحقق من فرع main
ثم دمج فرع dev
في فرعك main
. يمكنك القيام بذلك من خلال طلب سحب (pull request) أو عن طريق تشغيل git merge dev
ثم git push
.
سيبدأ هذا في تشغيل مسار CI في GitLab مرة أخرى، ولكن هذه المرة سيكون prepare لتنشر تطبيقك الإنتاجي.

يمكنك أيضًا عرض جميع تشغيلات المسار في صفحة المسارات في GitLab لترى البناء المختلفة لفروع dev
و main
:

بمجرد انتهاء المسار، قم بزيارة URL لتطبيق Heroku الخاص بك في الإنتاج. يجب أن ترى الآن التغييرات التي تم نشرها في الإنتاج. عمل رائع!
الخاتمة
A good CI pipeline allows you to ship new features quickly and confidently without manually managing the deployment process. Having multiple environments configured for local development, staging, and production gives you more control over where and when code is released.
تتيح لك Heroku و GitLab CI/CD أتمتة كل هذا لجعل عمليات DevOps الخاصة بك سهلة!
Source:
https://dzone.com/articles/deploying-heroku-apps-to-staging-and-production