Coding Gun

Gitlab คืออะไร?

Gitlab เป็นเครื่องมือที่ใช้เป็น remote repository(server ที่ใช้ในการเก็บ source code) เหมือนกับ github และ bitbucket แต่นอกจากการเป็น git server แล้ว gitlab ยังพัฒนา features ต่างๆเพื่อให้กลายการเป็น DevOps platform ซึ่งจะประกอบไปด้วย

ซึ่งเราจะเห็นว่าการใช้งาน gitlab นั้นจะคลอบคลุมเกือบทุก phase ใน DevOps เลยทีเดียวขาดแค่การ operation และการ monitoring เท่านั้น นอกจากนี้ใน gitlab ยังมีเครื่องมืออย่าง issues, fork, merge request(ในเครื่องมืออื่นๆ จะเรียก pull request) ที่จะช่วยให้เราสื่อสารกันได้ง่ายมากขึ้น

Gitlab มีให้เลือกทั้ง community edition และ enterprise edition Gitlab จึงเป็นเครื่องมือที่ถูกนำไปใช้ในระดับขององค์กรมากที่สุด

Git vs Gitlab vs Github

Git คืออะไร?

Git เป็น open-source ที่ใช้ในการจัดทำ version control ในฝั่ง client ดังนั้นในทางปฎิบัติเมื่อเรามี developer มากกว่า 1 คนก็จำเป็นต้องมี remote repository ที่คอยควบคุมการเปลี่ยนแปลงต่างๆที่เกิดขึ้น เราจึงต้องตั้ง server เพื่อเป็น remote repository ขึ้นมา

ซึ่งทางเลือกของ remote repository ที่ได้รับความนิยมมากๆในตอนนี้มีอยู่ 4 ตัว

Github คืออะไร?

Github คือ remote repository ที่ให้บริการแบบ Cloud service เราไม่ต้องติดตั้ง server เอง เหมาะสำหรับองค์กรที่ไม่ต้องการปวดหัวกับการดูแล Server และแถมด้วย service ต่างๆ ที่ github มีให้โดยที่ไม่ต้องติดตั้ง เช่น source code scan หรือ github actions

Github และ Gitlab เหมือนหรือต่างกันอย่างไร?

gitlab กับ github นั้นมีส่วนที่เหมือนกันตรงที่

Bitbucket คืออะไร?

Bitbucket คือ cloud service ที่ทำหน้าที่เป็น remote repository เหมือ่นกับ github แต่ github กับ bitbucket จะแตกต่างกันในเรื่องการติดตั้งเพราะ bitbucket จะสามารถติดตั้งบน server ของตัวเองได้ด้วย(มีให้เลือกทั้ง on-cloud และ on-premise)

Bitbucket จะเชื่อมกับ Project Management Tools อย่าง Jira และ Trello ได้ง่าย เพราะมาจากค่ายเดียวกัน

ตารางเปรียบเทียบ GitHub, GitLab และ Bitbucket แบบฟรีต่างกันยังไง

Smallest Pack GitHub GitLab Bitbucket
Public repositories Unlimited Unlimited Unlimited
Private repositories Unlimited Unlimited Unlimited
Collaborators public repositories Unlimited Unlimited 5 Users
Collaborators private repositories 3 Users Unlimited 5 Users
Host Cloud only Cloud or on-premise Cloud or on-premise
File Storage 1GB/project 10GB/project 1GB/project
Branch Compare Yes Yes Yes
Syntax Highligh Yes Yes Yes
Pull/Merge Request Yes Yes Yes
Webhook Yes Yes Yes
Boards Project boards Issue Boards Jira / Tello
CI/CD Github Actions Built-in CI/CD Bitbucket Pipelines
Pipeline N/A Yes Yes

คำศัพท์ที่ความหมายเดียวกันแต่ใช้ไม่เหมือนกัน

เนื่องจาก github, gitlab และ bitbucket จะมีศัพท์บางคำที่ต่างจากยี่ห้ออื่นแต่มีความหมายเหมือนกัน เราจึงสรุปคำศัพท์ที่มีความหมายเดียวกันไว้ในตารางนี้

GitHub GitLab Bitbucket
Pull Request Merge Request Pull Request
Gist Snippet Snippet
Repository Project Repository
Teams Organizations Groups

Azure DevOps คืออะไร?

นอกจาก gitlab, github และ bitbucket แล้วยังมีน้องใหม่ที่มาแรงมากอีกตัวนึงนั้นคือ Azure devops ซึ่ง

Azure Devops คือ remote repository ของ Microsoft ซึ่งพัฒนามาจาก Team Foundation Server(TFS) มีทางเลือกทั้ง on-cloud และ on-premise เหมือนกับ Gitlab และ Bitbucket แต่ของ Azure DevOps จะแยกออกเป็น product 2 ตัวคือ

ใน Azure DevOps จะประกอบไปด้วย services ย่อยๆ ดังนี้

