Git Auto Deploy

featureimage

อยากทำ Auto Deploy มานานแต่ไม่เคยลงมือทำจริงซักที จำได้ว่าวันก่อนได้เข้าไปอ่าน Blog ของคุณ Kokarat แล้วลองทำตาม พบว่าไม่ยากอย่างที่คิด และมีประโยชน์มาก (ต้องของคุณ คุณ Kokarat มา ณ ที่นี้ด้วยครับ)

บันทึกนี้จะใช้วิธีที่ได้อ่าน มาทดลองใช้กับเครื่องที่มีอยู่เผื่ออนาคตจำเป็นต้องใช้กับ Production

เครื่องที่ใช้ทดสอบจะมี 3 เครื่องตามนี้

  • iMac ทำหน้าที่เป็นเครื่อง Develop
  • Macbook Pro จำลองตัวเองเป็น Server ตัวแรก
  • VirtualBox VM (Cent OS) จำลองตัวเองเป็น Server ตัวที่สอง

จัดการกับ Server ปลายทาง

ขั้นแรกก็ไปจัดการกับ Server ปลายทางก่อน เพราะเราจำเป็นต้องใช้ git URL ในการกำหนด remote server

Macbook Pro (Server ตัวแรก)

ไปที่ System Preferences -> Sharing แล้วเปิด Remote Login เพื่อให้เครื่อง Develop SSH เข้ามาได้ (ดู username/ip ได้จากหน้าจอนี้เลย)

OS X Remote Login

Remote ไปเครื่องเป้าหมาย

ให้ใช้เครื่องไหนก็ได้ remote เข้าไปที่เครื่องเป้าหมาย ที่กะว่าจะให้เป็น remote server

Phoenix:~ pangpond$ sudo ssh -l imac109 192.168.0.38  

สร้าง Git Repository

ขั้นตอนนี้เราจะสร้าง Git Repository ด้วย option --bare เพื่อจะทำตัวเป็น Remote Repository

หลังจากssh เข้ามาได้ก็ลงมือสร้าง git repos แต่ก่อนอื่นให้ สร้าง Directory ไว้เก็บ Repos สวยๆก่อน

MacbookPro:~ imac109$ mkdir repos  
MacbookPro:~ imac109$ cd repos  

สร้าง Repository ด้วย option --bare

MacbookPro:repos imac109$ mkdir backbone_tutorial.git  
MacbookPro:repos imac109$ cd backbone_tutorial.git/  
MacbookPro:backbone_tutorial.git imac109$ git init --bare  
Initialized empty Git repository in /Users/imac109/repos/backbone_tutorial.git/  
MacbookPro:backbone_tutorial.git imac109$ git update-server-info  

เข้าไปที่ hooks แล้วสร้างไฟล์ post-receive เพื่อใส่ script auto checkout

MacbookPro:backbone_tutorial.git imac109$ cd hooks/  
MacbookPro:hooks imac109$ vim post-receive  

ใส่เนื้อหาใน post-receive ตามด้านล่าง (เปลี่ยน Path --work-tree ให้ตรงกับงาน และระบุที่อยู่ของ .git ตามที่ได้สร้างไว้ก่อนหน้า)

#!/bin/sh
git --work-tree=/Users/imac109/Sites/backboneTutorial --git-dir=/Users/imac109/repos/backbone_tutorial.git checkout -f  
~

กำหนดให้ post-receive execute ได้

MacbookPro:hooks imac109$ chmod +x post-receive  

iMac (เครื่อง Develop)

กลับมาที่เครื่องตัวเอง ให้ clone งานมาไว้ที่ directory หล่อๆ ที่จะเอาไว้ทำงาน

Phoenix:~ pangpond$ git clone https://github.com/jashkenas/backbone.git Backbone  

พอ clone เสร็จก็ ทำการ add remote server ที่สร้างไว้ที่เครื่อง Macbook (อย่าลืม cd เข้าไปที่ path ที่ clone มาซะก่อน) ตัวอย่างนี้ใช้ชื่อ remote server ว่า serverMBP

