ให้เรตสมาชิก: 5 / 5

ดาวใช้งานดาวใช้งานดาวใช้งานดาวใช้งานดาวใช้งาน
 

โปรแกรม CI ทำ upload ไฟล์ระบบจาก gitlab ไปยังตัว server demo ด้วยภาษา Python

 

รูปภาพสัญลักษณ์ของ gitlab

 

สำหรับนักพัฒนาซอฟต์แวร์ คงจะเคยได้คำว่า GitLab หรือตัวเก็บซอร์สโค้ดที่เราได้พัฒนาขึ้นมาเก็บไว้บน Cloud เพื่อที่จะให้เพื่อนรวมงานสามารถพัฒนาต่อจากเราได้ เพื่อความสะดวก รวดเร็ว รวมไปถึงช่วยลดขั้นตอนการทำงานของทีม ตัวโปรแกรม upload ไฟล์ระบบจาก gitlab ไปยังตัว server demo ตัวนี้สามารถช่วยได้ในระดับนึ่ง ความรู้ที่ควรศึกษาก่อนนั้นจะเป็น python API เป็นส่วนใหญ่ และพวก ภาษา python พื้นฐาน เป็นต้น

อันดับแรกจะต้องมี user ของ gitlab และทำการขอ Personal Access Tokens จาก gitlab เพื่อทำการใช้ตัว API 

ขั้นตอนสามารถดูได้จากที่นี่ คลิก

เมื่อทำการขอ Personal Access Tokens เรียบร้อยแล้วให้ทำการสร้าง Project ใน pychram ขึ้นมา แล้วสร้างไฟล์ Python

จากนั้นทำการสร้างไฟล์ txt -ขึ้นมาใช้ชื่อว่า requirements.txt ให้พิมพ์คำสั่งตามนี้

requests==2.23.0
Flask==1.1.1
passlib==1.6.5
configparser==4.0.2

จากนั้นไปที่ terminal ของ pycharm พิมพ์คำสั่ง command ตามนี้เพื่อติดตั้ง library ของ python

pip install -r requirements.txt

เมื่อติตตั้งเสร็จแล้วทำการ import library เข้ามาใช้งานในไฟล์ Python ที่สร้างไว้ตอนแรก

from flask import Flask, render_template
from zipfile import ZipFile, BadZipfile

import requests, os, io, configparser, shutil

ให้ทำการสร้างไฟล์ config ขึ้นมาโดยสกุลไฟล์จะเป็น .conf จากนั้นพิมพ์คำสั่งตานนี้

[app_run]
host = < hostname >
port = < port >
debug = True

[gitlab]
git_url = < link gitlab >
private_token = < access token >
projectID_pathdemo = { < project ID >  : '< path demo >', < project ID >  : '< path demo >', < project ID >  : ['< path demo1 >', '< path demo2 >/']}

< hostname > คือ hostname ที่ติดตั้งโปรแกรม
< port > คือ port ที่ใช้
< link gitlab > คือ link gitlab ที่ใช้
< access token > คือ access token ที่ขอมาจาก gitlab
< project ID > คือ ID ของ project บน gitlab ที่ใช้
< path extension > คือ path ที่เก็บ extension บน server demo
< path demo > คือ path ของ server demo

ตัวอย่าง เช่น

[app_run]
host = 127.0.0.1
port = 5014
debug = True

[gitlab]
git_url = https://gitlab.com
private_token = Fg4ANg8jmwoH4vGHJfwi
projectID_pathdemo = { 254 : 'TEST_htmltopdf/', 38 : 'TEST_selenium/', 232 : ['TEST_htmltopdf/selenium_PHPBB/', 'TEST_selenium/selenium_PHPBB/']}

จากนั้นในไฟล์ python ให้ทำการ เพิ่มคำสั่งนี้เข้าไปเพื่อทำการเรียกใช้ไฟล์ config

config = configparser.ConfigParser()
config.read('tool_config.conf')

# ----app.run----
host = config['app_run']['host']
port = config['app_run']['port']
debug_run = config['app_run']['debug']

# ----gitlab----
git_url = config['gitlab']['git_url']
private_token = config['gitlab']['private_token']
id_pathdemo = config['gitlab']['projectID_pathdemo']

เขียนคำสั่งสร้างโฟรเดอร์เพื่อมาเก็บไฟล์ที่ดาวน์โหลดมาจาก gitlab

app = Flask(__name__)

if os.path.isdir('tmp_project') == False:
    os.mkdir('tmp_project')
    print "Directory tmp_project created successfully"
if os.path.isdir('tmp_zip') == False:
    os.mkdir('tmp_zip')
    print "Directory tmp_project created successfully"

