มาหัดเขียนบล็อคด้วย Middleman ตอนที่ 4 (Deployment)

มาหัดเขียนบล็อคด้วย Middleman ตอนที่ 4 (Deployment) Cover Image

Table of Contents

หลักจากจบ 3 Parts ตอนนี้ตัวบล็อคของเรา ก็เกือบจะเสร็จสมบูรณ์แล้ว (ในส่วน features หลักๆ) ที่เหลือก็อยู่ที่แต่ละคนจะไปปรับแต่ง เพิ่มเติมกันเอาเอง จึงขอข้ามไปขั้นตอน เมื่อสร้างบล็อคด้วย Middleman เสร็จแล้ว ส่วนสุดท้ายก็คือการ Deployment หรือก็คืออัพโหลดไฟล์ไปไว้ที่โฮสติ้งจริงๆ

Generate build folder

ใน Middleman จะมี feature สำหรับสร้างไฟล์เพื่อ deploy โดยเราจะใช้คำสั่ง

middleman build

create  build/stylesheets/clean-blog.css
     create  build/stylesheets/bootstrap.min.css
     create  build/stylesheets/bootstrap.css
     create  build/stylesheets/clean-blog.min.css
     ..
     create  build/2012/01/01/index.html

ตัว Middleman จะทำการ generate ไฟล์ต่างๆ ไว้ที๋โฟลเดอร์ build ในโปรเจ็คของเรา หากลองดูภายในโฟลเดอร์นี้ จะเห็นไฟล์ต่างๆประมาณนี้

├── 2012
│   ├── 01
│   │   ├── 01
│   │   │   ├── example-article.html
│   │   │   │   └── index.html
│   │   │   └── index.html
│   │   └── index.html
│   └── index.html
├── 2012-01-01-example-article
│   └── index.html
├── 2015
│   ├── 06
│   │   ├── 16
│   │   │   ├── index.html
│   │   │   └── my-new-article.html
│   │   │       └── index.html
│   │   └── index.html
│   └── index.html
├── feed.xml
├── images
│   ├── about-bg.jpg
│   ├── contact-bg.jpg
│   ├── home-bg.jpg
│   ├── post-bg.jpg
│   └── post-sample-image.jpg
├── index.html
├── index.html.erb.tmp
├── javascripts
│   ├── bootstrap.js
│   ├── bootstrap.min.js
│   ├── clean-blog.js
│   ├── clean-blog.min.js
│   ├── jquery.js
│   └── jquery.min.js
├── partials
├── stylesheets
│   ├── bootstrap.css
│   ├── bootstrap.min.css
│   ├── clean-blog.css
│   └── clean-blog.min.css
└── tags
    └── example
        └── index.html

15 directories, 28 files

ใช้ middleman build --verbose เพื่อ output message กรณีมี errors

ทดสอบเข้าโฟลเดอร์ build แล้วลองเปิดไฟล์ index.html หรือจะจำลองด้วย Web Server อื่นๆ เช่น

python3 -m http.server PORT_NUMBER

สังเกตเห็นว่า ตอนนี้บล็อคของเรา สามารถที่จะรันบนเว็บเซิฟเวอร์ได้แล้ว แน่นอน มันเป็นแค่ Static จะก็อปปี้ไปวางไว้ที่ไหนก็ได้ Hosting น่าจะรองรับแทบละ 100%

Deployment

หลังจากที่เราได้โฟลเดอร์ build มาแล้ว การจะก็อปไปวางบน Hosting ด้วย FTP หรืออะไรก็แล้วแต่ ทุกๆครั้ง มันก็ค่อนข้างจะยุ่งยากซักหน่อย เราจะหลีกเลี่ยงการทำอะไรซ้ำๆ ซึ่งไม่เกิดประโยชน์อะไรเลย โชคดีที่ Middleman มี gem ที่ชื่อว่า middleman-deploy มาให้ แค่ตั้งค่าไม่เยอะมาก ทุกๆครั้งที่เราทำการ build หรือ สั่ง deploy มันก็จะทำการ deploy ไปที่ server ให้เราเอง ประหยัดเวลาได้เยอะเลย