Azure DevOps ถือเป็นเครื่องมือที่ครอบคลุมการทำงานมากที่สุด เพราะใช้ได้ตั้งแต่ตอน plan, build, test, release ไปจนถึง deploy

Gitlab project

gitlab project หรือ repository ในเครื่องมืออื่นๆ เป็นขั้นตอนแรกที่เราต้องสร้างขึ้นมา การสร้าง project มีขั้นตอนดังนี้

  1. เลือกวิธีการ create project

    • Create blank project เป็นการสร้าง project ขึ้นมาจากจุดเริ่มต้นจากทุกอย่างว่างเปล่า
    • Create from template สร้าง project ขึ้นมาจาก template ที่ gitlab คิดว่าเราน่าจะใช้ จะทำให้เราสร้าง project ได้เร็วขึ้น เหมาะสำหรับผู้ที่ใช้งานเป็นประจำอยู่แล้ว ที่ต้องการลดขั้นตอนที่ซ้ำไปซ้ำมา
    • Import project นำเข้า project จาก Github, Bitbucket หรือ Gitlab instance อื่นๆ
    • Run CI/CD for external repository ทางเลือกนี้เราจะไม่ใช้ gitlab เป็น remote repository แต่เราจะใช้แค่ gitlab ci/cd เท่านั้น source code จะมาจากแหล่งอื่น

    ในกรณีนี้เราต้องการแนะนำขั้นตอนในการสร้าง project เบื้องต้น เลยเลือก create blank project ก่อน

  2. กรอกข้อมูลเบื้องต้นของ project

    • projet name ตั้งขื่อ porject
    • porject url ใน gitlab url จะประกอบไปด้วย
      • baseurl จากใน configuration
      • group project จะถูกแบ่งแยกตาม group
      • project slug โดย default จะตั้งตาม project name เราสามารถเปลี่ยนให้สั้นลงและจำง่ายขึ้นได้
    • project description คำอธิบายว่าใน project นี้มีอะไรบ้าง
    • visibility level เราสามารถเลือกขอบเขตของ project ได้
      • private user ที่สามารถ clone project ได้ต้องมีสิทธิที่เข้าถึง project หรือ group นี้ได้
      • internal จะมีเฉพาะ server ที่เราติดตั้งเองเท่านั้น(on-premise) เป็นการเปิดให้ทุกคนที่ authentication ผ่านแล้วสามารถ clone project ได้
      • public project นี้สามารถเข้าถึงได้โดยไม่ต้องผ่าน authentication
    • Initial repository with a README ใน project จะมี README.md มาให้เรา โดย README.md จะเป็น document หน้าแรกเมื่อเราเปิดเข้าไปใน project เราควรจะมีวิธีการติดตั้งหรือใช้งานเบื้องต้นในหน้านี้
    • Enable Static Appication Security Testing(SAST) เป็นการตรวจสอบ deplendencies ที่เรานำมาใช้ว่ามีช่องโหว่หรือไม่ ถ้าเราเลือก option นี้ gitlab จะสร้าง .gitlab-ci.yml มาให้และกำหนดให้มีการ scan ตอนที่เราทำการ push code, merge request หรือ ตั้งเวลาในการ scan

gitlab โดย default จะเปิดหน้า register ให้ user สามารถสมัครสมาชิกได้เองซึ่งไม่เหมาะกับการใช้งานภายในองค์กร เราควรจะ disable sign-up หรือต้องให้ admin approve ก่อนเข้าใช้งาน

การแบ่งแยก project ตาม group จะช่วยให้เราเข้าถึงและกำหนด permission ให้กับ project ได้ง่ายขึ้น

Gitlab collaboration

Gitlab มีเครื่องมือที่จะช่วยให้การทำงานในทีม development นั้นลื่นไหลมากขึ้น เพราะการทำงานเป็นทีมย่อมต้องมีการสื่อสารที่ชัดเจน ยิ่งเป็นสิ่งที่เกี่ยวข้องกับการเปลี่ยนแปลง source code ถือเป็นเรื่องที่ sensitive มากๆ เราคงไม่อยากให้การเปลี่ยนแปลงใดๆใน source code มากระทบกับ code ที่เราเขียนไว้ เครื่องมือชุดนี้ถือว่าเป็นสิ่งจำเป็นที่ทุกยี่ห้อจำเป็นต้องมี ลองมาดูกันว่าเครื่องมือที่มากับ gitlab นั้นมีอะไรบ้าง

Gitlab to-do list

เราสามารสร้าง to-do item ได้จากหน้าต่างๆเหล่านี้ ในบทความนี้เราจะยกตัวอย่างแค่ Issues กับ Merge request เพราะน่าจะได้ใช้งานบ่อยกว่าตัวอื่นๆ

เข้าไปที่หน้าต่างๆด้่านบนแล้ว กดที่ปุ่ม Add a To Do ที่มุมขวาบน ดังรูป