จากนั้นทำการสร้าง method zip_dir จะทำการ extract ไฟล์ตาม projectที่เลือก

def zip_dir(directory, zipname, path_demo_project):
   if os.path.exists(directory):
      outZipFile = ZipFile(zipname, 'w')

      # The root directory within the ZIP file.
      rootdir = os.path.basename(directory)
      for dirpath, dirnames, filenames in os.walk(directory):
         for filename in filenames:
            filepath = os.path.join(dirpath, filename)
            parentpath = os.path.relpath(filepath, directory)
            arcname = os.path.join(rootdir, parentpath)
            outZipFile.write(filepath, arcname)

   outZipFile.close()
   try:
      with ZipFile(zipname, 'r') as zipObj:
         if type(path_demo_project) == list and len(path_demo_project) >1:
            for path in path_demo_project:
               zipObj.extractall(path)
         elif type(path_demo_project) == list and len(path_demo_project) == 1:
            zipObj.extractall(path_demo_project[0])
         else:
            zipObj.extractall(path_demo_project)
      zipObj.close()

      directory = directory.split("/")
      del directory[-1]
      directory = "/".join(directory)

      remove_directory = shutil.rmtree(directory)
      remove_zipname = os.remove(zipname)
      if remove_zipname == None and remove_directory == None:
         print 'remove tmp_zip & tmp_project success'
      return 'extract success'

   except (IOError, BadZipfile) as e:
      return e

ส่วน method ตัวนี้จะทำ request เพื่อที่จะขอไฟล์ระบบจาก gitlab โดยใช้ link API ของ gitlab

def request_url(id_project, path_project):
   url = git_url + '/api/v4/projects/' + str(id_project) + '/repository/archive.zip?private_token=' + private_token
   re = requests.get(url)
   z = ZipFile(io.BytesIO(re.content))
   z.extractall('tmp_project')
   pathname = z.namelist()[0]
   pathname = 'tmp_project/' + pathname

   return zip_dir(pathname, 'tmp_zip/project.zip', path_project)

คำสั่งอันนี้จะคำสั่งที่ให้ทุกส่วนทำงานตามลำดับ

@app.route('/<int:post_id>')
def index(post_id):
   id_path_dict = eval(id_pathdemo)
   if post_id in id_path_dict.keys():
      path_project = id_path_dict[post_id]
      id_project = post_id
      return request_url(id_project, path_project)
   else:
      return 'No Project ID in id_path, Chack your tool_config.conf'

โค้ดรวม

หัวเรื่อง
Python CI demo Server รวมไฟล์จาก Gitlab ขึ้น Server
หมวดหมู่
Python for work, Python for work
ฮิต
1360
ผู้สร้างเอกสาร
ae
วันที่สร้างเอกสาร
2020-05-28 06:04:28

mindphp-upload-to-demo.zip

ประเภทไฟล์ zip

ขนาดไฟล์ 1.23 KB

ผู้อัพโหลดไฟล์ Administrator

วันที่อัพโหลด 2020-05-27 22:57:38


เมื่อทำทุกอย่างเสร็จแล้วทำการรันโปรแกรม จากนั้นไปใช้คำสั่ง command บน terminal

curl http://127.0.0.1:5014/<Project ID>

ตัวอย่างเช่น

curl http://127.0.0.1:5014/254

ผลจะได้ตามนี้

 

กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
เจอปัญหา Forbidden You don't have permission to access /index.php on this server. Additionally, a 403 Forbidden error
โดย mindphp อ 22 ก.ย. 2020 12:58 am บอร์ด Programming - PHP
1
18
อ 22 ก.ย. 2020 7:44 pm โดย mindphp
มาแล้ว!!! MDSMS component สำหรับส่งข้อความผ่านทาง SMS บน Joomla
โดย bolue จ 21 ก.ย. 2020 5:17 pm บอร์ด MindPHP News & Feedback
0
15
จ 21 ก.ย. 2020 5:17 pm โดย bolue
สอบถามเรื่องการอ่านค่าสีสถานะของปุ่ม
โดย blebee90 จ 21 ก.ย. 2020 2:03 pm บอร์ด Programming - C/C++ & java & Python
1
20
จ 21 ก.ย. 2020 3:10 pm โดย mindphp
อัพเดดความคืบหน้า / Progress - พรีโม เทรดดิ้ง
โดย mindphp จ 21 ก.ย. 2020 11:45 am บอร์ด พรีโม เทรดดิ้ง (Main)
1
8
อ 22 ก.ย. 2020 7:55 pm โดย thatsawan
ต้องการกำหนดรุปแบบของช่องกรอกให้เป็นเเพทเทิร์นของเบอร์โทร เเต่ไม่ต้องการให้กรอกตัวหนังสือ
โดย thatsawan พฤ 17 ก.ย. 2020 3:18 pm บอร์ด JavaScript & Jquery Ajax
4
68
ศ 18 ก.ย. 2020 1:44 pm โดย mindphp
สถานที่จัดงานแต่งงานชิคๆ แบบไม่ง้อโรงแรม
โดย Anonymous พฤ 17 ก.ย. 2020 2:10 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
39
พฤ 17 ก.ย. 2020 2:10 pm โดย บุคคลทั่วไป
วิธีแก้ ean13 ปัญหาที่เจอคืออะไร แก้ยังไง
โดย bolue พ 16 ก.ย. 2020 6:38 pm บอร์ด Accounting software & ERP โปรแกรมบัญชี ระบบอีอาร์พี
0
38
พ 16 ก.ย. 2020 6:38 pm โดย bolue
สอบวิธีการ check user ว่าเราใช้ user ไหนอยู่ตอนนี้ ได้มั้ยครับ ใน command บน Ubuntu
โดย jirawoot พ 16 ก.ย. 2020 11:25 am บอร์ด Programming - C/C++ & java & Python
3
70
พ 16 ก.ย. 2020 11:52 am โดย mindphp
หน้าเว็บ phpBB เจอปัญหาโหลด 404 บ้างครั้งไม่รู้ว่าเป็นเพราะอะไรได้บ้าง
โดย thatsawan พ 16 ก.ย. 2020 11:17 am บอร์ด Programming - PHP
5
64
อ 22 ก.ย. 2020 1:00 am โดย mindphp
phpBB เป็นโปรแกรมประเภทไหนมาดูกัน
โดย Udomsak2539 อ 15 ก.ย. 2020 6:25 pm บอร์ด phpBB user Guide Knowledge
0
49
อ 15 ก.ย. 2020 6:25 pm โดย Udomsak2539
รวบรวมข้อมูลเบื้องต้น phpBB คืออะไร ฟีเจอร์ และประวัติ
โดย fhakun อ 15 ก.ย. 2020 6:14 pm บอร์ด PHP Knowledge
0
50
อ 15 ก.ย. 2020 6:14 pm โดย fhakun
สอบถาม วิธีเปิดแจ้งเตือน skype ค่ะ
โดย fhakun อ 15 ก.ย. 2020 6:07 pm บอร์ด ถาม - ตอบ คอมพิวเตอร์
0
61
อ 15 ก.ย. 2020 6:07 pm โดย fhakun
ฟีเจอร์พื้นฐานของ phpBB
โดย fhakun อ 15 ก.ย. 2020 5:33 pm บอร์ด PHP Knowledge
0
54
อ 15 ก.ย. 2020 5:33 pm โดย fhakun
สอบถาม วิธีแทรกลิ้งค์ให้ข้อความค่ะ
โดย fhakun อ 15 ก.ย. 2020 4:42 pm บอร์ด ปัญหาการใช้ phpBB3, SMF, Joomla, Wordpress, CMS, CRM
5
117
อ 15 ก.ย. 2020 5:05 pm โดย fhakun
สอบถาม วิธีติดตั้ง kazaam ใน ubantu ค่ะ
โดย fhakun อ 15 ก.ย. 2020 3:26 pm บอร์ด ถาม - ตอบ คอมพิวเตอร์
7
87
อ 15 ก.ย. 2020 4:38 pm โดย mindphp
ไม่ทราบว่า viewtopic ทำยังไง
โดย Udomsak2539 จ 14 ก.ย. 2020 6:47 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
2
54
อ 15 ก.ย. 2020 10:06 am โดย Udomsak2539
แนะนำโปรแกรม ibis paint และเครื่องมือตัดต่อง่ายๆใน 1 นาที สำหรับมือใหม่
โดย fhakun จ 14 ก.ย. 2020 6:45 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
58
จ 14 ก.ย. 2020 6:45 pm โดย fhakun
รวมวิธี การเดินจาก สงขลา มา กทม.
โดย Udomsak2539 จ 14 ก.ย. 2020 5:10 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
1
77
อ 15 ก.ย. 2020 12:14 pm โดย mindphp
ความแตกต่างระหว่างภาษาอังกฤษและภาษาฝรั่งเศส
โดย fhakun จ 14 ก.ย. 2020 5:03 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
39
จ 14 ก.ย. 2020 5:03 pm โดย fhakun
วิธีเดินทางจากเมืองทองมาเกษตร
โดย fhakun จ 14 ก.ย. 2020 3:03 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
56
จ 14 ก.ย. 2020 3:03 pm โดย fhakun