ทำการเพิ่ม Gem Middleman ที่ไฟล์ Gemfile

gem 'middleman-deploy', '~> 1.0'

จากนั้นสั่ง

bundle install

ต่อมาเปิดไฟล์ config.rb ขึ้นมา แล้วเพิ่มส่วนนี้ลงไป

activate :deploy do |deploy|
  deploy.build_before = true
  deploy.method   = :ftp
  deploy.host     = 'ftp.yoursite.com'
  deploy.path     = '/var/www/yoursite'
  deploy.user     = 'youruser'
  deploy.password = 'yourpassword'
end

ที่นี้เวลาเราจะ Deploy ขึ้น Hosting จริงๆ ก็แค่พิมพ์

middleman deploy

Middleman ก็จะทำการ generate โฟลเดอร์ build จากนั้นก็จะทำการ ก็อปโฟลเดอร์ build ขึ้น ftp ตามที่เราได้ config ค่าไว้ด้านบน นั่นเอง

หรือหากใครใช้ Github Pages เป็น Hosting ก็แค่เพิ่มส่วนนี้ลงไปแทน FTP

activate :deploy do |deploy|
  deploy.method   = :git
  deploy.build_before = true
  deploy.branch   = 'master'
end

Note: deploy.branch ถ้าเป็น Github Pages แบบ User/Organization ตัว branch จะเป็น master หากเป็น Projects ตัว branch จะเป็น gh-pages ศึกษาเพิ่มเติมได้ที่ Github Pages

ซึ่งตอนนี้เราก็ Deployment แบบ Auto ด้วย Command Line กันไปแล้ว แต่เดี๋ยวก่อน!!

มันยังมีง่ายกว่านั้นอีก คือ Continuous Deployment คืออะไร? ลองไปศึกษาเพิ่มเติมกันดูครับ หลักๆก็คือ มันช่วยรันเทส deployment อัตโนมัติให้เราได้ อย่างที่ DevAhoy ใช้คือ Codeship.io ซึ่งมันช่วยให้เราสามารถที่จะเขียน script สั่งทำอะไรก็ได้ ทุกๆครั้งที่เราทำการ commit push ไป อย่างเช่นบล็อคนี้ ผมจะตั้งไว้ ให้ทุกๆครั้งที่ผมใช้ git push จะให้มันทำการรันสคริป ของการ deployment เบื้องต้นประมาณนี้

rm -rf build
git remote set-branches --add origin gh-pages
git fetch
middleman deploy

แค่นี้ทุกๆครั้งที่ git push ก็ไม่ต้องทำอะไรเพิ่มเลย ตัว Codeship ก็จะทำงานต่อจากนี้ให้เราเองทั้งหมด ง่ายมั้ย? หากอย่างรู้อะไรเพิ่มเติมลองเข้าไปเล่น Codeship กันดูนะครับ

Note: เผื่อบางคนใช้ Codeship หาก git push ไหนที่เราไม่ต้องการให้มันรัน ก็สามารถใช้ commit message : --skip-ci หรือ [skip-ci] ได้ครับ

สรุป

หลังจากที่ผ่านมา 4 Parts อาจจะไม่ละเอียดเท่าไหร่ แต่คิดว่าอย่างน้อยก็เป็นบทความที่ให้ผู้ที่เข้ามาอ่าน ได้ลองนำไปใช้งานและไปต่อยอดเขียนบล็อคเป็นของตัวเองนะครับ สุดท้าย Source Code ทั้งหมดอยู่บน Github ครับ

Source Code

Chai Chai Phonbopit : Software Engineer @Nextzy • ผู้ชายธรรมดาๆ ที่ชื่นชอบ Android, JavaScript (Node.js) และ Open Source มีงานอดิเรกเป็น Acoustic Guitar และ Football

บทความล่าสุด