سناریو کامل CI&CD با گیت لب و داکر و Traefik و Reactjs

CI & CD with gitlab and docker and traefikتوی این مقاله قصد دارم که شما رو با سناریو هایی در حول محور Continues integration و Continues Deployment & Delivery آشنا کنم و سعی کنیم که این موارد رو با گیت لب روی سرور خودمون پیاده سازی کنیم.برای شروع باید موارد زیر رو آماده داشته باشید:سروری با حداقل ۵۰ گیگ هارد و ۲ گیگ رم و ۱ هسته سی پی یو(پیشنهاد میکنم سیستم عامل رو Ubuntu v18 بگیرید)یک دامنه آماده که روی DNS های Cloudflare ست شدهحداقل دانشی در حوزه Linux و کار با command lineاگر سرور ندارید! و میخواید از روش های Pay as you go استفاده کنید(بدین معنی که هرچقدر منابع مصرف کردید پول بدید) میتونید از زیرساخت های آروان کلاد کمک بگیرید که خیلی قدرتمند عمل کردن(از روی تجربه ای که باهاشون داشتم میگم)هدف نهایی:دیپلوی شدن پروژه Reactjs بر حسب نوع کامیت ها و برنچ ها روی یک ساب دامنه اختصاصی و اجراء تمامی تست ها بعد از کامیت روی هر برنچ. بدین معنی که اگر روی برنچ feature/test کامیت کردین٬ سیستم بیاد اتوماتیک تست ها رو اجراء‌کنه و در صورت pass شدن همه تست ها٬ در انتها بیاد سیستم رو دیپلوی کنه و روی ادرس زیر بالا بیارهhttps://test.feat.domain.irیا مثال های دیگه ای از این قبیل:Branch name: hotfix/testURL: https://test.fix.domain.irBranch name: developURL: https://stg.domain.irBranch name: masterURL: https://prod.domain.irتکنولوژی هایی که میخوایم باهاشون کار کنیم:Docker & docker-compose(Deploy codes in a isolated container)Gitlab CI(Gitlab devops infrastructure)Gitlab runner(A connection between gitlab CI website and our server)Traefik(A DNS manager in order to connect domain to the docker containers)Portainer(for monitoring all docker containers, stacks, volumes, images, networks and etc...)مراحل در پیش رو:ساخت یک پروژه در گیت لبنصب Gitlab runner روی سروراتصال gitlab-runner به ریپازیتوری گیت لبنصب داکر و docker-composeنصب Nodejsنصب Traefik , Portainerنوشتن داکر فایل های بیلد گرفتن از پروژهنوشتن کانفیگ nginx برای سرو کردن کد بلید شده درون داکر روی پورت ۸۰نوشتن pipeline ها اجرایی در فایل gitlab-ci.ymlتنظیم Couldflare روی IP سرور و تنظیمات DNS ساب دامنه هانصب Gitlab runner روی سروربرای اتصال گیت لب به سرور خودمون باید Gitlab-runner رو روی سرور نصب داشته باشید. مراحل نصب:۱. در ابتدا باینری فایلش رو میتونید از اینجا طبق مشخصات سیستم عامل ubuntu خودتون دانلود کنید:# Linux x86-64 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 # Linux x86 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386 # Linux arm sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm # Linux arm64 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm64۲. دسترسی های لازم رو بهش بدیمsudo chmod +x /usr/local/bin/gitlab-runner۳. یک یوزر اختصاصی براش بسازیمsudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash۳. سرویسش رو اجراء کنیمsudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner sudo gitlab-runner startاتصال gitlab-runner به ریپازیتوری گیت لببدین منظور به صفحه اصلی پروژتون برید و به settings > CI / CD settings > Runner مراجعه کنید.توی این صفحه اگر روی تب Runners کلیک کنید دوتا باکس میبینید به عناوین:Specific runnersShared runnersکه باید روی دکمه Disable shared runners کلیک کنید و غیرفعال کنید این ویژگی رو(خودم به باگی روی همین یه تیکه کوچیک خورده بودم که سه روز از وقتم رو درگیرش بودم تا فهمیدم مشکل shared runner ها هستن که باید غیرفعال می‌شدن).ما از ویژگی Specific runners استفاده خواهیم کرد طبق تصویر زیرSetup a specific gitlab runnerحالا برگردید به سرور خودتون و کامند زیر رو اجراء کنید توی ترمینال:sudo gitlab-runner registerبعد از اجراء کردن دستور بالا٬ ازتون میخواد که آدرس گیت لبتون رو وارد کنید که مقدار زیر رو وارد کنید:Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):https://gitlab.com/Please enter the gitlab-ci token for this runner:در مرحله بعد ازتون توکن میخواد. توکن توی صفحه specific runners هستش که توی عکس بالا من هایلایتش کردم چون برای هر ریپازیتوری فرق میکنه این توکن. مقدارش رو کپی کنید و توی ترمینالتون وارد کنید.Please enter the gitlab-ci description for this runner:توی مرحله بعدی ازتون میخواد که یک توضیحی حتی کوتاه درباره این runner بنویسیدPlease enter the gitlab-ci tags for this runner (comma separated):مرحله بعدش میگه یکسری تگ که با comma جدا شدن برای دسته بندی بنویس که نمیخواد چیزی بنویسید و Enter رو بزنید و برید به مرحله بعد.Please enter the executor: custom, docker-ssh, shell, docker+machine, docker-ssh+machine, docker, parallels, ssh, virtualbox, kubernetes:توی این مرحله میگه میخواین executor این runner چی باشه که پیشنهاد میکنم shell رو بنویسید براش و Enter رو بزنید.تمام. با موفقیت runner شما رجیستر شد و به اکانت گیت لب شما وصل شد.نصب داکر و docker-composeبرای نصب این دو مورد هم مراحل زیر رو طی کنید:۱. بروزرسانی دیتابیس پکیج های نصب شدهsudo apt update۲. نصب پکیج های پیش نیاز apt برای نصب پکیج های روی بستر httpssudo apt install apt-transport-https ca-certificates curl software-properties-common۳. نصب کلید GPG برای docker officialcurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -۴. اضافه کردن ریپازیتوری داکر به منابع aptsudo add-apt-repository &quotdeb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable&quot۵. بروز رسانی کردن دیتابیس پکیج های همراه با ریپازیتوری داکر که اضافش کردیمsudo apt updateاطمینال از این که میخوایم داکر رو از روی ریپازیتوری خودش نصب کنیم نه ریپازیتوری پیش فرض اوبونتوapt-cache policy docker-ceنتیجه اجراء کامند بالاdocker-ce: Installed: (none) Candidate: 18.03.1~ce~3-0~ubuntu Version table: 18.03.1~ce~3-0~ubuntu 500 500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packagesتا اینجا ما هنوز Docker-ce رو نصب نکردیم بلکه اون رو یه کاندید برای نصب میدونیم۶. در نهایت نصب خود داکرsudo apt install docker-ce۷. بعد از اجراء‌ کامند بالا دستور زیر رو وارد کنید که از صحت سلامت اجراء داکر مطمئن بشید.sudo systemctl status dockerنتیجه دستور بالا باید همچین چیزی باشه:docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago Docs: https://docs.docker.com Main PID: 10096 (dockerd) Tasks: 16 CGroup: /system.slice/docker.service ├─10096 /usr/bin/dockerd -H fd:// └─10113 docker-containerd --config /var/run/docker/containerd/containerd.tomlنصب Nodejsبرای نصب Nodejs مراحل زیر رو طی کنید۱. بروزرسانی دیتابیس پکیج های نصب شدهsudo apt update۲. نصب Nodejs و npmsudo apt install nodejs npm۳. اطمینان از نصب nodejs و npmnodejs -v npm -vمابقی مراحل رو هم در پست بعدی براتون کامل شرح میدم.