ch
Feedback
CodeCrafters

CodeCrafters

前往频道在 Telegram
711
订阅者
无数据24 小时
无数据7
无数据30
帖子存档
یکی از موضوعات دوست داشتنی در نوش مصنوعی ریاضیاتش هست که همه از دستش فرار میکنیم از بس که جذاب هست یکی ازین کتاب‌ها با عنوان جبرخطی شناخته میشه که از خود ریاضیات بیشتر دوست داشتنی تره😅😅😅 یک مهندس عزیز در اینترنت سعی کرده که این مورد رو با زبان ساده آموزش بده تا شیرینیش رو ازش بگیره براتون لینکش رو در زیر براتون میزارم https://chistio.ir/%D8%AF%D9%88%D8%B1%D9%87-%D8%AC%D8%A8%D8%B1-%D8%AE%D8%B7%DB%8C-linear-algebra-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B9%D9%85%DB%8C%D9%82/ #ai @code_crafters

وبینار مقایسه پلتفرم‌های ابری VMware و OpenStack ☁️ مواردی که در این وبینار به آنها خواهیم پرداخت: - Network - API - Deployme
وبینار مقایسه پلتفرم‌های ابری VMware و OpenStack ☁️ مواردی که در این وبینار به آنها خواهیم پرداخت: - Network - API - Deployment - Multi-Tenancy - Disaster Recovery - Security - Cloud Compatibility - Q&A - ... 📆 یکشنبه ۲۹ بهمن ۱۴۰۲ ⏰ ساعت ۱۹ الی ۲۱ ✅ ثبت‌نـام رایگان وبیـنار@xaascloud | ابـر زَس ‌

در پست قبلی اومدیم انسیبل رو معرفی کردیم اندکی هم راجب CM حرف زدیم یک فایل ساده ساختیم و یک بلوک yaml داخلش نوشتیم و با اجرا کردن این بلوک تمامی اطلاعات حساس رو مشاهده کردیم یک سناریو کوچک مطرح کردیم که دوتا سرور توسعه و استقرار داریم هدف ما این هست که این سرورهارو پیکربندی کنیم و اطمینان حاصل کنیم که با یک دستور تمام موارد مورد نیاز و خواست ما بر روی سرورهامون صورت بگیره
ما بر روی سرور توسعه نیاز به داکر و داکر کامپوز و گیت داریم 

بر روی سرور استقرار اما نیاز به گیت نداریم 
در سناریوی ما فقط دو سرور داریم ،در دنیای واقعی ممکن هست که چندین سرور داشته باشیم با توجه به مطالبی که در بالا گفتیم ما نیاز داریم که سرورهامون رو دسته بندی کنیم و در گروه‌های تکی و چندتایی معرفی کنیم در یک جا لازم داریم داکر روی همه سرورها نصب بشه در برخی سرورها لازم هست که فقط گیت رو نصب کنیم
دغدغه ما در این سطح 

ما نیاز داریم دو سرور توسعه و استقرار رو‌ در یک جاهایی جدا از هم داشته باشیم و پیکربندی هرکدوم رو جداگانه بزنیم 


در جای دیگه هردوی این سرور رو یکجا داشته باشیم تا یک عملیات یکسان روی هردو صورت بگیره
پس ما باید امکان این رو داشته باشیم که سرورهامون رو در حین حال تفکیک کنیم و اینکه در کنار هم نیز داشته باشیم پس بیاید با اولین مفهوم در انسیبل آشنا بشیم inventory directory
دایرکتوری inventory در Ansible راهی قدرتمند برای سازماندهی و مدیریت داده‌های موجودی شما ارائه می‌دهد. این به شما امکان می‌دهد چندین منبع موجودی را در یک مکان واحد ادغام کنید و مقیاس‌پذیری و قابلیت نگهداری را بهبود ببخشید.