Gitlab create to-do item
ที่มา https://docs.gitlab.com

นอกจากการกดปุ่ม add a to-do แล้วเราสามารถสร้าง to-do ได้ด้วยการ mention เหมือนใน slack หรือ twitter แบบนี้

**@alice** What do you think? cc: **@bob**

- **@carol** can you please have a look?

> **@dan** what do you think?

ในกรณีนี้ถ้าเราเขียน @alice What do you think? gitlab จะนำ message นี้ไปใส่ใน to-do ของ alice

การเขียน message ต่างๆใน gitlab จะใช้ markdown syntax

และหลังจากที่ทำตาม to-do item นั้นเรียบร้อยแล้วเราก็จะเข้ามา mark

Gitlab issues

issue หรือในบาง platform จะเรียกว่า ticket เป็นการระบุถึงสิ่งที่จะช่วยพัฒนา project ให้ดีขึ้น โดยอาจเป็น bugs, tasks หรือ ideas ต่างที่ต้องการ discuss

เราจะต้องเข้าไปที่ เมนู issues ด้านซ้ายมือ และกดปุ่ม new issue

Gitlab issues board
รูปภาพ: หน้า new issue สำหรับกรอกข้อมูล

ในหน้า new issue นี้จะมีช่องสำหรับระบุ assignee(issue นี้มอบหมายให้ใคร)

Gitlab issues board
ระบุ assignee ในช่องนี้เพื่อสร้าง to-do item
เราระบุ assignee เป็นใคร message นี้ก็จะไปโผล่ใน to-do ของ assignee คนนั้น

Milestone

milestone จะใช้ในการระบุวันที่เริ่มต้นและสิ้นสุดงานนั้นๆ เข้าไปที่เมนู issues แล้วก็เลือก milestone หลังจากนั้นคลิกปุ่ม new milestone

Create milestone
รูปภาพ: แสดงหน้า new milestone

หลังจากที่เราสร้าง milestone เรียนร้อยแล้วเราจะต้องนำ milestone นี้ไปใส่ไว้ใน issue โดยเข้าไปเลือก issue ที่ต้องการ(เลือกจากหน้า Issues > List) ดังรูป

Assign milestone to issue
รูปภาพ: แสดงการกำหนด milestone ให้กับ issue

Merge request

merge request หรือใน platform อื่นๆจะเรียกว่า pull request เป็นการขอ merge code อาจเป็นการแก้ bug หรือการเพิ่ม feature ใหม่เข้าไป ก่อนที่จะนำ code เข้าไปรวมกับคนอื่นก็อาจต้องผ่านการ review จาก maintainer หรือได้รับความเห็นจาก developer อื่นๆในทีมก่อน และเมื่อทุกคน ok แล้วเราก็ต้องตรวจสอบคุณภาพของ source code นั้นด้วยการ run automated test, ทำ security scan และขั้นตอนต่างๆใน CI/CD pipeline

Merge request
สร้าง merge request จาก issue

ในรูปที่ 2 จะเป็นการ merge request จากการ frok project ซึ่งจะเป็นการ merge จาก alice/hello-world:super_hello เข้าไปยัง josh/hello-world/master

Merge request
สร้าง merge request จากการ frok project

ในการสร้าง merge request นั้นจะเกิดจากสถานการณ์ ต่างๆ ดังนี้

ทีนี้ตอนสร้าง merge request ขึ้นอยู่กับว่าเรามีการกำหนดผู้ที่ต้องทำ code review(reviewer) รึเปล่า ถ้ามีต้องให้ reviewer เข้ามากด approve ด้วยถึงจะทำการ merge ได้

ถ้าเรานำหน้าชื่อของ merge request ว่า Draft: เราจะต้องกดปุ่ม make ready เพื่อเปลี่ยน state ก่อนทำการ merge

Gitlab API

เราสามารถสั่งให้ gitlab ทำงานโดยอัตโนมัติได้ด้วยการเรียกใช้งาน gitlab api โดยที่เราสามารถใช้งาน api ได้ทั้ง REST API และ GraphQL API

นอกจากการใช้ command line แล้วเรายังสามารถใช้ GraphiQL และ Rails console มาช่วยให้เราทำงานกับ GraphQL ได้ง่ายขึ้น

Gitlab CI/CD

Gitlab CI/CD ถืิอเป็นเครื่องมือที่ช่วยให้เราทำได้ทั้ง Continuous Integration(CI), Continuous Delivery(CD) และ Continuous Deployment(CD) โดยไม่จำเป็นต้องใช้เครื่องมืออื่นเข้ามาช่วย ในบทความการทำ CI/CD ด้วย Gitlab จะอธิบายตั้งแต่ความหมายของ CI/CD และการใข้งาน gitlab CI/CD เบื้องต้น ใครยังไม่เคยใช้เข้าไปอ่านบทความนี้ต่อได้เลย

อ่านต่อเพิ่มเติมได้ที่นี่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security