伞项目:厨师基金会
项目状态:活跃
发出响应时间最多: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.