نکته:ما در انسیبل از ساختار yaml نویسی استفاده میکنیم
در خصوص چالشی که بالاتر مطرح کردیم انسیبل از طریق inventory این امکان رو بهمون میده که سرورهای خودمون رو بتونیم دسته بندی و گروه بندی و معرفی کنیم در دایرکتوری کاری خودمون که در پست قبل ساختیم یک دایرکتوری با نام inventory ایجاد میکنیم در داخل inventory یک فایل با نام main.yml میسازیم و کدهای زیر رو داخل اون میزاریم
all:
  hosts:
    develope:
      ansible_host: server_ip
    deployment:
      ansible_host: server_ip
    

develope:
  hosts:
    develope_server:
      ansible_host: server_ip


deployment:
  hosts:
    deployment_server:
      ansible_host: server_ip
ما سه گروه ایجاد کرده‌ایم تا بتونیم سناریوی خودمون رو پیش ببریم توضیحات
گروه all
جهت نصب همه پیکربندی های یکسان و یکدست در همه میزبان‌ها(داکر و داکرکامپوز)

گروه develop
جهت نصب و پیکربندی سرور تست و توسعه

گروه deployment
جهت نصب و پیکربندی سرور استقرار

در هر گروه با بلوک hosts موجودیت‌های خودمون رو در اون بخش مشخص میکنیم 

یک اسم براش در نظر  میگیریم

و در ansible_host آدرس اون موجودیت رو بهش میدیم 

نکته
مقدار ip سرور خود را در server_ip جاساز کنید

نام گذاری و دسته بندی ها باید بگونه‌ای باشد که معرف کامل زیر ساخت شما باشد
گام اول ما برای سناریوی مدنظرمون به اتمام رسید دقت داشته باشید ما از یک ساختار ساده و منظم استفاده میکنیم ،در ساختار بزرگ و پیچیده شما برای هر گروه یک فایل yaml جداگانه خواهید دید #ansible #CM @code_crafters

از این ببعد دسترسی به gpt بدون شماره و با ایمیل می باشد

Repost from Easy Microservices
دوستان عزیزم جوین شید کم کم که چهار پنج دیقه دیگه شروع میکنیم ❤️🙏 https://meet.google.com/uui-wqur-vrr?authuser=0

Repost from Easy Microservices
بچه‌ها وعده‌ی ما امشب ساعت 8 ان شالله در خدمتتون هستیم. اگر دوست داشتید توسط لینک زیر میتونید توی گوگل کلندر خودتون اضافه اش کنید: https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=MWJwOGozdDl2OGVoM2xtcnAwbGlmZnQwNXIgYWxpLnZpc3VhbC5zdHVkaW9AbQ&tmsrc=ali.visual.studio%40gmail.com

Repost from Easy Microservices
موضوعاتی که توی جلسه ی بعدی میخوایم پیگیری کنیم: 1. چالش‌هایی که توی هرکدوم (میکروسرویس و مونولیت) میخوریم؟ 2.کارهایی که توی Easy microservices انجام دادیم؟ 3.چطوری یک معمار بشیم؟ چطوری نرم افزارهای بزرگ رو معماری کنیم؟ 4. چقدر و چطوری درگیر دیتابیس‌ها بشیم؟ 5. از چت جی پی تی استفاده کنیم؟ نکنیم؟ چطوری؟ 6. مهارت های نرم و سافت اسکیل هامون رو چطوری تقویت کنیم؟ مهارت های ارتباطی.

سنیور به کسی میگن که بلده ساز خوب بزنه اما اکسپرت کسی هست که ساز خودش رو خوب میزنه (تلفیق موسیقی کوردی و اسپانیایی) #fun @code_crafters

