傘項目:廚師基金會
項目狀態:活躍
發出響應時間最多:14天
拉要求響應時間最多:14天
輕鬆地在各種平台上為您的項目創建全棧安裝程序。
Chef的Seth Chisamore和Christopher Maier在2013年Chefconf上對Omnibus進行了介紹性演講,標題為“ Eat the The Bowl:與Omnibus一起建造全棧安裝程序:
該項目由廚師發布工程團隊管理。有關發布工程團隊的貢獻,分類和發行過程的更多信息,請諮詢《廚師發布工程OSS管理指南》。
Omnibus旨在以最少的先決條件運行。您將需要以下內容:
Omnibus既提供了用於定義軟件綜合項目的DSL,也提供了用於從該定義生成安裝程序工件的命令行工具。
首先,請在您的工作站上本地安裝綜合。
$ gem install omnibus
現在,您可以使用項目生成器功能在當前目錄中創建一個綜合項目。
$ omnibus new $MY_PROJECT_NAME
這將在目錄omnibus-$MY_PROJECT_NAME
中生成完整的項目骨架
默認情況下,這將使一個名為omnibus-$MY_PROJECT_NAME
的目錄假設您要保持綜合配置與存儲庫分開。但是,將其保存在您的存儲庫中是一種常見的做法,因此請覺得將此目錄重命名為omnibus
並將其放置在您的項目源回購的最高水平。
$ cd omnibus- $MY_PROJECT_NAME
$ bundle install --binstubs
有關更多詳細信息,請參見生成的項目的README文件。
Omnibus確定基於當前正在運行的平台構建安裝程序的平台。也就是說,您只能在基於Debian的系統上生成.deb
文件。為了減輕這一警告,生成的項目包括一個適合生成一系列綜合項目的測試廚房設置。
儘管模板項目將構建,但它不會做任何令人興奮的事情。為此,您需要使用綜合DSL來定義應用程序的細節。
如果存在,Omnibus將在您的存儲庫的根部使用名為omnibus.rb
頂級配置文件。此文件在運行時加載,並包含許多配置調諧物。這是一個示例:
# 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
文檔。
您可以通過將--config
選項傳遞到任何命令:
$ bin/omnibus --config /path/to/config.rb
最後,您可以使用--override
標誌在命令行處覆蓋特定的配置選項。這比任何配置文件值都具有最終優先級:
$ bin/omnibus --override use_git_caching:false
項目DSL文件定義您的實際應用程序;首先,這是您創建的全棧安裝程序的原因。它提供了一種定義項目依賴項(同樣,如軟件DSL定義文件中指定的)以及設置安裝程序軟件包元數據的方法。
所有項目定義都必須在綜合存儲庫的config/projects
目錄中。
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 | 綜合軟件定義的組件,將包含在此軟件包中 |
package | 調用包裝特定的DSL |
compress | 調用壓縮機特定的DSL |
默認情況下,時間戳將附加到build_version。您可以通過將append_timestamp
設置為omnibus.rb
中的false
或使用--override append_timestamp:false
在命令行中關閉此行為。
有關更多信息,請參閱Project
文檔。
綜合“軟件”文件定義了使您的整體軟件包的單個軟件組件。它們是您應用程序的基礎。該軟件DSL提供了一種定義在哪裡檢索軟件源,如何構建它們以及它們擁有的依賴性的方法。這些依賴項也在其自己的軟件DSL文件中定義,從而為依賴性感知的構建順序構成了基礎。
所有軟件定義都應在綜合項目存儲庫的config/software
目錄中進行。
這是一個示例:
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 | 該軟件取決於的綜合軟件定義的組件 |
relative_path | 提取的tarball的相對路徑 |
build | 構建說明 |
有關更多DSL方法,請諮詢Software
文檔。
此外, build
塊內有許多DSL方法:
DSL方法 | 描述 |
---|---|
command | 執行單個外殼命令 |
make | 運行Make Make(或沒有ARG),在適當的時候使用Gmake |
patch | 從磁盤上應用一個補丁 |
workers | 建築商的最大數量 |
windows_safe_path | 格式化安全的路徑,以便在窗戶上砲擊 |
go | 在嵌入式GO時執行代碼 |
ruby | 將代碼作為嵌入式Ruby執行 |
gem | 執行代碼作為嵌入式RubyGems |
bundle | 執行代碼作為嵌入式Bundler |
rake | 將代碼作為嵌入式Rake Gem執行 |
block | 在構建時間執行Ruby Block |
erb | 渲染給定的ERB模板 |
mkdir | 創建給定目錄 |
touch | 創建給定的空文件 |
delete | 刪除給定的文件或目錄 |
strip | 給定文件或目錄上的二進製文件的帶狀符號 |
copy | 複製A到B |
move | 移動A到B |
link | 鏈接到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
由於軟件定義僅僅是Ruby代碼,因此您可以通過用純ruby包裹該版本編號來有條件執行任何內容。
共享整個組織軟件的最簡單方法是通過Bundler和Rubygems。有關示例軟件存儲庫,請查看廚師的綜合軟件。有關更多信息,請參閱RubyGems文檔。
建議您使用Bundler撤下這些寶石(因為Bundler還允許直接從GitHub拉動軟件):
gem 'my-company-omnibus-software'
gem 'omnibus-software' , github : 'my-company/omnibus-software'
然後將軟件的名稱添加到Omnibus配置中的software_gems
列表:
software_gems %w( my-company-omnibus-software omnibus-software )
您還可以在磁盤上指定本地路徑(但請注意,這可能會使團隊之間的項目共享很困難):
local_software_dirs %w( /path/to/software /other/path/to/software )
對於所有這些路徑,訂單很重要,因此可以依靠本地軟件版本,同時仍保留遠程軟件存儲庫。給定上述示例,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
的第一個實例將使用。請注意,本地(供應商)的軟性定義優先!
創建軟件包和軟件定義後,您可以構建以下方式:
./bin/omnibus build $MY_PACKAGE_NAME
但是,有幾個警告要注意:
omnibus.rb
中取消base_dir
,或者至少要更改cache_dir
和build_dir
,否則它將嘗試使用/var/cache/omnibus
和/opt/$MY_PROJECT_NAME
,需要root。config/projects/$MY_PROJECT_NAME.rb
中項目配置中列出的軟件依賴項。您可以參考config/software
文件夾中存在的軟件.rb
文件。install_dir
通常需要在構建時間進行root
特權。更改它的另一個位置,例如"/tmp/#{name}"
以避免以root
運行。omnibus-software
GEM中默認配置中的許多內容。因此,您想使用您需要在Gemfile
中刪除它或分叉的那些,然後參考您自己的/opt/$project/bin
中的binstubs,則您要么需要使用appbundler,要么需要有一個後安裝步驟來創建這些binstubs。ruby
版本的覆蓋,則您還需要覆蓋rubygems
和bundler
以匹配ruby
版本中的版本,否則您將在Bundler版本不匹配的情況下獲得失敗。當然,上面的構建命令將在您的本地主機上構建,因此特定於您所使用的OS和基本系統。但是, omnibus new
已經設置廚房的Skeleten設置為您提供了易於構建的OSS,請參見您生成的Omnibus目錄中的README.md
有關詳細信息。
基於GIT的軟件定義可以將分支指定為其default_version。在這種情況下,除非使用項目覆蓋(見下文)或使用外部版本清單,否則將在構建時間確定要使用的確切GIT修訂版。要生成版本,請使用omnibus manifest
命令:
omnibus manifest PROJECT -l warn
這將輸出一個包含每個軟件定義的已解決版本的JSON-Formatting清單。
有時,一個平台有需要白色的庫,以便健康檢查可以通過。 《健康檢查守則》中發現的白名單包括在受支持平台上成功構建的最低要求。
要添加您自己的白名單庫,只需在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"
必須在關聯的軟件中定義覆蓋版本!
默認情況下,綜合將登錄warn
級別。您可以通過將--log-level
標誌傳遞給您的綜合呼叫來覆蓋這一點:
$ bin/omnibus build < project > --log-level info # or "debug"
默認情況下,Omnibus Caches編譯了軟件定義,因此N+1 Omnibus項目構建速度要快得多。可以通過將以下內容添加到omnibus.rb
:可以禁用此功能:
use_git_caching false
有關貢獻此項目的信息
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.