Capistrano เป็นเครื่องมือ open-source สำหรับการรันสคริปต์บนเซิร์ฟเวอร์ระยะไกลโดยทั่วไปจะใช้สำหรับการ deploy แอปผ่านการเชื่อมต่อ SSH Capistrano เขียนด้วย Ruby เป็นส่วนประกอบของ Ruby on Rails framework ดังนั้นจึงใช้กันอย่างแพร่หลายสำหรับการ deploy แอป Ruby อย่างไรก็ตาม มันสามารถทำงานร่วมกับภาษาโปรแกรมอื่นๆได้อย่างง่ายดายเช่น php
ในบทความนี้มาดูวิธีการ deploy แอปพลิเคชัน php จากระยะไกลผ่านเครื่องมือ Capistrano ในขั้นตอนแรกคุณจะต้อง:
- สร้าง PHP environment ด้วย Apache แอปพลิเคชันเซิร์ฟเวอร์
- การสร้าง SSH public key และเพิ่มไปยัง Ruk-Com Cloud แดชบอร์ด
- GIT repository เพื่อเก็บแอปพลิเคชัน php ที่คุณต้องการ deploy (สำหรับตอนนี้เครื่องมือ Capistrano 3 รองรับประเภท GIT VCS เท่านั้น)
- คัดลอกโปรเจกต์นี้ไว้ที่เครื่องของคุณ
หมายเหตุ: คำสั่งด้านล่างควรดำเนินการกับเครื่องของคุณเช่นเดียวกับที่คุณใช้ในระหว่างการสร้างคู่คีย์ SSH เพื่อหลีกเลี่ยงข้อผิดพลาดในการอนุญาต/การเชื่อมต่อ
การติดตั้ง Capistrano
1. การใช้ Capistrano คุณต้องติดตั้ง Ruby ที่เครื่องคอมพิวเตอร์ของคุณโดยรันคำสั่งนี้:
apt-get install ruby rubygems
2. จากนั้นติดตั้งเครื่องมือ Capistrano โดยป้อนคำสั่งต่อไปนี้:
gem install capistrano
3. ตรวจสอบให้แน่ใจว่าคุณมีโฟลเดอร์ config ในไดเร็กทอรีที่เครื่องของคุณพร้อมกับโปรเจ็กต์ (เนื่องจากเป็นโฟลเดอร์เริ่มต้นที่มีการกำหนดค่าสำหรับ Ruby on Rails) หากคุณไม่มี ให้สร้างโฟลเดอร์นี้:
mkdir {path_to_your_project}/config
Capify แอปพลิเคชันของคุณ
หลังการติดตั้ง คุณต้อง capify แอปพลิเคชันของคุณ เช่นกำหนดค่า Capistrano สำหรับการ deploy แอปโดยไปที่โฟลเดอร์ root ของโปรเจกต์ php และดำเนินการคำสั่งนี้:
cap install
สิ่งนี้จะสร้างไฟล์และไดเร็กทอรีใหม่ในโครงการของคุณ:
- Capfile คือไฟล์ Capistrano หลักที่ดูแลการกำหนดค่าและ globs ที่จำเป็นสำหรับงานที่กำหนดเอง
- config/deploy/ โฟลเดอร์ที่มีสองไฟล์ (staging.rb และ production.rb) สำหรับการตั้งค่าการ deploy เฉพาะของ environment
- config/deploy.rb Ruby script ที่มีการกำหนดค่าแอปพลิเคชันและคำแนะนำ Capistrano
- lib/capistrano/tasks/ โฟลเดอร์สำหรับงานที่คุณกำหนดเอง
เคล็ดลับ: คุณสามารถลองใช้ capistrano-jelastic gem ที่ดูแลโดย gerado-navarro เพื่อ deploy แอป Relis ให้เป็น PaaS & IaaS โดยอัตโนมัติ
ตั้งค่าการกำหนดค่าเอง
1. ไปที่ไฟล์ config/deploy.rb และกำหนดค่าให้สอดคล้องกับการตั้งค่าของคุณ ในขั้นต้นจะดูเหมือนรูปแบบนี้:
# config valid only for Capistrano 3.1
lock '3.2.1'
set :application, 'my_app_name'
set :repo_url, '[email protected]:me/my_repo.git'
# Default branch is :master
# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
# Default deploy_to directory is /var/www/my_app
# set :deploy_to, '/var/www/my_app'
# Default value for :scm is :git
# set :scm, :git
# Default value for :format is :pretty
# set :format, :pretty
# Default value for :log_level is :debug
# set :log_level, :debug
# Default value for :pty is false
# set :pty, true
# Default value for :linked_files is []
# set :linked_files, %w{config/database.yml}
# Default value for linked_dirs is []
# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }
# Default value for keep_releases is 5
# set :keep_releases, 5
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
# Your restart mechanism here, for example:
# execute :touch, release_path.join('tmp/restart.txt')
end
end
after :publishing, :restart
after :restart, :clear_cache do
on roles(:web), in: :groups, limit: 3, wait: 10 do
# Here we can do anything such as:
# within release_path do
# execute :rake, 'cache:clear'
# end
end
end
end
แก้ไขสตริงต่อไปนี้:
- ใส่ชื่อแอปพลิเคชันของคุณ
set :application, "my_app_name"
- ระบุ URL ไปยัง VSC repository ด้วยโค้ดแอปพลิเคชัน PHP
set :repo_url, "[email protected]:me/my_repo.git"
หมายเหตุ: คุณต้องแนบ SSH public key กับบัญชี GIT ของคุณ (อันเดียวกับที่คุณเพิ่มลงในแดชบอร์ด) มิฉะนั้นคุณจะได้รับ “การอนุญาตถูกปฏิเสธ”; เกิดข้อผิดพลาดขณะพยายาม deploy แอปพลิเคชันของคุณ
คุณสามารถใช้ลิงก์ https: ประเภทต่อไปนี้:
set :repo_url, “https://example.net/GIT_user_name/repo_name.git”
ในกรณีนี้ไม่จำเป็นต้องมีการตรวจสอบสิทธิ์และคุณสามารถระบุ URL ไปยัง PHP open-source repository ที่คุณต้องการ deploy
- ยกเลิกคอมเมนต์บรรทัดต่อไปนี้และระบุไดเร็กทอรีที่แอปพลิเคชันที่คุณจะ deploy (โดยค่านี้เป็นค่าเริ่มต้นสำหรับ PHP app servers):
# set :deploy_to, '/var/www/webroot'
- ยกเลิกคอมเมนต์บรรทัดต่อไปนี้
set :scm, :git
set :format, :pretty
set :pty, true
- ลบสตริงที่มีโค้ดต่อท้ายไฟล์ (เริ่มต้นจากคำสั่ง namespace :deploy do) และวางบรรทัดต่อไปนี้แทน:
namespace :deploy do
desc 'Restart Apache'
task :apache do
on roles(:app) do
execute :sudo, "service httpd restart"
end
end
desc 'Creating symlink'
task :symlink do
on roles(:app) do
execute :rm, "-rf /var/www/webroot/ROOT"
execute :ln, "-s /var/www/webroot/current /var/www/webroot/ROOT"
end
end
desc 'Restart Apache and create symlink'
task :restart
before :restart, :symlink
before :restart, :apache
end
after 'deploy:publishing', 'deploy:restart'
คุณสามารถกำหนดค่าเพิ่มเติมได้ในไฟล์นี้ (เช่น ระบุสาขาของ repository หรือลิงก์ไฟล์/โฟลเดอร์เพิ่มเติม)
กดปุ่ม Save เพื่อบันทึกการเปลี่ยนแปลง
2. จากนั้นไปที่ไฟล์ config/deploy/staging.rb เนื้อหาเริ่มต้นคือ:
# Simple Role Syntax
# ==================
# Supports bulk-adding hosts to roles, the primary server in each group
# is considered to be the first unless any hosts have the primary
# property set. Don't declare `role :all`, it's a meta role.
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db, %w{[email protected]}
# Extended Server Syntax
# ======================
# This can be used to drop a more detailed server definition into the
# server list. The second argument is a, or duck-types, Hash and is
# used to set extended properties on the server.
server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
# Custom SSH Options
# ==================
# You may pass any option but keep in mind that net/ssh understands a
# limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
#
# Global options
# --------------
# set :ssh_options, {
# keys: %w(/home/rlisowski/.ssh/id_rsa),
# forward_agent: false,
# auth_methods: %w(password)
# }
#
# And/or per server (overrides global)
# ------------------------------------
# server 'example.com',
# user: 'user_name',
# roles: %w{web app},
# ssh_options: {
# user: 'user_name', # overrides user setting above
# keys: %w(/home/user_name/.ssh/id_rsa),
# forward_agent: false,
# auth_methods: %w(publickey password)
# # password: 'please use keys'
# }
ขั้นตอนแรกให้คุณแก้ไข Role 3 ส่วน: Simple Role Syntax โดยวาง {[email protected]} แทน {[email protected]} ใช้ค่าต่อไปนี้:
- nodeid – ค่าโหนดไอดีของคอนเทนเนอร์ Apache แอปพลิเคชันเซิร์ฟเวอร์ใน environment ของคุณ
- uid – ตัวเลขก่อนสัญลักษณ์ @ ในการเชื่อมต่อ SSH หลังจากนั้นแก้ไขบรรทัดการตั้งค่าเซิร์ฟเวอร์ (ในส่วนของ Extended Server Syntax):
- ระบุโฮสต์ SSH ของคุณ เช่นเซิร์ฟเวอร์ ‘gate.manage.ruk-com.cloud ‘
- ใส่ค่า {nodeid}_{uid} สำหรับพารามิเตอร์ user เช่น user: ‘190403-136’ ดังนั้นการตั้งค่าเซิร์ฟเวอร์ของคุณจะมีลักษณะดังนี้
server 'gate.manage.ruk-com.cloud', user: '190403-136', roles: %w{web app}, my_property: :my_value
ขั้นตอนสุดท้ายระบุพอร์ตเซิร์ฟเวอร์ที่จะใช้สำหรับการเชื่อมต่อ SSH:
set :ssh_options, {
port: 3022
}
อย่าลืมกดปุ่ม Save เพื่อบันทึกการกำหนดค่าด้วยตนเอง
3. เปิด Capfile (อยู่ในโฟลเดอร์ root ในโปรเจกต์เครื่องของคุณ) และเพิ่มหนึ่งบรรทัดนี้เข้าไป:
Rake::Task[:staging].invoke
กำหนดค่า SSH Agent
1. ตรวจสอบให้แน่ใจว่าคุณมี ssh-agent ที่ทำงานอยู่ในระบบของคุณ
2. เพิ่ม private SSH key ของคุณไปยัง agent ซึ่งควรสอดคล้องกับ public SSH key ที่คุณเพิ่มไปในแดชบอร์ด
ssh-add {full_path_to_the_necessary_private_SSH_key}
3. คุณสามารถตรวจสอบว่าเพิ่มคีย์ได้ถูกต้องหรือไม่โดยป้อนคำสั่ง ssh-add -lcommand
ตรวจสอบการกำหนดค่า
คุณสามารถตรวจสอบให้แน่ใจว่าทุกอย่างได้รับการกำหนดค่าอย่างถูกต้องโดยไปที่โฟลเดอร์ root ที่เครื่องของคุณแล้วพิมพ์คำสั่งด้านล่าง:
cap staging deploy:check
Capistrano จะเชื่อมต่อกับคอนเทนเนอร์ระยะไกล สร้างโฟลเดอร์ที่จำเป็นในไดเร็กทอรีที่ deploy (ระบุไว้ในพารามิเตอร์ set :deploy_to) และตรวจสอบเซิร์ฟเวอร์ทั้งระยะไกลและภายในเครื่องเพื่อดูว่ามีไฟล์ที่จำเป็นทั้งหมด เช่น สิทธิ์ที่จำเป็น เครื่องมือ ฯลฯ อยู่หรือไม่
หากมีสิ่งใดผิดพลาดไป คุณจะได้รับข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง
Deploy Application
ดำเนินการ deploy แอปพลิเคชันของคุณโดยรันคำสั่งด้านล่างในโฟลเดอร์ root ของโปรเจ็กต์:
cap staging deploy
เมื่อการดำเนินการนี้เสร็จสมบูรณ์ ให้ไปที่ URL ของ environment และตรวจดูให้แน่ใจว่าได้ deploy แอปของคุณเรียบร้อยแล้ว