روابط در پایگاه داده ها انواع روابط به طور کلی، سه نوع رابطه در پایگاه داده ها داریم: رابطه یک به یک: مانند رابطه هر فرد با شناسنامه اش. هر فرد یک شناسنامه دارد و هر شناسنامه فقط برای یک نفر است. رابطه یک به چند: مانند رابطه مادر و فرزندانش. هر فرزند فقط یک مادر دارد، ولی هر مادر می تواند چند فرزند داشته باشد. رابطه چند به چند: مانند رابطه دانش آموز و درس. هر دانش آموز می تواند چند درس را انتخاب کند و هر درس می تواند توسط چند دانش آموز انتخاب شود. الان مسئله اصلی مطرح میشود چه فرقی بین رابطه Foreign Key (کلید خارجی ) با رابطه یک به چند وجود دارد ؟؟؟ بهتر این طوری شروع کنیم : هر رابطه کلید خارجی یک رابطه یک به چند است، اما هر رابطه یک به چند یک رابطه کلید خارجی نیست. =) کمی در ابتدا گیچ کننده است .
چشمها را بايد شست جور ديگر بايد ديد
ما هم باید از دید پایگاه داده ها این مورد ببینیم آیا وقتی شما رابطه یک به چند می زنید بر روی جدول هایی شما چیزی اضافه میشود؟؟ شاید ندانید ولی در حقیقت خیر !! شاید شما بگید ما داریم اینجا زحمت میکشم 😂 پس این رابطه یک به چند ما چی شده است باید به ارزتان برسانم . وجود دارند ولی بر روی جدول ها چیزی اضافه نمی شود و در بیرون جدول ها قرار میگیرند. یک چیزی مثل قانون هستند به برنامه خود دستور میدهید که این جدول با این جدول به این صورت رفتار کند و کاری به ستون ها در پایگاه داده ندارید ولی در رابطه کلید خارجی قدمی جلوتر میروید و بروی جدول یک ستون ایجاد میکند
رابطه یک به چند مثل یک قانون نانوشته است که به برنامه تان می گوید چطور بین دو جدول ارتباط برقرار کند. اما با استفاده از کلید خارجی، این قانون را به صورت فیزیکی در پایگاه داده تان هم ثبت می کنید.
استفاده از کلید خارجی سرعت بیشتری دارد و موجب راحت تر دسترسی به داده ها می شود و مهم ترین نکته آن این است که اجازه نمیدهد که همین طوری داده ای وارد پایگاه داده کنید و یا از آن حذف کنید. با این حال، استفاده از کلید خارجی همیشه ضروری نیست قرار نیست با یادگیری هر چیزی از آن حتما استفاده کنید. در برخی موارد، ممکن است استفاده از روش‌های دیگر برای پیاده‌سازی رابطه یک به چند مناسب‌تر باشد. به عنوان مثال، اگر تعداد رکوردها در جدول فرزند کم باشد شما با استفاده از کلید خارجی موجب افزایش حجم جدول والد با اضافه شدن یک ستون دیگر مشکل در آپدیت اطلاعات فرزند و عدم انعطاف پذیری (نمی توان همین طوری اطلاعات را وارد یا حذف کنید) خلاصه همین طوری ازش استفاده نکنید و اگه استفاده کردید فرق آن را بدانید . #Database @Code_Crafters

وضعیت واقعی بوت کمپ‌های آموزشی در حوزه برنامه نویسی #fun @code_crafters

Configuration management??? یا به اختصار cm ما تا اینجا مدام کد زدیم سرویس بالا آورده و در توسعه نرم افزار عمل کردیم این رو در دنیای IT با عنوان saas میشناسن و در چندپست قبل نیز راجب ci cd حرف زدیم که این ابزار رو اوردیم و در این بخش مورد استفاده قرار دادیم اما اون چیزی که تا اینجای کار فراموش کردیم بحث زیرساختی هست که بهش IaC میگن بسیار مورد اهمیت و جایگاه ویژه داره در این خصوص نیز ما دو موضوع رو داریم یکی خود زیرساخت و دیگری هم مدیریت پیکربندی هست ،دو ابزار بسیار معروف و کاربردی داریم Terraform Ansible ترافرم رو برای پیکربندی زیر ساخت و انسیبل رو برای مدیریت پیکربندی CM استفاده میکنند در این سلسله اموزشی سعی داریم که راجب انسیبل بگیم و یکم باهاش کار کنیم راجب انسیبل بیشتر بدونیم
انسیبل (Ansible) یک ابزار متن‌باز و قدرتمند برای مدیریت و پیکربندی سیستم‌ها، استقرار برنامه‌ها، اتوماسیون وظایف و هماهنگی آنهاست. به عبارت دیگر، انسیبل یک ابزار Remote Administration بسیار قوی با امکانات بسیار کارآمد است که از پروتکل SSH برای برقراری ارتباط و مدیریت سیستم‌ها و دستگاه‌ها استفاده می‌کند. 

