Team Development Environment & Workflow (1) :: Version Control System

https://mockupstogo.mybalsamiq.com/projects/diagrams/Git%20Workflow

       ช่วงเวลาสองสัปดาห์ที่ผ่านมาหลังสอบไล่ 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 ขึ้นมาแล้วทำตามขั้นตอนดังนี้ครับ
  1. เช็คดูก่อนว่าในเครื่องเราได้มีการสร้าง ssh keys ไว้แล้วหรือยังโดยพิมพ์คำสั่ง
    $ cd ~/.ssh                                                                                                     
    ซึ่งถ้าขึ้นว่า No such file or directory ก็แสดงว่าเครื่องเรายังไม่เคยสร้าง Keys ใดๆ ไว้นะครับ
  2. ให้ทำการสร้าง SSH Key ใหม่ขึ้นมาโดยพิมพ์คำสั่ง
    $ ssh-keygen -t rsa -C "your_email@example.com"                    
           โดย email ที่ใส่ก็คือ email เดียวกับที่เราใช้สมัคร Account ของ GitHub ไปก่อนหน้านี้ครับระหว่างนั้นจะมีให้เราใส่ passphrase เพื่อเพิ่มความปลอดภัยของ Key ที่เราสร้างขึ้นครับซึ่งถ้าไม่ต้องการเปลี่ยนแปลงอะไรก็กดปุ่ม Enter ข้ามไปครับ
  3. เมื่อสร้างคีย์เสร็จเรียบร้อยแล้วนะครับให้เราทำการ Copy ตัวเนื้อ Key โดยพิมพ์คำสั่ง
    $ clip < ~/.ssh/id_rsa.pub                                                               
           หลังจากนั้นแล้วให้เรากลับมาที่หน้า Account settings > SSH Keys แล้วเลือก Add SSH Key แล้วทำการ Paste ตัวเนื้อ Key ลงในช่อง Key เสร็จเรียบร้อยแล้วก็กด Add key ก็เป็นอันเสร็จเรียบร้อยครับ (ถ้ามีขึ้นให้ยืนยันพาสเวิร์ดอีกทีก็กรอกแล้วกด Enter ไปตามขั้นตอนครับ)
  4. ตอนนี้เราก็ได้ 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 กันครับ

Comments

เขียนเยอะๆ เลยนะครับ ติดตามๆ
Unknown said…
รอภาค 2 อยู่นะครับ