TEAM DEVELOPMENT ENVIRONMENT & WORKFLOW (1) - VERSION CONTROL SYSTEM
ช่วงเวลาสองสัปดาห์ที่ผ่านมาหลังสอบไล่ Project I เสร็จหลาย คนอาจจะเริ่มอ่านหนังสือสอบไล่ตัวอื่นกันบ้างแล้ว ผมก็สอบครับ แต่สอบน้อยกว่าคนอื่น (3 ตัว) ช่วงเวลาที่หยุดระหว่างสอบ นอกจากจะอ่านหนังสือ แล้วสิ่งที่ผมไม่อาจลืมได้คือ Project II เหลือเวลาให้ Implement กับ Testing เพียงแค่ 4 เดือนโดยประมาณนับจากนี้ ซึ่งสิ่งที่ยากไม่ใช่เวลา แต่เป็นคนครับ ผมตั้งคำถามกับตัวเองว่าทำยังไงถึงจะให้คน 3 คนทำงานใน Project เดียวกันได้ เร็วที่สุด
จุดประสงค์ที่ผมเขียนเอนทรี่ในชุด Team Development Environment & Workflow (ตอนต่อๆ ไปจะเรียกมันว่า TDE&W นะครับ) ก็เพื่อที่จะรวบรวมคำถามและวิธีการที่ผมเคยสงสัยมาตลอดในการสร้าง Software ออกมาตัวนึง เพื่อเก็บไว้ใช้อ่านทวนทีหลัง และที่สำคัญไว้เผยแพร่ความรู้ให้กับคนที่ยังไม่รู้เหมือนผมก่อนหน้านี้ จริงอยู่ถ้าในโลกการทำงานแล้วเรื่องแบบนี้บางครั้งเป็นเรื่องที่ Basic มากแต่ถ้ามองย้อนกลับมาในระดับการศึกษาผมค้นพบว่า น้อยคนที่จะเรียนรู้ลำดับการทำงานแบบนี้ซึ่งสามารถช่วยให้ทำงานได้อย่างเป็นระบบและมีประสิทธิภาพสูงขึ้นมาก
Git Workflow
คำถามแรกที่ผมถามตัวเองอย่างที่ผมได้บอกไปแล้วผมคิดถึง Git ก่อนเลยครับเนื่องจากมีประสบการณ์การทำงานกับมันมาบ้างใน Project ที่ใช้ Rails แต่สิ่งสำคัญอย่างนึงที่ผมยังไม่รู้คือ Git Workflow ครับโชคดีที่มีคนเขียนแนะนำเรื่องนี้ไว้แล้วในบทความเรื่องA Successful Git branching model
บทความนี้อธิบายไว้อย่างคร่าวๆว่าในการ Develop Software ขึ้นมาซักตัวนั้นเราควรจะมีแผนการในการแตกสาขา (Branch) ของ Source Code ที่เราเก็บไว้อย่างไรโดยจะแตกออกเป็น Branch หลักๆอยู่ 2 Branch คือ
- Master :: เป็น Branch หลักของตัวโค้ดเวอร์ชั่นสมบูรณ์แล้วพร้อมจะนำเข้าสู่ Server ในระดับ Production ซึ่งถ้ามองตามการเปลี่ยนแปลงภายในระบบก็คือ Major Change นั้นเองครับ
- Develop :: เป็น Branch หลักในการทำงานของทีม โดย Branch นี้จะมีการแก้ไขเปลี่ยนแปลงอยู่เกือบตลอด และเมื่อโค้ดใน Branch นี้สมบูรณ์แล้วก็จะถูก Merge เข้าสู่ Master Branch ต่อไป
นอกจากนั้นแล้วยังมี Branch อื่นๆ ที่มีความจำเป็นในการทำงานเนื่องจาก ถ้ามีแค่ 2 Branch นี้แล้ว Developer ทำการยำการทำงานอยู่ที่ Develop Branch อย่างเดียวก็ยังมีโอกาสสูงมากที่โปรเจ็คจะ Fail เนื่องจากโค้ดมันชนกัน ด้วยเหตุนี้จึงมี Branch อื่นๆ ที่เรียกว่า Supporting branch ไว้สำหรับการทำงานในส่วนต่างๆ ที่แยกจากกันดังนี้
- Feature :: สำหรับใน branch นี้มีไว้เพื่อให้นักพัฒนาทำการแยกไป เพื่อพัฒนา Function/Module หรือความสามารถของระบบเดี่ยวๆ แยกต่างหาก เพื่อป้องกันความผิดพลาด เมื่อพัฒนาเสร็จเรียบร้อยดีแล้ว ก็จะรวม branch นี้กลับมาที่ develop branch เพื่อจะรอปล่อยใน Minor release ต่อไป
- Release :: จะเป็นตัวเชื่อมระหว่าง Develop กับ Master เมื่อทีมประเมินว่าโค้ดที่อยู่ใน develop branch นั้นเสถียรดีแล้ว ก็จะทำการปล่อย Minor release ที่ branch นี้เพื่อเช็คความเรียบร้อยอีกครั้งนึง ซึ่งถ้ายังมีปัญหาอยู่ใน branch นี้ก็จะทำการรวมกลับไปที่ develop branch เพื่อทำการแก้ไขข้อผิดพลาด (Bugfixes) ก่อนจะทำการส่งกลับมาที่ Release branch ใหม่ เมื่อ Team เห็นว่าโค้ดไม่มีข้อผิดพลาดอะไรแล้วก็จะทำการรวมไปที่ Master branch เพื่อส่งเป็น Major Update ต่อไป
- Hotfixes :: เมื่อโค้ดที่อยู่ใน Master branch มีปัญหาทางทีมจะทำการแก้ปัญหาในจุดนั้นทันทีโดยแยกโค้ดออกมาที่ branch นี้ เมื่อทำการแก้ไขข้อผิดพลาดเสร็จเรียบร้อยแล้ว ทางทีมก็จะทำการรวมโค้ดกลับไปที่ Master branch เพื่อแก้ไขข้อผิดพลาดและ Develop branch เพื่อทำการพัฒนาต่อไป
การติดตั้ง Git
ก่อนที่เราจะทำการใช้งาน Git เป็น Version Control Software ของโปรเจ็คเราได้นั้นเราต้องมี Software ของมันก่อนครับซึ่งสามารถเข้าไปโหลดเวอร์ชั่นล่าสุดได้ที่http://git-scm.com/ครับซึ่งระหว่างการติดตั้งจะมีให้เราเลือกว่าให้เราใช้ Git ผ่านทางไหนได้บ้างแนะนำให้เลือก Run Git from the Windows Command Prompt ครับ (เดี๋ยวจะได้ใช้ประโยชน์ในอนาคต) เมื่อติดตั้งเสร็จแล้วก็จะสามารถลองใช้งานได้ผ่านทาง Git Bash หน้าตาประมาณรูปข้างบนครับหรือจะใช้ Git GUI ก็ได้แต่เราจะยังไม่ทำการตั้งค่าเบื้องต้น Git ตอนนี้ครับเพราะจะใช้ตัวนี้เป็นแค่ Back-end ของ Client อีกตัวที่เราจะใช้กันจริงๆซึ่งก็คือ SourceTree ครับ
การสมัครสมาชิก GitHub
สำหรับ Host หรือ Repository ของโค้ดในตอนนี้ผมเลือกใช้ GitHub ก่อนนะครับ (ตอนหลังๆจะย้ายไปใช้ตัวอื่น) โดยการสมัครสมาชิกสามารถเข้าไปสมัครได้ที่หน้าแรกตาม URL นี้เลยครับhttps://github.com/เมื่อสมัครสมาชิกเข้ามาแล้วส่วนสำคัญคือการตั้งค่า SSH Keys ที่จะใช้ในการยืนยันตัวตนของเครื่องเราเวลาที่จะทำการส่งโค้ดเข้าสู่ Repository ของตัว GitHub โดยสามารถเข้าไปตั้งค่าได้ที่ Account settings > SSH Keys โดยจะมีลิงค์บอกวิธีการสร้าง Keys อยู่ข้างบนสำหรับใน Windows ให้เปิด Git Bash ขึ้นมาแล้วทำตามขั้นตอนดังนี้ครับ
- เช็คดูก่อนว่าในเครื่องเราได้มีการสร้าง ssh keys ไว้แล้วหรือยังโดยพิมพ์คำสั่ง
$ cd ~/.ssh
ซึ่งถ้าขึ้นว่า No such file or directory ก็แสดงว่าเครื่องเรายังไม่เคยสร้าง Keys ใดๆ ไว้นะครับ - ให้ทำการสร้าง SSH Key ใหม่ขึ้นมาโดยพิมพ์คำสั่ง
$ ssh-keygen -t rsa -C "your_email@example.com"
โดย email ที่ใส่ก็คือ email เดียวกับที่เราใช้สมัคร Account ของ GitHub ไปก่อนหน้านี้ครับระหว่างนั้นจะมีให้เราใส่ passphrase เพื่อเพิ่มความปลอดภัยของ Key ที่เราสร้างขึ้นครับซึ่งถ้าไม่ต้องการเปลี่ยนแปลงอะไรก็กดปุ่ม Enter ข้ามไปครับ - เมื่อสร้างคีย์เสร็จเรียบร้อยแล้วนะครับให้เราทำการ Copy ตัวเนื้อ Key โดยพิมพ์คำสั่ง
$ clip < ~/.ssh/id_rsa.pub
หลังจากนั้นแล้วให้เรากลับมาที่หน้า Account settings > SSH Keys แล้วเลือก Add SSH Key แล้วทำการ Paste ตัวเนื้อ Key ลงในช่อง Key เสร็จเรียบร้อยแล้วก็กด Add key ก็เป็นอันเสร็จเรียบร้อยครับ (ถ้ามีขึ้นให้ยืนยันพาสเวิร์ดอีกทีก็กรอกแล้วกด Enter ไปตามขั้นตอนครับ) - ตอนนี้เราก็ได้ Add Public Key ของเราเข้าที่ GitHub แล้วนะครับ โดยเราสามารถทดสอบดูได้ว่า Key ที่เราแอดไปสามารถใช้ได้หรือไม่โดยลองพิมพ์คำสั่งนี้ลงใน Git Bash ครับ
$ ssh -T git@github.com
หลังจากนั้นแล้วจะมีถามยืนยันที่จะเพิ่ม Host ก็พิมพ์ "yes" แล้วรอซักพัก ถ้าขึ้นว่า
Hi username! You've successfully authenticated, but GitHub does not provide shell access. ก็แสดงว่า Key ที่เราเพิ่มเข้าไปตะกี้สามารถใช้งานได้แล้วนะครับ
การติดตั้ง SourceTree
เพื่อความสะดวกนะครับผมได้เลือกใช้ SourceTree ซึ่งเป็น Git GUI Client ตัวนึงในการใช้งานเนื่องจากไม่ต้องเสียเวลาจำคำสั่งมากและใช้งานง่ายสำหรับมือใหม่ในการทำความเข้าใจ Git รวมถึงสนับสนุนการทำงานแบบ Git Flow ที่ได้กล่าวไปแล้วข้างต้นได้อย่างเต็มที่ตัวโปรแกรมสามารถเข้าไป Download ตัวติดตั้งได้ตาม URL นี้ครับhttp://www.sourcetreeapp.com/
เมื่อติดตั้งเสร็จแล้วจะมีตัวเลือกให้เราตั้งค่าพื้นฐานของการใช้งานก็ใส่ Full Name และ Email address ไปนะครับ (อย่าลืมกด I agree to the SourceTree license agreementนะครับ) หลังจากนั้นกด Next ครับในส่วนของ SSH Client Configuration ก็ให้เลือกเป็น OpenSSH ต่อมาจะเป็นการตั้งค่ากับ remote repository ก็ใส่ Username กับ Password ของ github ไปให้เรียบร้อยแล้วกด Finish ระบบจะทำการทดสอบการเชื่อมต่อถ้าเชื่อมต่อได้ก็จะเข้าสู่โปรแกรมได้เลยครับสำหรับในตอนแรกก็จบเพียงเท่านี้นะครับในตอนต่อไปเราจะมาพูดถึงการใช้งาน Git เบื้องต้นโดยใช้ SourceTree กันครับ
Original post at: https://yothinix.blogspot.com/2013/10/team-development-environment-workflow-1.html