برخی از مزایای استفاده از انسیبل:

سادگی: انسیبل از زبان یام‌ال (YAML) برای نوشتن Playbookها استفاده می‌کند که یادگیری آن آسان است.

قدرت: انسیبل می‌تواند وظایف پیچیده‌ای را خودکار کند و برای مدیریت زیرساخت‌های بزرگ و پیچیده مناسب است.

انعطاف‌پذیری: انسیبل می‌تواند برای مدیریت انواع مختلف سیستم‌ها، از جمله سرورها، روترها، سوئیچ‌ها و دستگاه‌های ذخیره‌سازی استفاده شود.

مقیاس‌پذیری: انسیبل می‌تواند برای مدیریت تعداد زیادی از سیستم‌ها به طور همزمان استفاده شود.

رایگان: انسیبل یک ابزار متن‌باز و رایگان است.

برخی از کاربردهای انسیبل:

مدیریت پیکربندی: انسیبل می‌تواند برای پیکربندی سیستم‌ها، نصب نرم‌افزار، به‌روزرسانی سیستم‌عامل و تنظیمات امنیتی استفاده شود.

استقرار برنامه: انسیبل می‌تواند برای استقرار برنامه‌ها به طور خودکار در چندین سیستم استفاده شود.

اتوماسیون وظایف: انسیبل می‌تواند برای خودکارسازی وظایف روزانه، مانند پشتیبان‌گیری، نظارت و گزارش‌دهی استفاده شود.

هماهنگی: انسیبل می‌تواند برای هماهنگی وظایف بین چندین سیستم استفاده شود.

اگر به دنبال یک ابزار قدرتمند و کارآمد برای مدیریت و اتوماسیون وظایف IT خود هستید، انسیبل یک گزینه عالی است
سناریو به چه صورت خواهد بود ما دوتا سرور داریم توسعه و استقرار و میخوایم هر کدوم رو مختص به کاربردش پیکربندی کنیم ابتدا انسیبل رو روی سیستم خود نصب کنید Link در یک مسیر دلخواه خودتون یک دایرکتوری با اسم base-ansible بسازید و داخل اون برید (این اسم الزامی و ما فقط جهت پیش بردن این دسته پیام‌ها میسازیم) بیاید همین ابتدای کار یک چیز باحال رو تست کنیم
بعد از نصب انسیبل

وارد دایرکتوری base-ansible بشید 

یک فایل با اسم info.yml بسازید 

این متن رو بصورت دقیق داخل ان بنویسید و ذخیره کنید

- hosts: localhost
  tasks:
    - name: FACTS
      debug:
        msg: "{{ ansible_facts }}"

در دایرکتوری خط فرمان رو باز کنید و دستور زیر رو بزنید

ansible-playbook info.yml


در خروجی این دستور در خروجی این دستور مهمترین اطلاعات مربوط به سیستم خودتون رو میبینید درسته؟؟؟

حالا کافیه همین رو تنظیم کنیم جهت اجرا روی سرور خودمون

عجله نکنید ذره ذره پیش میریم و یاد میگیریم
#ansible #CM @code_crafters

بچه‌ها نظرتون چیه یک وبسایت داشته باشیم برای کانال و در اون شروع کنیم گذاشتن مطالب آموزشی؟؟؟ دوستانی که میخواهند با من همکاری کنن لطفا بهم پیام بدن