Phoenix:~ pangpond$ cd Backbone/  
Phoenix:Backbone pangpond$ git remote add serverMBP ssh://imac109@192.168.0.38/Users/imac109/repos/backbone_tutorial.git  

จังหวะนี้เราจะลอง push งานไปที่ remote server บนเครื่อง Macbook ที่เราตั้งชื่อไว้ว่า serverMBP

Phoenix:Backbone pangpond$ git push serverMBP master  

ลองไปตรวจสอบที่เครื่อง remote server (Macbook) ว่าได้ไฟล์มาหรือเปล่า ก็ ssh เข้าไปเหมือนเดิม แล้วไป ls ดู directory ที่เรากำหนดไว้

MacbookPro:~ imac109$ ls -l /Users/imac109/Sites/backboneTutorial  
total 696  
-rw-r--r--   1 imac109  staff      16 Oct  7 14:58 CNAME
-rw-r--r--   1 imac109  staff    1006 Oct  7 14:58 CONTRIBUTING.md
-rw-r--r--   1 imac109  staff    1079 Oct  7 14:58 LICENSE
-rw-r--r--   1 imac109  staff    1865 Oct  7 14:58 README.md
-rw-r--r--   1 imac109  staff   19999 Oct  7 14:58 backbone-min.js
-rw-r--r--   1 imac109  staff   28133 Oct  7 14:58 backbone-min.map
-rw-r--r--   1 imac109  staff   64559 Oct  7 14:58 backbone.js
-rw-r--r--   1 imac109  staff     279 Oct  7 14:58 bower.json
-rw-r--r--   1 imac109  staff     459 Oct  7 14:58 component.json
drwxr-xr-x  11 imac109  staff     374 Oct  7 14:58 docs  
drwxr-xr-x   4 imac109  staff     136 Oct  7 14:58 examples  
-rw-r--r--   1 imac109  staff    8348 Oct  7 14:58 favicon.ico
-rw-r--r--   1 imac109  staff  192623 Oct  7 14:58 index.html
-rw-r--r--   1 imac109  staff      40 Oct  7 14:58 index.js
-rw-r--r--   1 imac109  staff    1093 Oct  7 14:58 package.json
drwxr-xr-x  14 imac109  staff     476 Oct  7 14:58 test  

จะพบว่ามีของเต็มเบยยยย เป็นอันสำเร็จ

หมายเหตุ การใช้ git push remote server เท่าที่สังเกตคือ มันจะ push ไป Server ปลายทางในกรณีที่มีการ index ไฟล์ใหม่ๆ เกิดขึ้นใน Working Directory เท่านั้น กรณีที่ ไฟล์ใน Git remote หายไป แล้วเรามาสั่ง push จาก Develop Machine จะไม่มีอะไรเกิดขึ้น ถ้าไม่ได้สั่งให้ Git ทำการ index ไฟล์ใหม่ๆ

VirtualBox VM Cent OS (Server ตัวที่สอง)

ทดสอบแต่กับเครื่อง Mac ก็ยังไม่มั่นใจว่า เวลาที่ต้อง Production จริงๆ บน CentOS หรือ Linux Distro อื่นๆ จะราบรื่นเหมือนกันหรือเปล่า ก็เลยต้องลองดูก่อน

ก่อนหน้านี้ติดตั้ง CentOS เป็น VM ไว้บน VirtualBox เรียบร้อยแล้ว ก็ทำเหมือนตัวก่อนหน้า SSH เข้าไปลุยเลย command เหมือนกันหมด แค่เปลี่ยน Path

Phoenix:~ pangpond$ sudo ssh -l root 192.168.0.203  
[root@CentOS ~]# mkdir /home/www/repos
[root@CentOS ~]# cd /home/www/repos/
#!/bin/sh
git --work-tree=/home/www/backboneTutorial --git-dir=/home/www/repos/backbone_tutorial.git checkout -f  
Phoenix:Backbone pangpond$ git remote add serverCent ssh://root@192.168.0.203/home/www/repos/backbone_tutorial.git