Screen Shot 2558-04-02 at 11.28.47 AM
ในการพัฒนาระบบงานด้วย PHP นั้น
มีหลายคน ถามว่า ถ้าต้องสร้างระบบ Continuous Integration (CI System) ล่ะ
จะต้องทำอย่างไรบ้าง ?

ผมเลยสรุปในแบบที่ผมทำอยู่ก็แล้วกัน
เพื่อทำให้เห็นภาพ และ เข้าใจว่าเป็นอย่างไร

โดย software ที่ผมใช้งานนั้น ประกอบไปด้วย

  • PHP 5.4 ขึ้นไป
  • Jenkins เวอร์ชั่นล่าสุด ง่ายๆ ก็ download WAR file มาใช้
  • Git
  • Composer
    • phpUnit สำหรับเขียน Unit test

ก่อนจะเริ่มสร้างระบบ Continuous Integration นั้น

แนะนำให้อ่านเรื่อง 10 แนวปฏิบัติสำหรับ Continuous Integration ก่อนนะครับ
เพื่อทำให้รู้ และ เข้าใจว่า มันคืออะไร เป็นอย่างไร กันแน่

ซึ่งข้อที่สำคัญมากๆ ก็คือ เครื่องของคุณต้องสามารถ run ได้ด้วยนะ
ถ้าเครื่องคุณเองยัง run ไม่ได้
ก็ไม่ต้องคิดถึงระบบ Continuous Integration เลยนะ

ดังนั้น มาเริ่มต้น configuration ที่เครื่องของคุณก่อนเลย

1. ต้องทำการติดตั้ง Software ที่บอกก่อนนะ
จากนั้นทำการกำหนด และ สร้าง PHP Project มาดังรูป
Screen Shot 2558-04-02 at 10.44.04 AM

คำอธิบาย

  • composer.json คือ config file สำหรับกำหนด dependency library ต่างๆ ที่ project จะใช้งาน
  • phpunit.xml คือ config file สำหรับการชุดการทดสอบพวก Unit test, Integration test เป็นต้น
  • test คือ folder เอาไว้เก็บชุดของการทดสอบต่างๆ
  • web คือ folder เอาไว้เก็บ code ของ project นั่นเอง

และทำการเก็บ code เหล่านี้ไปไว้ใน Version control ซะ ซึ่งผมใช้ Git

2. มาดูไฟล์ composer.json กันหน่อยว่ามีหน้าตาอย่างไร

คำอธิบาย
ใช้ library เพียงตัวเดียวคือ phpUnit
กำหนด Autoload ไปยัง folder ดังนั้น สามารถใช้งาน class ต่างๆ ใน folder web ได้เลย โดยไม่ต้อง include หรือ require เลย

3. ทำการ download library ที่กำหนดไว้ มาใช้ใน project สิ
ด้วยคำสั่ง
$composer install

ผลการทำงานดังรูป
Screen Shot 2558-04-02 at 11.13.26 AM

แล้ว composer มันจะ download library มาไว้ที่ folder vendor ใน project เรา
และเราสามารถ run phpUnit เพื่อทดสอบระบบด้วยคำสั่ง
$vendor/bin/phpunit

ผลการทำงานดังรูป
Screen Shot 2558-04-02 at 11.13.48 AM

ผลที่ได้จากการ run phpUnit คือ ไฟล์ results/phpunit/phpunit.xml
ซึ่งผมทำการ configuration ไว้ในไฟล์ phpunit.xml ดังนี้

จากทั้งสามขั้นตอนเราได้อะไรบ้าง ?

สิ่งที่เราได้มาก็คือ ขั้นตอนการทำงาน ประกอบไปด้วย

  1. ทำการเก็บ code ไว้ใน Git server
  2. ทำการ download library ต่างๆ ผ่าน composer
  3. ทำการทดสอบระบบงานผ่าน phpUnit

โดยทั้ง 3 ขั้นตอน ผมสามารถ run ที่เครื่องผมได้ด้วยนะ ( สำคัญมากๆ )

จากนั้น มาเริ่มติดตั้งระบบ Continuous Integration กันดีกว่า

เนื่องจากการพัฒนา software ต้องทำงานเป็นทีม
ดังนั้น แต่ละเครื่องของคนในทีม run ได้คงไม่พอ
เพราะว่า เราต้องการการ integrate ระบบกันบ่อยๆ
เพื่อให้รู้สถานะของ software ที่เราพัฒนาว่า มันยังทำงานได้อย่างถูกต้องนะ

โดยผมเลือกใช้งาน Jenkins นะ
มาเริ่มติดตั้ง และ configuration กันดีกว่า

1. ทำการ Download Jenkins มา ซึ่งผมใช้ WAR file นะ
ทำการ start Jenkins server ด้วยคำสั่ง
$java -jar jenkins.war

เพียงเท่านี้ก็ start ขึ้นมาได้ล่ะ
หรือสามารถตรวจสอบผ่าน browser
โดยไปที่ url = http://localhost:8080 จะแสดงดังรูป

Screen Shot 2558-04-02 at 11.06.53 AM

2. ให้ทำการสร้าง Item ( New Item )
สำหรับสร้างขั้นตอนการทำงานที่เราต้องการแบบอัตโนมัติ
โดยตั้งชื่อว่า HelloPHP ดังรูป

Screen Shot 2558-04-02 at 11.08.59 AM

3. จากนั้นให้ทำการ configuration Item นี้
โดยเริ่มจาก กำหนด Source code management ก่อน
ซึ่งผมใช้ Git ดังนั้น สามารถกำหนดได้ดังรูป
( โดยปกติ Jenkins จะไม่มี Git มาให้นะครับ สามารถติดตั้งผ่าน plug in ได้ )

Screen Shot 2558-04-02 at 11.11.24 AM

4. จากนั้น ทำการ configuration ส่วนการทำงานจริงๆ หรือ การ build
ซึ่งประกอบไปด้วย 2 ขั้นตอนคือ

  1. Download library ด้วย composer
  2. ทำการทดสอบผ่าน phpUnit

สามารถกำหนดในส่วนของ Build Step ดังรูป
Screen Shot 2558-04-02 at 11.14.56 AM

5. ต้องให้ Item นี้แสดงผลการทดสอบด้วยสิ ใช่ไหม
ดังนั้น สามารถกำหนดได้ในส่วนของ Post Build ดังนี้

Screen Shot 2558-04-02 at 11.16.30 AM

6. ทำการกดบันทึก และ ลองสั่งให้ build เล่นๆ
จะได้ผลออกมาดังรูป

Screen Shot 2558-04-02 at 11.19.28 AM

เพียงเท่านี้ ก็สามารถเริ่มต้นสร้างระบบ Continuous Integration
สำหรับ PHP Project แบบง่ายๆ ได้แล้วครับ
ยังสามารถเพิ่ม Item สำหรับการทดสอบในระดับอื่นๆ ได้อีก
รวมไปถึงการ deploy ระบบงานครับ

ซึ่งเราสามารถร้อยเรียงขั้นตอนการทำงาน
ออกมาอยู่ในรูปแบบที่เรียกว่า Build Pipeline ต่อไป

Screen Shot 2558-04-02 at 11.22.22 AM

ตัวอย่าง source code อยู่ที่ Github :: Up1