گرافانا

تصور برخی دوستان از دنیای فریلنسری #fun @code_crafters

در ادامه مباحث مربوط به github action تست پروژه و کدها ما قبل از اینکه بخواهیم پروژه رو pull و داکرایز کنیم نیاز هست ابتدا تست‌هایی که توسط تیم توسعه صورت گرفته رو انجام دهیم و در صورت پایان بدون خطا اقدام به انجام جاب‌های دیگر کنیم پس ما یک جاب test مینویسیم و و دیگر جاب‌ها رو الزام میکنیم بعد از آن اجرا شوند
در فریمورک جنگو میدانیم که برای تست

 نیاز به نصب جنگو 

و سپس اجرای دستور 
python manage.py test 
می باشیم
جاب test ما بشکل زیر خواهد بود
test:
    runs-on: self-hosted
    container:
      image: python:slim-bullseye
    steps:
      - name: Run Django tests
        run: |
          pip install django
          python manage.py test
یک نکته جالب میبینیم که از مقدار :container در جاب استفاده شده است در واقع در اینجا به مطرح کردیم که یک کانتینر از یک ایمیج برام بالا بیار دستورات زیر رو داخلش اجرا کن برام ،اتفاق جالبی که میافته این هست پس از اتمام دستورات کانتینر رو برامون پایین میاره یک کانتینر از ایمیج python:slim-bullsey بالا بیار جنگو‌رو نصب کن ،کدهارو تست کن و کانتینر رو برام حذف کن دیگر لازم نیست برای قسمت تست هم یک کانتینر نگهداریم حالا کافیست داخل دیگر جاب‌ها با استفاده از :needs همه جاب ها رو موظف کنیم که در انتظار بمونن تا تست با موفقیت به اتمام برسد #git #actions @code_crafters

چرا این قسمت دوم نداشت

خب بریم سراغ جاب push ابتدا به اکانت داکرهاب خودمون میریم یدونه ریپوزیتوری پرایویت میسازی با اسم conda-test
push-image:
        runs-on: self-hosted
        env:
          USERNAME: 'behzadazadi2693'
          DOCKER_PASSWORD: $"{{ secrets.DOCKER_PASSWORD }}"
        needs:
          - dockerize
        steps:
          - name: push image to docker account
            run: |
              echo $SUDO_PASSWORD | sudo -Sv
              sudo docker login -u $USERNAME -p $DOCKER_PASSWORD
              sudo docker tag conda-test $USERNAME/conda-test:v1
              sudo docker push $USERNAME/conda-test:v1
خب نیاز داریم اول جاب dockerize تموم بشه بعد ،پس needs رو براش مینویسیم برای لاگین در دامرهاب نام کاربری و پسورد لازم داخل env تعریف میکنیم و پسورد رو میبریم داخل سکرت ریپومون دستورات run:
پسورد ران برای دستور sudo تنظیم میکنیم 

ابتدا لاگین میکنیم

طبق قاعده خاص داکر ایمیج رو نام گذاری میکنیم برای ریپوزیتوری پرایویتمون در داکر هاب 
و سپس پوش میکنیم داخل داکر هاب
خب بریم سراغ flow مربوط به deployment
نکته: ابتدا در سرور server-deployment داکر و داکرکامپوز رو نصب میکنیم 
خب برگردیم سر طراحی این flow ابتدا یک نام بهش میدیم
name: develop application
در مرحله بعدی مشخص میکنیم چه وقتی این flow کار کنه؟؟؟
یادتون هست در تعریف سناریو گفتیم که برای سرور دیپلوی بیام بصورت دستیش کنیم؟؟؟

درسته پس این مقدار باید بشکل زیر باشه

on:
     Workflow_dispatch
