كيفية إعداد تطبيق الويب المنشور على Go for Gitlab على VDS


مقدمة


هذه المقالة هي نتيجة بحث استمر أسبوعًا عن معلومات مجزأة جدًا حول كيفية تكوين نشر خدمة الويب على Go. ليس على Heroku ، وليس على Docker ، وليس في Digital Ocean ، ولكن فقط على VDS من الطراز القديم مع CentOS 7x64. لسبب ما ، لا تحتوي الشبكة على هذه المعلومات ، وتبدأ معظم البرامج التعليمية بكيفية إعداد الإصدار وتنتهي بإطلاق الاختبارات.

سأحذرك على الفور أنه لأول مرة قمت بإعداد عملية CI / CD ، لذا فهذه مقالة من مبتدئ إلى مبتدئ.

بالتأكيد يمكن تصحيح الكثير هنا ، لذلك سأقبل أي تعليقات بسرور في التعليقات وحاول تحديث التغييرات في أقرب وقت ممكن. من الممكن أيضًا وجود مثل هذه المقالة بالفعل ، وأنا أستخدم محرك البحث بشكل رهيب. ثم يرجى إعطاء رابط لها ، وفي هذه الحالة ، سأحذف المقالة وأذهب إلى رش الرماد على رأسي.

بيانات المصدر


  • خادم VDS
  • نظام التشغيل: CentOS 7x64
  • اذهب المشروع مع الهيكل التالي:

src/ public/ index.html main.go 

إعداد الخادم: إنشاء خدمة


أولاً ، قم بإنشاء خدمة لتطبيقنا. في CentOS 7 ، هذا بسيط جدًا. تحتاج إلى كتابة مثل هذا البرنامج النصي في ملف يسمى serviceName.service:

 [Unit] #   Description=Service Description After=network.target [Service] Type=simple #  ,       User=username #    ExecStart=/username/service/binaryFile Restart=on-abort [Install] WantedBy=multi-user.target 

يجب وضع النص نفسه في المجلد etc / systemd / system /

إعداد SSH


على الخادم ، قم بتشغيل الأمر:

 ssh-keygen -f /etc/ssh/hmp.key 

عند الطلب
أدخل عبارة المرور (فارغة بدون عبارة مرور)
لا تدخل كلمة مرور ، فقط اضغط Enter.

يتم إنشاء ملفين في المجلد / etc / ssh /:

  1. hmp.key - مفتاح خاص
  2. hmp.key.pub - مفتاح عام

نحن بحاجة إلى مفتاح خاص. عرض محتوياته باستخدام الأمر:

 cat /etc/ssh/hmp.key 

سيبدو شيء من هذا القبيل:

 -----BEGIN RSA PRIVATE KEY----- {    } -----END RSA PRIVATE KEY----- 

كل نسخ تماما إلى الحافظة الخاصة بك

انتباه! - ليس فقط المفتاح نفسه ، ولكن أيضًا
----- يبدأ مفتاح RSA الخاص ----- و ----- نهاية المفتاح الخاص RSA -----

إعداد Gitlab


أولاً ، املأ البيانات المهمة للمستودع (اسم المستخدم وكلمة المرور وما إلى ذلك).
حتى إذا كان المستودع الخاص بك عامًا ، فسيظل مغلقًا.

في Gitlab في المستودع ، انتقل إلى الإعدادات -> CI / CD -> المتغيرات. نقوم بإنشاء المتغيرات التالية هناك:

  • SSH_PRIVATE_KEY - الصق القيمة المنسوخة في الفقرة السابقة هنا
  • USER_PASS - كلمة مرور المستخدم التي سيتم تشغيل التطبيق منها
  • المستخدم - اسم المستخدم الذي سيتم تشغيل التطبيق منه
  • HOST - عنوان VDS الخاص بك
  • TARGET_DIR_ON_HOST - المجلد الهدف الذي سيتم وضع الخدمة فيه في المثال الخاص بي هو / username / service /
  • SERVICE_NAME - اسم الخدمة
  • GROUP_NAME هو اسم مستخدم Gitlab الخاص بك
  • REPOSITORY_NAME - اسم مستودعك

أضف ملف .gitlab-ci.yml إلى المستودع بالمحتويات التالية:

 image: golang:latest before_script: #     sshpass - apt-get update -qq && apt-get install -y -qq sshpass #  ,    .   govendor,      - go get github.com/gorilla/mux - go get github.com/gorilla/websocket #  SSH - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config #     - mkdir -p /go/src/gitlab.com/$GROUP_NAME #     - git clone git@gitlab.com:$GROUP_NAME/$REPOSITORY_NAME.git /go/src/gitlab.com/$GROUP_NAME/$REPOSITORY_NAME #      - mkdir -p $CI_PROJECT_DIR/build/ #        (, HTML- ..)  . #       src/public - cp -r $CI_PROJECT_DIR/src/public $CI_PROJECT_DIR/build stages: - build - deploy compile: stage: build script: #     Go  - cd /go/src/gitlab.com/$GROUP_NAME/$REPOSITORY_NAME/src #    . ,        build       main - go build -race -ldflags "-extldflags '-static'" -o $CI_PROJECT_DIR/build/main artifacts: paths: - $CI_PROJECT_DIR/build/main deploy: stage: deploy script: #      ()      public - cd $CI_PROJECT_DIR/build #   sshpass      VDS - sshpass -V - export SSHPASS=$USER_PASS #   - sshpass -e ssh -o stricthostkeychecking=no $USER@$HOST systemctl stop $SERVICE_NAME #    - sshpass -e scp -o stricthostkeychecking=no -r . $USER@$HOST:$TARGET_DIR_ON_HOST #   - sshpass -e ssh -o stricthostkeychecking=no $USER@$HOST systemctl restart $SERVICE_NAME 

بعد الضبط ، ندفع هذا النص البرمجي إلى المستودع ولدينا تجميع جاهز ونشره. هذا كل شيء!

آمل أن تكون المقالة مفيدة. لأية أسئلة وتعليقات يسعدني الرد عليها في التعليقات!

Source: https://habr.com/ru/post/ar421087/


All Articles