โครงการร่ม : มูลนิธิเชฟ
สถานะโครงการ : ใช้งาน
ปัญหาเวลาตอบสนองสูงสุด : 14 วัน
การตอบสนองการร้องขอเวลาตอบสนองสูงสุด : 14 วัน
สร้างตัวติดตั้งแบบเต็มสแต็กได้อย่างง่ายดายสำหรับโครงการของคุณในแพลตฟอร์มที่หลากหลาย
Seth Chisamore และ Christopher Maier จาก Chef ให้การพูดคุยเบื้องต้นเกี่ยวกับ Omnibus ที่ Chefconf 2013 ชื่อ Eat the Whole Bowl: การสร้างติดตั้งแบบเต็มสแต็คกับ Omnibus :
โครงการนี้ได้รับการจัดการโดยทีมงานด้านวิศวกรรมของเชฟ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการมีส่วนร่วมของทีมงานวิศวกรรมการเปิดตัวและกระบวนการเปิดตัวโปรดปรึกษาคู่มือการจัดการวิศวกรรมการปล่อย OSS ของเชฟ
Omnibus ได้รับการออกแบบให้ทำงานด้วยชุดของข้อกำหนดเบื้องต้นขั้นต่ำ คุณจะต้องมีสิ่งต่อไปนี้:
Omnibus ให้ทั้ง DSL สำหรับการกำหนดโครงการ Omnibus สำหรับซอฟต์แวร์ของคุณรวมถึงเครื่องมือบรรทัดคำสั่งสำหรับการสร้างสิ่งประดิษฐ์ติดตั้งจากคำจำกัดความนั้น
ในการเริ่มต้นให้ติดตั้ง Omnibus ในพื้นที่บนเวิร์กสเตชันของคุณ
$ gem install omnibus
ตอนนี้คุณสามารถสร้างโครงการ Omnibus ในไดเรกทอรีปัจจุบันของคุณโดยใช้คุณสมบัติ Project Generator
$ omnibus new $MY_PROJECT_NAME
สิ่งนี้จะสร้างโครงกระดูกโครงการที่สมบูรณ์ในไดเรกทอรี omnibus-$MY_PROJECT_NAME
โดยค่าเริ่มต้นสิ่งนี้จะทำให้ไดเรกทอรีที่เรียกว่า omnibus-$MY_PROJECT_NAME
สมมติว่าคุณกำลังเก็บค่า Omnibus ของคุณแยกจาก repo อย่างไรก็ตามการเก็บไว้ ใน repo ของคุณเป็นเรื่องธรรมดาดังนั้นรู้สึกว่าจะเปลี่ยนชื่อไดเรกทอรีนี้เป็น omnibus
และวางไว้ในระดับสูงสุดของโครงการ repo ที่มาของโครงการของคุณ
$ cd omnibus- $MY_PROJECT_NAME
$ bundle install --binstubs
รายละเอียดเพิ่มเติมสามารถพบได้ในไฟล์ readme ของโครงการที่สร้างขึ้น
Omnibus กำหนดแพลตฟอร์มที่จะสร้างตัวติดตั้งตาม แพลตฟอร์มที่กำลังทำงานอยู่ นั่นคือคุณสามารถสร้างไฟล์ .deb
ในระบบที่ใช้ Debian เท่านั้น เพื่อบรรเทาข้อแม้นี้โครงการที่สร้างขึ้นรวมถึงการตั้งค่าห้องครัวทดสอบที่เหมาะสมสำหรับการสร้างชุดของโครงการรถโดยสาร
แม้ว่าโครงการเทมเพลตจะสร้าง แต่จะไม่ทำอะไรที่น่าตื่นเต้น สำหรับสิ่งนั้นคุณต้องใช้ Omnibus DSL เพื่อกำหนดข้อมูลเฉพาะของแอปพลิเคชันของคุณ
หากมีอยู่ Omnibus จะใช้ไฟล์การกำหนดค่าระดับบนสุดชื่อ omnibus.rb
ที่รูทของที่เก็บของคุณ ไฟล์นี้ถูกโหลดเมื่อรันไทม์และรวมถึงจำนวนของการกำหนดค่า tunables นี่คือตัวอย่าง:
# Build locally (instead of /var)
# -------------------------------
base_dir './local'
# Disable git caching
# ------------------------------
use_git_caching false
# Enable S3 asset caching
# ------------------------------
use_s3_caching true
s3_bucket ENV [ 'S3_BUCKET' ]
# There are three ways to authenticate to the S3 bucket
# 1. set `s3_access_key` and `s3_secret_key`
s3_access_key ENV [ 'S3_ACCESS_KEY' ]
s3_secret_key ENV [ 'S3_SECRET_KEY' ]
# 2. set `s3_profile` to use an AWS profile in the Shared Credentials files
#s3_profile ENV['S3_PROFILE']
# 3. set `s3_iam_role_arn` to use an AWS IAM role
#s3_iam_role_arn ENV['S3_IAM_ROLE_ARN']
สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร Config
คุณสามารถบอกให้ Omnibus โหลดไฟล์การกำหนดค่าอื่นได้โดยผ่านตัวเลือก --config
ไปยังคำสั่งใด ๆ :
$ bin/omnibus --config /path/to/config.rb
ในที่สุดคุณสามารถแทนที่ตัวเลือกการกำหนดค่าเฉพาะที่บรรทัดคำสั่งโดยใช้ --override
Flag สิ่งนี้จะมีความสำคัญสูงสุดเหนือค่าไฟล์การกำหนดค่าใด ๆ :
$ bin/omnibus --override use_git_caching:false
ไฟล์ Project DSL กำหนดแอปพลิเคชันจริงของคุณ นี่คือสิ่งที่คุณกำลังสร้างตัวติดตั้งแบบเต็มสแต็กสำหรับตอนแรก มันมีวิธีการในการกำหนดการพึ่งพาของโครงการ (อีกครั้งตามที่ระบุไว้ในไฟล์นิยามซอฟต์แวร์ DSL) รวมถึงวิธีการตั้งค่าข้อมูลเมตาแพ็คเกจติดตั้ง
คำจำกัดความของโครงการทั้งหมดจะต้องอยู่ในไดเรกทอรี config/projects
ของที่เก็บ Omnibus ของคุณ
name "chef-full"
maintainer "YOUR NAME"
homepage "http://yoursite.com"
install_dir "/opt/chef"
build_version "0.10.8"
build_iteration 4
dependency "chef"
วิธี DSL บางอย่างรวมถึง:
วิธี DSL | คำอธิบาย |
---|---|
name | ชื่อของโครงการ |
install_dir | ตำแหน่งการติดตั้งที่ต้องการของแพ็คเกจ |
build_version | เวอร์ชันแพ็คเกจ |
build_iteration | หมายเลขการวนซ้ำของแพ็คเกจ |
dependency | ส่วนประกอบที่กำหนดซอฟต์แวร์ Omnibus เพื่อรวมไว้ในแพ็คเกจนี้ |
package | เรียกใช้ DSL เฉพาะ packager |
compress | เรียกใช้ DSL เฉพาะคอมเพรสเซอร์ |
โดยค่าเริ่มต้นการประทับเวลาจะถูกผนวกเข้ากับ build_version คุณสามารถปิดพฤติกรรมนี้ได้โดยการตั้งค่า append_timestamp
เป็น false
ใน omnibus.rb
ของคุณหรือใช้ --override append_timestamp:false
ที่บรรทัดคำสั่ง
สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารประกอบ Project
ไฟล์ "ซอฟต์แวร์" Omnibus กำหนดส่วนประกอบซอฟต์แวร์แต่ละตัวที่ทำแพ็คเกจโดยรวมของคุณ พวกเขาเป็นหน่วยการสร้างแอปพลิเคชันของคุณ ซอฟต์แวร์ DSL ให้วิธีการกำหนดตำแหน่งที่จะดึงแหล่งซอฟต์แวร์วิธีการสร้างและสิ่งที่พวกเขามี การพึ่งพาเหล่านี้ยังถูกกำหนดไว้ในไฟล์ซอฟต์แวร์ DSL ของตนเองซึ่งเป็นพื้นฐานสำหรับการสั่งซื้อการสร้างแบบพึ่งพา
คำจำกัดความของซอฟต์แวร์ทั้งหมดควรไปในไดเรกทอรี config/software
ของที่เก็บโครงการ Omnibus Project ของคุณ
นี่คือตัวอย่าง:
name "ruby"
default_version "1.9.2-p290"
source url : "http://ftp.ruby-lang.org/pub/ruby/1.9/ruby- #{ version } .tar.gz" ,
md5 : "604da71839a6ae02b5b5b5e1b792d5eb"
dependency "zlib"
dependency "ncurses"
dependency "openssl"
relative_path "ruby- #{ version } "
build do
command "./configure"
command "make"
command "make install"
end
วิธี DSL บางอย่างที่มีอยู่รวมถึง:
วิธี DSL | คำอธิบาย |
---|---|
name | ชื่อของส่วนประกอบซอฟต์แวร์ (ควรมาก่อน) |
default_version | เวอร์ชันของส่วนประกอบซอฟต์แวร์ |
source | เส้นทางไปยังที่ตั้งของแหล่งที่มา |
dependency | ส่วนประกอบที่กำหนดโดยซอฟต์แวร์ Omnibus ที่ซอฟต์แวร์นี้ขึ้นอยู่กับ |
relative_path | เส้นทางสัมพัทธ์ของ tarball ที่สกัด |
build | คำแนะนำในการสร้าง |
สำหรับวิธีการ DSL เพิ่มเติมโปรดปรึกษาเอกสาร Software
นอกจากนี้ยังมีวิธีการ DSL จำนวนหนึ่งที่มีอยู่ภายใน build
Block:
วิธี DSL | คำอธิบาย |
---|---|
command | ดำเนินการคำสั่งเชลล์เดียว |
make | เรียกใช้ทำ (มีหรือไม่มี args) โดยใช้ gmake ตามความเหมาะสม |
patch | ใช้แพตช์จากดิสก์ |
workers | จำนวนผู้สร้างสูงสุด |
windows_safe_path | จัดรูปแบบเส้นทางให้ปลอดภัยสำหรับการปอกเปลือกบน Windows |
go | เรียกใช้รหัสเป็น GO แบบฝังตัว |
ruby | เรียกใช้รหัสเป็นทับทิมในตัว |
gem | เรียกใช้รหัสเป็น rubygems แบบฝังตัว |
bundle | ดำเนินการรหัสเป็น Bundler แบบฝังตัว |
rake | เรียกใช้รหัสเป็นอัญมณี rake ที่ฝังตัว |
block | ดำเนินการบล็อกทับทิมในเวลาสร้าง |
erb | แสดงเทมเพลต ERB ที่กำหนด |
mkdir | สร้างไดเรกทอรีที่กำหนด |
touch | สร้างไฟล์ว่างเปล่าที่กำหนด |
delete | ลบไฟล์หรือไดเร็กทอรีที่กำหนด |
strip | สัญลักษณ์แถบจากไบนารีในไฟล์หรือไดเรกทอรีที่กำหนด |
copy | คัดลอก A ถึง B |
move | ย้าย A ไป B |
link | เชื่อมโยง A ถึง B |
sync | คัดลอกไฟล์ทั้งหมดจาก A ถึง B ลบไฟล์ยูเนี่ยนใด ๆ |
สำหรับวิธีการ DSL เพิ่มเติมโปรดปรึกษาเอกสาร Builder
คุณสามารถรองรับการสร้างซอฟต์แวร์เดียวกันหลายรุ่นในไฟล์นิยามซอฟต์แวร์เดียวกันโดยใช้วิธี version
และให้บล็อก:
name "ruby"
default_version "1.9.2-p290"
version "1.9.2-p290" do
source url : "http://ftp.ruby-lang.org/pub/ruby/1.9/ruby- #{ version } .tar.gz" ,
md5 : "604da71839a6ae02b5b5b5e1b792d5eb"
end
version "2.1.1" do
source url : "http://ftp.ruby-lang.org/pub/ruby/2.1/ruby- #{ version } .tar.gz" ,
md5 : "e57fdbb8ed56e70c43f39c79da1654b2"
end
เนื่องจากคำจำกัดความของซอฟต์แวร์เป็นเพียงรหัสทับทิมคุณสามารถดำเนินการอะไรก็ได้โดยการห่อด้วยทับทิมบริสุทธิ์ที่ทดสอบหมายเลขเวอร์ชัน
วิธีที่ง่ายที่สุดในการแบ่งปันซอฟต์แวร์ทั่วทั้งองค์กรคือผ่าน Bundler และ Rubygems ตัวอย่างที่เก็บซอฟต์แวร์ให้ดูที่ซอฟต์แวร์ Omnibus-Software ของ Chef สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร Rubygems
ขอแนะนำให้คุณใช้ Bundler เพื่อดึงอัญมณีเหล่านี้ลง (เนื่องจาก Bundler อนุญาตให้ดึงซอฟต์แวร์จาก GitHub ได้โดยตรง):
gem 'my-company-omnibus-software'
gem 'omnibus-software' , github : 'my-company/omnibus-software'
จากนั้นเพิ่มชื่อซอฟต์แวร์ลงในรายการ software_gems
ใน Omnibus Config ของคุณ:
software_gems %w( my-company-omnibus-software omnibus-software )
นอกจากนี้คุณยังสามารถระบุเส้นทางท้องถิ่นบนดิสก์ (แต่ได้รับการเตือนว่าสิ่งนี้อาจทำให้การแบ่งปันโครงการระหว่างทีมยาก):
local_software_dirs %w( /path/to/software /other/path/to/software )
สำหรับเส้นทางทั้งหมดเหล่านี้ มีความสำคัญในการสั่งซื้อ ดังนั้นจึงเป็นไปได้ที่จะขึ้นอยู่กับเวอร์ชันซอฟต์แวร์ในท้องถิ่นในขณะที่ยังคงรักษาซอฟต์แวร์ Repo ระยะไกล จากตัวอย่างข้างต้น Omnibus จะค้นหาคำจำกัดความของซอฟต์แวร์ชื่อ foo
ในลำดับนี้:
$PWD/config/software/foo.rb
/path/to/software/config/software/foo.rb
/other/path/to/software/config/software/foo.rb
/Users/sethvargo/.gems/.../my-company-omnibus-software/config/software/foo.rb
/Users/sethvargo/.gems/.../omnibus-software/config/software/foo.rb
อินสแตนซ์แรกของ foo.rb
ที่พบจะถูกใช้ โปรดทราบว่าคำจำกัดความของ Softare ในท้องถิ่น (Vendored) มีความสำคัญกว่า!
เมื่อคุณสร้างแพ็คเกจและคำจำกัดความซอฟต์แวร์แล้วคุณสามารถสร้างด้วย:
./bin/omnibus build $MY_PACKAGE_NAME
อย่างไรก็ตามมีข้อแม้หลายประการที่ต้องระวัง:
base_dir
ใน omnibus.rb
หรืออย่างน้อยที่สุดก็เปลี่ยน cache_dir
และ build_dir
เป็นอย่างอื่นมันจะพยายามใช้ /var/cache/omnibus
และ /opt/$MY_PROJECT_NAME
ต้องใช้รูทconfig/projects/$MY_PROJECT_NAME.rb
คุณสามารถอ้างอิงไฟล์ .rb
ซอฟต์แวร์ที่มีอยู่ในโฟลเดอร์ config/software
install_dir
ที่ระบุในไฟล์โครงการมักจะต้องใช้สิทธิ์ root
ในเวลาที่สร้าง เปลี่ยนตำแหน่งอื่นเช่น "/tmp/#{name}"
เพื่อหลีกเลี่ยงการทำงานเป็น root
omnibus-software
ดังนั้นคุณต้องการใช้สิ่งที่คุณจะต้องทำในการทำเครื่องหมายใน Gemfile
หรือส้อมจากนั้นอ้างอิงของคุณเอง/opt/$project/bin
คุณจะต้องใช้ AppBundler หรือคุณจะต้องมีขั้นตอนการติดตั้งโพสต์เพื่อสร้าง binstubs เหล่านั้นruby
เวอร์ชันคุณจะต้องแทนที่ rubygems
และ bundler
เพื่อให้ตรงกับเวอร์ชันใน ruby
เวอร์ชันนั้นไม่เช่นนั้นคุณจะได้รับความล้มเหลวในเวอร์ชัน Bundler ที่ไม่ตรงกัน แน่นอนคำสั่ง build ข้างต้นจะสร้างบนโฮสต์ในพื้นที่ของคุณดังนั้นจึงเป็นเฉพาะสำหรับระบบปฏิบัติการและระบบฐานที่คุณอยู่ แต่การตั้งค่า Skeleten โดย omnibus new
Setup Kitchen อยู่แล้วสำหรับคุณเพื่อให้ง่ายต่อการสร้างสำหรับ OSE ที่หลากหลายดู README.md
ในรายละเอียดของ Omnibus ที่สร้างขึ้นเพื่อดูรายละเอียด
คำจำกัดความซอฟต์แวร์ที่ใช้ GIT อาจระบุสาขาเป็น default_version ในกรณีนี้การแก้ไข GIT ที่แน่นอนที่จะใช้จะถูกกำหนดในเวลาที่สร้างเว้นแต่จะมีการแทนที่โครงการ (ดูด้านล่าง) หรือมีการใช้รายการรุ่นภายนอก ในการสร้างเวอร์ชันรายการให้ใช้คำสั่ง omnibus manifest
:
omnibus manifest PROJECT -l warn
สิ่งนี้จะส่งออกรายการที่มีรูปแบบ JSON ที่มีเวอร์ชันที่ได้รับการแก้ไขของคำจำกัดความซอฟต์แวร์ทุกครั้ง
บางครั้งแพลตฟอร์มมีห้องสมุดที่จำเป็นต้องได้รับการอนุญาตเพื่อให้ HealthCheck สามารถผ่านได้ Whitelist ที่พบในรหัส HealthCheck ประกอบด้วยขั้นต่ำที่จำเป็นสำหรับการสร้างที่ประสบความสำเร็จบนแพลตฟอร์มที่รองรับ
ในการเพิ่มไลบรารี Whitelisted ของคุณเองเพียงเพิ่ม regex ลงในนิยามซอฟต์แวร์ของคุณในโครงการ Omnibus ของคุณดังนี้:
whitelist_file /libpcrecpp.so..+/
โดยทั่วไปแล้วเป็นความคิดที่ดีที่จะเพิ่มเงื่อนไขให้กับผู้อนุญาตให้ใช้งานโดยใช้แพลตฟอร์มเฉพาะที่ต้องใช้
คำเตือน: คุณควรเพิ่มไลบรารีลงในผู้อนุญาตที่รับประกันว่าจะอยู่ในระบบที่คุณติดตั้งไว้ หากไลบรารีมาจากแพ็คเกจที่ไม่ได้รับการป้องกันคุณควรสร้างมันลงในแพ็คเกจแทน
สถานะ: ทดลอง
omnibus changelog generate
จะสร้างการเปลี่ยนแปลงสำหรับโครงการ Omnibus คำสั่งนี้จะถือว่า:
สมมติฐานเหล่านี้ จะ เปลี่ยนไปเมื่อเราพิจารณาว่าอะไรดีที่สุดสำหรับโครงการของเรา
คำจำกัดความของโครงการสามารถแทนที่ซอฟต์แวร์ที่เฉพาะเจาะจงโดยผ่าน override
เพื่อใช้เวอร์ชันที่ถูกต้อง:
name "chef-full"
# <snip>
# This will override the default version of "chef"
override :chef , version : "2.1.1"
dependency "chef"
ต้องกำหนดเวอร์ชันที่ถูกแทนที่ในซอฟต์แวร์ที่เกี่ยวข้อง!
โดยค่าเริ่มต้น Omnibus จะเข้าสู่ระบบที่ระดับ warn
คุณสามารถแทนที่สิ่งนี้ได้โดยส่งธง --log-level
ไปยัง Omnibus Call ของคุณ:
$ bin/omnibus build < project > --log-level info # or "debug"
โดยค่าเริ่มต้น Omnibus Caches Compiled Compiled Software Jerfitions ดังนั้นการสร้างโครงการ N+1 Omnibus นั้นเร็วกว่ามาก ฟังก์ชั่นนี้สามารถปิดใช้งานได้โดยการเพิ่มสิ่งต่อไปนี้ใน omnibus.rb
ของคุณ:
use_git_caching false
สำหรับข้อมูลเกี่ยวกับการมีส่วนร่วมในโครงการนี้โปรดดูที่ https://github.com/chef/chef/blob/master/contributing.md
Copyright 2012-2016 Chef Software, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.