حالا باید مسخص کنیم که این flow در کدوم سرور بوسیله کدوم رانر اجرا بشه(پسورد sudo رو هم بزاریم براش)
env:
    TARGET_SERVER: server-deployment
    SUDO_PASSWORD: ${{ secrets.SUDO_PASSWORD }}
در جاب اول ایمیج رو pull میکنیم
pull-image:
        runs-on: self-hosted
        steps:
            - name: pull image
              env:
                USERNAME_HUB: "behzad-azadi2693"
                PASSWORD_HUB: ${{ secrets.TOKEN }}
              run: |
                echo $SUDO_PASSWORD | sudo -Sv
                sudo docker login -u $USERNAME -p $DOCKER_PASSWORD
                sudo docker push $USERNAME/conda-test:v1
خب همه چی مشخص هست درسته؟؟؟ **در جاب دوم لازم هست ایمیج رو اجرا کنید تا اینجای کار اومدیم پس یاد گرفتین خودتون این جاب رو چجوری اجرا بنویسید** چندتا نکته:
شما میتونید روی یک سرور کار کنید 

در قسمت runs-on اگر مقدار ubuntu-latest رو قرار بدید روی رانرهای خود گیتهاب کار خواهد کرد

اگرهم تغییر ندید و به هر دلیلی رانرتون ارور بده گیتهاب بازم میبره روی رانر خودش اما بدلیل دستور sudo و پسورد بهتون خطا خواهد داد

ایا میشه از این ساده تر هم نوشت؟؟بله action های آماده وجود داره که برید بخونید راجبشون 

در قسمت on هم میتونید علاوه push و dispatch حتی کروم‌جاب هم تنظیم کنید
پروژه و کدها رو میتونید در گیتهاب ببینید https://github.com/CodeCrafters-ir/test-actions.git خب سوال: اگه بخوایم همین سناریو رو در گیتلب هم یاد بگیریم چی؟؟؟ اموزش بچه‌های دواپس هابیز رو در یوتیوب ببینید https://youtube.com/playlist?list=PLYrn63eEqAzannVocQrddqsBK-C17e-Sm&si=F_C_OiGw6i3l4aoN #git #actions @code_craftets

خب بریم سراغ نوشتن workflows ها یک دایرکتوری در مسیر root پروژه خود بسازید و اسم آن را github. بزارید و داخل آن نیز یک دایرکتوری دیگر با اسم workflows بسازید هر فایلی با پسوند yml. بعنوان یک flow شناخته میشه و به رانر برای اجرا داده میشود
در سناریوی پست اول گفتیم که دو سرور خواهیم داشت server-develope با server-deployment


در این دایرکتوری دوتا فایل خواهیم ساخت 
develop.yml
deployment.yml
ابتدا میریم سراغ فایل develope.yml و ذره ذره آنرا توضیح خواهیم داد ابتدا برای آن یک نام تعیین میکینیم تا در هنگام اجرا شدن در صفحه گیتهاب مربوط به نشان دادن بتوانیم آنرا تفکیک کنیم
name: develope application 
نام را ست کردیم در مرحله بعد ما مشخص میکنیم این flow چه هنگامی اجرا شود
on:
     push:
          branches:
                - main
مشخص کردیم هنگامیکه پوش داشتیم و روی برنچ main این پوش صورت گرفته بود این flow اجرا گردد در سناریوی اولی ما دو سرور داشتیم و هر سرور هم یک رانر داشت رانر مربوط به تست و توسعه رو با اسم server-develope لیبل آنرا نیز با نام server-develope گذاشتیم ما از اسم لیبل استفاده میکنیم میکنیم تا به گیتهاب بفهمونیم میخواهیم flow با اسم develope.yml را روی روی سرور و با رانر server-develope اجرا کند
env:
      TARGET_SERVER: server-developer
خب این رو هم مشخص کردیم بریم سراغ نوشتن jobها هر flow میتونه چندین job داشته باشه که در بلاک jobs نوشته میشه هر job یک مشخصه و چندین step و env و رانر متصل و ... میتونه داشته باشه ما سه job خواهیم داشت Pull Dockerize Push
قبل از ادامه در سرور

