Gitlab คืออะไร?
- Git vs Gitlab vs Github
- เริ่มต้นสร้าง gitlab project
- เครื่องมือที่ใช้ในการสื่อสารใน gitlab มีอะไรบ้าง
- การใช้งาน gitlab api
- รู้จักกับ gitlab ci
Gitlab เป็นเครื่องมือที่ใช้เป็น remote repository(server ที่ใช้ในการเก็บ source code) เหมือนกับ github และ bitbucket แต่นอกจากการเป็น git server แล้ว gitlab ยังพัฒนา features ต่างๆเพื่อให้กลายการเป็น DevOps platform ซึ่งจะประกอบไปด้วย
- plan มี issue board และ milestone สำหรับการวางแผนเบื้องต้น
- code การจัดการ version ของ source code ซึ่งเป็น core หลักของ gitlab อยู่แล้ว
- build ใน gitlab มี gitlab ci สำหรับการสร้าง build pipeline
- test เราสามารถ run automated test ใน build pipeline
- release และ deploy สามารถสร้าง release pipeline เพื่อกำหนดรุปแบบของการ deploy
ซึ่งเราจะเห็นว่าการใช้งาน 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 ตัว
- Gitlab
- Github
- Bitbucket
- Azure DevOps
Github คืออะไร?
Github คือ remote repository ที่ให้บริการแบบ Cloud service เราไม่ต้องติดตั้ง server เอง เหมาะสำหรับองค์กรที่ไม่ต้องการปวดหัวกับการดูแล Server และแถมด้วย service ต่างๆ ที่ github มีให้โดยที่ไม่ต้องติดตั้ง เช่น source code scan หรือ github actions
Github และ Gitlab เหมือนหรือต่างกันอย่างไร?
gitlab กับ github นั้นมีส่วนที่เหมือนกันตรงที่
- ทำหน้าที่เป็น remote repository เหมือนกัน
- สามารถทำ Continuous Integration ได้เหมือนกัน(github มี github actions)
- Gitlab ทำ project management ได้นิดหน่อยเพราะมี milestone แต่ github ไม่มี
- Gitlab มีทางเลือกทั้ง on-cloud และ on-premise(ติดตั้งลงบน server ของตัวเอง) ส่วน github มีแค่ on-cloud
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 สำหรับใช้งาน on-cloud
- Azure DevOps Server สำหรับการติดตั้งลงบน server ของเราเอง(on-premise)
ใน Azure DevOps จะประกอบไปด้วย services ย่อยๆ ดังนี้
- Azure Board เป็น project tracking tools เหมือนกับ trello และ Jira
- Azure Repos เป็น remote repository เหมือนกับ gitlab, github และ bitbucket
- Azure Pipelines เป็นเครื่องมือที่ใช้ในการทำ CI/CD เหมือนกับ Jenkins และ Gitlab CI
- Azure Artifacts ใช้สำหรับเก็บ package ที่มาจาก Maven, npm, NuGet, Python package หรือ libery ต่างๆที่ต้องการ share กันภายใน
Azure DevOps ถือเป็นเครื่องมือที่ครอบคลุมการทำงานมากที่สุด เพราะใช้ได้ตั้งแต่ตอน plan, build, test, release ไปจนถึง deploy
Gitlab project
gitlab project หรือ repository ในเครื่องมืออื่นๆ เป็นขั้นตอนแรกที่เราต้องสร้างขึ้นมา การสร้าง project มีขั้นตอนดังนี้
-
เลือกวิธีการ 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 ก่อน
-
กรอกข้อมูลเบื้องต้นของ 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 เพราะน่าจะได้ใช้งานบ่อยกว่าตัวอื่นๆ
- Issue
- Merge request
- Epic
- Design
- Incident
เข้าไปที่หน้าต่างๆด้่านบนแล้ว กดที่ปุ่ม Add a To Do ที่มุมขวาบน ดังรูป
นอกจากการกดปุ่ม 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
ในหน้า new issue นี้จะมีช่องสำหรับระบุ assignee(issue นี้มอบหมายให้ใคร) เราระบุ assignee เป็นใคร message นี้ก็จะไปโผล่ใน to-do ของ assignee คนนั้น
Milestone
milestone จะใช้ในการระบุวันที่เริ่มต้นและสิ้นสุดงานนั้นๆ เข้าไปที่เมนู issues แล้วก็เลือก milestone หลังจากนั้นคลิกปุ่ม new milestone
หลังจากที่เราสร้าง milestone เรียนร้อยแล้วเราจะต้องนำ milestone นี้ไปใส่ไว้ใน issue โดยเข้าไปเลือก issue ที่ต้องการ(เลือกจากหน้า Issues > List) ดังรูป
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
ในรูปที่ 2 จะเป็นการ merge request จากการ frok project ซึ่งจะเป็นการ merge จาก alice/hello-world:super_hello เข้าไปยัง josh/hello-world/master
ในการสร้าง merge request นั้นจะเกิดจากสถานการณ์ ต่างๆ ดังนี้
- แก้ issue เสร็จแล้วต้องการ merge code กลับ (หลังจาก merge แล้ว gitlab จะปิด issue นี้โดยอัตโนมัติ)
- แตก branch ออกมาเพิ่ม feature ใหม่ แล้วต้องการ merge กลับ
- frok project ออกมาแก้ไขหรือเพิ่ม feature แล้วก็ต้องการ merge กลับ
ทีนี้ตอนสร้าง 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
-
เรียกใช้ Gitlab API แบบ REST เราสามารถเข้าไปดู REST API Reference ได้ที่นี่
ตัวอย่างการเรียกใช้ gitlab api แบบ REST
curl "https://gitlab.example.com/api/v4/projects"
แสดง response ออกมาด้วยให้ใช้คำสั่ง
curl --include "https://gitlab.example.com/api/v4/projects"
หรือถ้าอยากให้ Fail(ในการทำงานแบอัตโนมัติใน ci/cd เราต้องการ exit fail เพื่อให้การ build นั้น fail)
curl --fail "https://gitlab.example.com/api/v4/does-not-exist"
-
เรียกใช้ Gitlab API แบบ GraphQL เราสามารถเข้าไปดู GraphQL API reference ได้ที่นี่
ตัวอย่างการใช้ GraphQL API ผ่านทาง command line
GRAPHQL_TOKEN=<your-token> curl "https://gitlab.com/api/graphql" --header "Authorization: Bearer $GRAPHQL_TOKEN" \ --header "Content-Type: application/json" --request POST \ --data "{\"query\": \"query {currentUser {name}}\"}"
เราสามารถใช้ single quote แทน double quote จะได้อ่านง่ายขึ้นแบบนี้
curl "https://gitlab.com/api/graphql" --header "Authorization: Bearer $GRAPHQL_TOKEN" \ --header "Content-Type: application/json" --request POST \ --data '{"query": "query {currentUser {name}}"}'
นอกจากการใช้ 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 เบื้องต้น ใครยังไม่เคยใช้เข้าไปอ่านบทความนี้ต่อได้เลย