۱-در مسیر var/www/ پروژه رو‌clone میکنیم

۲-نصب و پیکربندی داکر و داکرکامپوز
خب بریم سراغ جاب pull
pull:
        runs-on: self-hosted
        steps:
            - name: pull from github
              env:
                USERNAME: "CodeCrafters-ir"
                TOKEN: ${{ secrets.TOKEN }}
              run: |
                cd /var/www/test-action
                git config --global user.email "behzad.azadi2693@gmail.com"
                git config --global user.name "behzad azadi"
                git pull https://$USERNAME:$TOKEN@github.com/CodeCrafters-ir/test-actions.git
اسم job رو گذاشتیم ،جهت گرفتن تغییرات ریپو بر روی سرور این جاب روی رانر خود میزبان اجرا خواهد شد و چون در ابتدا برای این flow ما مقدار TARGET_SERVER تعریف کردیم پس این جاب و گامهای اون روی سروری اجرا میشه که رانر با لیبل server-developer قرار گرفته است در گام اول ما یک نام با عنوان pull from github گذاشتیم درون env ما دو مقدار متغییر قرار دادیم username برای نام کاربری در گیت‌هاب و TOKEN که توکن دسترسی به ریپوی پرایویت و اکانت گیتهاب ما می باشد و چون این مقدار امنیتی می باشد آنرا داخل سکرت ریپومون در مسیر زیر گذاشته و از آنجا دریافت میکنیم Settings > Secrets and Varibles > Secret > New repository secret تصویر اول در کامنت‌ها در قسمت run دستورات مربوط رو مینویسیم
ابتدا به مسیر دایرکتوری پروژه میریم معمولا در جامعه توسعه دهندگان و لینوکس مسیر آن در var/www/ می باشد

مقادیر نام و ایمیل رو برای گیت تنظیم میکنیم 

و سپس جهت دریافت کدها و تغییرات pull میکنیم به نحوه جا دادن username و token دقت کنید
بریم سراغ جاب بعدی dockerize
dockerize:
        runs-on: self-hosted
        needs:
            - pull
        steps:            
            - name: Create image
              run: |
                echo $SUDO_PASSWORD | sudo -Sv
                cd /var/www/test-action
                sudo docker build . -t conda-test --no-cache

            - name: Run container
              run: |
                echo $SUDO_PASSWORD | sudo -Sv
                cd /var/www/test-action
                sudo docker compose down
                sudo docker compose up -d
در این جاب مقدار need رو میبینید که به جاب pull رفرنس داده ،ما تا زمانیکه کدهارو نگرفتیم نمیتونیم داکرایز کنیم بابت همین نیاز هست منتظر بمونیم pull تموم بشه و بعد
داخل هر گام مقدار کد 
echo $SUDO_PASSWORD | sudo -Sv
رو میبینیم چون نیاز هست در کامندها از sudo استفاده کنیم اینگونه براش پسورد رو میگذاریم 

مقدار متغییر 
$SUDO_PASSWORD 
رو هم در env گلوبال میزاریم
env:
    TARGET_SERVER: server-developer
    SUDO_PASSWORD: ${{ secrets.SUDO_PASSWORD }}
در بالاتر یاد گرفتیم چطوری متغییر امنیتی رو تنظیم کنیم
#git #actions @code_crafters

خب بریم سراغ اینکه اگه بخوایم رانر رو حذف کنیم چکار کنیم ابتدا به سرور مدنظرمون و مسیر دایرکتوری که پست قبلی برای رانر ایجاد
+1
خب بریم سراغ اینکه اگه بخوایم رانر رو حذف کنیم چکار کنیم ابتدا به سرور مدنظرمون و مسیر دایرکتوری که پست قبلی برای رانر ایجاد کردیم میریم و دستورات زیر رو میزنیم
systemctl stop action<کلید tab را جهت کامل کردن بزنید>

sudo ./svc.sh uninstall

./config.sh remove --token مقدار‌توکن
مقدار توکن را مطابق تصویر دریافت کنید به مسیر رانرها بروید بر روی اسم رانر مدنظر خودتون کلیک کنید دکمه remove را بزنید مقدار توکن را کپی کرده صفحه را ببنید در دستور بالا جایگذاری کنید و رانر را حذف کنید Settings > Actions > runners > رانر خودرا‌انتخاب‌کنید > Remove اگر صفحه رانرها رو رفرش کنید میبینید که رانر پاک شده است #git #actions @code_crafters

خب میریم سراغ رانرهامون اینکه رانر چیه و توضیحات مربوط به اون رو برید از Gemini گوگول بپرسید از تعاریف عبور می‌کنیم ما دو نوع رانر داریم
رانر میزبانی شده توسط گیتهاب(اگه سرور ندارید میتونید ازین مورد استفاده کنید)
رانر خود میزبانی شده که بهش self hosted میگیم و روی سرور بالا میاریم(میتونید روی لپتاپ خودتون هم بالا بیارید)
به اکانت خود و ریپوی مدنظرتون برید و مسیر زیر رو دنبال کنید Settings > Actions > Runners > New self-hosted runner در کامنت‌ها تصویر اول رو ببینید تو این صفحه دستورالعمل مربوط به اجرا کردن رانر را میبینید مطابق آن پیش بروید من از سیستم عامل لینوکس بهره میبرم در کامنت‌ها تصویر دوم را ببینید دستورات مربوطه در این صفحه با حفظ نکته زیر در سرور server-developer اجرا کنید در بخش configure هنگام اجرا کردن بش اسکریپت config.sh/. موارد رو مطابق زیر پر کنید
دستور اول مربوط به ساخت دایرکتوری می باشد در هر مسیری که دوست دارید آنرا اجرا کنید و بخاطر بسپارید تمامی دستورات ما جهت پیکربندی رانر در این مسیر این دایرکتوری انجام خواهیم داد 

در مرحله اول کلید enter را بزنید تا پیش فرض بماند

در مرحله دوم هم مقدار server-developer را وارد کنید

در مرحله بعدی لیبل server-developer را وارد کنید

در مرحله بعدی کلید enter را بزنید 

رانر ما اکنون آماده کار میباشد

دستور زیر را بزنید تا رانر شروع بکار کند

./run.sh
اکنون صفحه گیتهاب خود در مسیر زیر را اگر رفرش کنید با تصویر سوم در کامنت ها روبرو میشید Settings > Actions > Runners یک رانر با نام و برچسب server-developer می بینید این یک self-hosted هست این نام رو فراموش نکنید نکته قابل توجه: دستور run.sh/. ترمینال رو مشغول نگه داشته و اگه این دستور رو خاتمه بدید و به همان صفحه رانرها برگردید میبینید که رانر به حالت offline رفته ما باید رانر رو به یک سرویس تبدیل کنیم تا همیشه به حالت کار قرار گیرد دستورات زیر را در همان مسیر دایرکتوری که رانر در ان قرار دارد اجرایی کنید (actions-runner) اجرایی کنید
sudo ./svc.sh install

systemctl start action<کلید tab را جهت کامل کردن بزنید>
اکنون اگر بجای start در دستور دوم بالا مقدار status را بزارید میبینید که رانر ما بصورت سرویس بالا آمده و در حال اجرا قرار گرفته است
برای سرور server-deployment به همان صفحه رانرها رفته و یک رانر جدید دیگر راه بندازید

Settings > Settings > Actions > New self-hosted runner 

همان مراحل بالا را انجام بدید منتها نام و لیبل رو به server-deployment تغییر دهید

اکنون صفحه رانرها را رفرش کنید رانر server-deployment رو با server-developer  میبینید 
هر دو رانر ما آماده شدن #git #actions @code_crafters