ルビーの連続積分
私は最近Rubyのいくつかのプロジェクトに対処しなければなりませんでした、そして、私はこの新しい環境に適応しようとしました.個人的なレベルでは、私はこれらのプロジェクトに数ヶ月後に戻って来なければならないときに、より認知的な負担を意味します.それが起こるように、私は(一貫して)対立している規則のために連続統合を実装している若干のトラブルを持ちました.でもとにかく試してみました. A simple project A more complete project
My website (which includes my blog) はルビーに基づいていますJekyll 主催のプロジェクトGitHub Pages (今のところ).確かに、Rubyプロジェクトは適切なRubyプロジェクトではありません(例えばRubyがターゲットサーバー上で必要とされていません).しかし、私はそれが概念とツールに関連した良い紹介です.
プロジェクトの主な要素は以下の通りです.
The build file (
The script file (
The CI configuration file (
ここでRubyの環境で使用するビルドツールにはあまり選択肢がないと思いますRake それは.以下はファイル全体です.
それで、何がそこにありますか?The build file 以下のターゲット( rake speakのタスク)を定義します.
build : clean :ビルドをきれいにする
ビルド:コンパイル:Webサイトの静的なバージョンを作成します
ビルド:テスト:プロジェクトをテストします. 私のウェブサイトのリンクをチェックしたいHTMLProofer . 私は使えるa Jekyll plugin これについては、テストリンクはかなり時間がかかり、エラーが発生しやすくなります.
Build : Analysis :チェックの廃止と設定の問題(Jekyllを使用).
ビルド:パッケージ:Webサイトの静的バージョンの展開可能なアーカイブを作成します すべてが展開を含むGithubページによって扱われるので、これはほとんど役に立ちません、しかし、これは部分的に概念の証明です.そして、私は私がいつか他の場所で私のウェブサイトを主催することができたということを知っている自由を好みます.
ビルド:ビルド:ビルドの組み合わせのショートカット:コンパイル、ビルド:テストとビルド:分析.
ビルド:ビルド:ビルドの組み合わせのためのショートカット:クリーンとビルド:ビルド.
ビルド:リリース:ビルドの組み合わせのショートカット:クリーン、ビルド:ビルド、ビルド:パッケージ. ここで注目すべきことは、タスク名の名前空間の使用です.繰り返しますが、これはa Rails project . したがって、build : compileタスクの説明は単純です.
ビルド:パッケージタスクはビルドに依存します:パッケージ:ビルドします. ビルド:パッケージ:ビルドタスクは、TMP/out/binをビルドする規則に依存しますwww.cartoixa.me-0.0.0.zip . TMP/out/binをビルドする規則www.mcartoixa.me-0.0.0.zip ビルドに依存します:コンパイル(静的なウェブサイトは、それをパッケージ化しようとする前に作成されなければなりません).これは新参者にとって少し混乱しているように見えるかもしれませんが、実際には非常に強力です. 最後にここに追加したいのはHTMLProofer は細かいツールですが、 私はまだそれが実際に存在しない新しいブログ記事を追加したときに文句を言わないようにまだ方法を見つける必要があります. 時々、ウェブサイトは失敗するので、...私は、それがエラーの代わりに警告を引き起こすだけであることを確かめるべきであると思います.
のインスタンスを実行したRedmine Windows Server 2012とIISでは、Rubyはクロスプラットフォーム技術であることがわかりました.実際に私は、ネイティブコンパイルを必要とする多くの依存関係が維持されていないことを経験しました.
免責事項
MacOSやLinuxを実行するCIプラットフォームが必要ですTravis CI うまくいきます.もう一度、ビルドファイルのすべての困難に対処した
これは本当にトラブルが始まるところです.より複雑なRailsプロジェクトに同じ原則を適用しようとして、私は克服するのが難しいようである困難に対して来ました.これは私の環境そのものの知識不足のためかもしれませんが、それは矛盾する規則のためかもしれません.私はすべての開発者がコマンドラインからすべて(そして何か)を達成できるようにすべてが行われているという感覚を持っています.これは以下のような多くのことを意味します. 別のディレクトリで作業する必要はありません.これは、パッケージの目的のための生産依存性のみを取得するソースコードのコピーを処理するために(例えばJavaScriptと比較して)かなり面倒です. いくつかのツールにはメモリがあります.Bundler 現在の環境(開発、生産)を覚えています. 悪いことに、いわゆるDeployment Mode あなたの開発環境を説明します. これらの機能をハード!しかし、これは両方の世界を調整する方法についていくつかの洞察力を持っている場合は、請求書として意図されていません:共有してください.
私はここで本当の、そして完全なプロジェクトを共有することができませんが、いくつかの使用でありえるrakefile要素を示すことができます Rubyを実行してソースファイルの構文をチェックする方法
ハウツー動画Reek Rubyファイル(これはreekターゲットを作成します)
ハウツー動画Rubocop Rubyファイル( RuboCopターゲットを作成)
パッケージは、ビルドの一部として資産を生成しているときに(例えば、Minified JavaScriptファイルのような)、あなたが作成しなければならないので、より挑戦的なことを証明しますfile lists これらのファイルが生成された後(target assets:precompile in a Rails project ). これは次のようになります.
単純プロジェクト
My website (which includes my blog) はルビーに基づいていますJekyll 主催のプロジェクトGitHub Pages (今のところ).確かに、Rubyプロジェクトは適切なRubyプロジェクトではありません(例えばRubyがターゲットサーバー上で必要とされていません).しかし、私はそれが概念とツールに関連した良い紹介です.
マッカピカ / マカッキーシスギタブ.io
マイパーソナルウェブサイト
プロジェクトの主な要素は以下の通りです.
The build file (
Rakefile
). The script file (
build.sh
) ビルドファイルをローカルで実行するのに役立ちます.The CI configuration file (
.travis.yml
). ビルドファイル
ここでRubyの環境で使用するビルドツールにはあまり選択肢がないと思いますRake それは.以下はファイル全体です.
PROJECT_NAME ||= 'www.mcartoixa.me'
PROJECT_VERSION ||= '0.0.0'
import 'build/common.rake'
大丈夫、だまされた.私はすべてのビルドを収集するようにbuild\
フォルダと私は、ここでそれをしました.しかし、我々が無作為に得る単純性において我々が緩んでいるものa Rails project , 多くのタスクとターゲットがインポートされるところで、これは実際にプロジェクトにより読みやすくなることがわかります.それで、何がそこにありますか?The build file 以下のターゲット( rake speakのタスク)を定義します.
build : clean :ビルドをきれいにする
tmp\
ディレクトリ).ビルド:コンパイル:Webサイトの静的なバージョンを作成します
tmp\obj\bin\
フォルダ).ビルド:テスト:プロジェクトをテストします.
Build : Analysis :チェックの廃止と設定の問題(Jekyllを使用).
ビルド:パッケージ:Webサイトの静的バージョンの展開可能なアーカイブを作成します
tmp\out\bin\
フォルダ).ビルド:ビルド:ビルドの組み合わせのショートカット:コンパイル、ビルド:テストとビルド:分析.
ビルド:ビルド:ビルドの組み合わせのためのショートカット:クリーンとビルド:ビルド.
ビルド:リリース:ビルドの組み合わせのショートカット:クリーン、ビルド:ビルド、ビルド:パッケージ.
namespace 'build' do
task 'compile' do
sh 'jekyll', 'build', '-dtmp/obj/bin/', 'JEKYLL_ENV=production', '--strict_front_matter'
end
end
ビルド:テストタスクは少し複雑ですが、実際には主にHTMLProofer 設定require 'html-proofer'
namespace 'build' do
task 'test' => %w[compile]
task 'test' do
options = {
:allow_hash_href => true,
:assume_extension => true,
:check_favicon => true,
:check_opengraph => true,
:file_ignore => [
/\/blog\/software-craftsmanship\/20[01]\d\//, # Do not check old blog posts
/\/sections\//
],
:root_dir => 'tmp/obj/bin/',
:url_ignore => [
'http://html5up.net', 'https://chrisbobbe.github.io/', # Included by the template
'https://www.facebook.com/mathieu.cartoixa', # 404 only when checked...
'https://www.linkedin.com/in/cartoixa/', 'https://www.linkedin.com/in/cartoixa/?trk=profile-badge' # 999 only when checked
]
}
HTMLProofer.check_directory('tmp/obj/bin/', options).run
end
end
それから、build : packageタスクは、アーカイブの作成のための外部パッケージを必要としますPackageTask プロジェクトのルート外のファイルのアーカイブをうまくサポートしていないようです.これは次のようになります.require 'zip'
namespace 'build' do
namespace 'package' do
PACKAGE_FILE = 'tmp/out/bin/www.mcartoixa.me-0.0.0.zip'
file PACKAGE_FILE => %w[build:compile]
file PACKAGE_FILE do
FileUtils.mkdir_p('tmp/out/bin/')
Zip::File.open(PACKAGE_FILE, Zip::File::CREATE) do |zf|
Rake::FileList.new('tmp/obj/bin/**/*').each do |f|
zf.add(f.delete_prefix('tmp/obj/bin/'), f)
end
end
end
task 'build' => PACKAGE_FILE
end
task 'package' => %w[package:build]
end
ここで、ビルドツールの主な特徴の一つは、ターゲット間の依存関係を記述する能力です.これは以下の通りです.スクリプトファイル
のインスタンスを実行したRedmine Windows Server 2012とIISでは、Rubyはクロスプラットフォーム技術であることがわかりました.実際に私は、ネイティブコンパイルを必要とする多くの依存関係が維持されていないことを経験しました.
免責事項
build.bat
そして、build.sh
ファイルは単にBundler ここで):if bundle check > /dev/null; then
bundle clean
else
bundle install --standalone --clean
fi
bundle exec rake build:${TASK}
CI設定ファイル
MacOSやLinuxを実行するCIプラットフォームが必要ですTravis CI うまくいきます.もう一度、ビルドファイルのすべての困難に対処した
.travis.yml
では、before_install:
- gem install bundler
install:
- bundle install --standalone --clean --jobs=3 --retry=3
script:
- bundle exec rake build:release
より完全なプロジェクト
これは本当にトラブルが始まるところです.より複雑なRailsプロジェクトに同じ原則を適用しようとして、私は克服するのが難しいようである困難に対して来ました.これは私の環境そのものの知識不足のためかもしれませんが、それは矛盾する規則のためかもしれません.私はすべての開発者がコマンドラインからすべて(そして何か)を達成できるようにすべてが行われているという感覚を持っています.これは以下のような多くのことを意味します.
私はここで本当の、そして完全なプロジェクトを共有することができませんが、いくつかの使用でありえるrakefile要素を示すことができます
SOURCE_FILES = Rake::FileList.new('.ruby-*', 'config.ru', 'Gemfile*', 'Rakefile', 'app/ **/*', 'bin/** /*', 'config/ **/*', 'db/** /*', 'lib/ **/*', 'public/** /*', 'vendor/**/*') do |fl|
fl.exclude(/^config\/app_parameters.yml$/)
fl.exclude(/\.log$/)
end
RUBY_FILES = Rake::FileList.new(SOURCE_FILES.dup.to_a.select do |path|
path.ends_with?('.rb')
end) do |fl|
fl.exclude(/^vendor\//)
end
namespace 'build' do
rule '.rb.log' => [
proc { |tn| tn.gsub(/\.rb\.log$/, '.rb').sub(/tmp\/obj\//, '') }
] do |t|
FileUtils.mkdir_p(File.dirname(t.name))
ruby "-wc #{t.source} > #{t.name}"
end
task 'compile' => RUBY_FILES.gsub(/\.rb$/, '.rb.log').sub(/^/, 'tmp/obj/')
end
ルールを定義する*.rb.log
対応するRubyを実行して生成されるファイル*.rb
ファイルを出力し、出力します.定義するタスクは、これらのファイルの生成に依存します.require 'reek/rake/task'
Reek::Rake::Task.new do |t|
t.config_file = '.reek.yml'
t.source_files = RUBY_FILES
t.reek_opts = '-s --force-exclusion --no-progress'
end
require 'rubocop/rake_task'
RuboCop::RakeTask.new(:rubocop) do |t|
t.formatters = ['clang', ['html', '-o', 'tmp/rubocop-results.html']]
t.patterns = RUBY_FILES
end
前に書いたように、静的解析ツールを使用してReek //Rubocop (そして、あなたがすべきである)、一度に修正するために何百もの警告を避けるためにあなたのプロジェクトの人生でできるだけ早くそれをしなければなりません..パッケージは、ビルドの一部として資産を生成しているときに(例えば、Minified JavaScriptファイルのような)、あなたが作成しなければならないので、より挑戦的なことを証明しますfile lists これらのファイルが生成された後(target assets:precompile in a Rails project ). これは次のようになります.
require 'rake/packagetask'
PACKAGED_FILES = Rake::FileList.new(SOURCE_FILES.dup) do |fl|
fl.exclude(/^app\/assets\//)
end
namespace 'build' do
namespace 'package' do
pt = Rake::PackageTask.new('my_application', '0.0.0') do |t|
t.need_tar_gz = true
t.package_dir = 'tmp/obj/bin/'
t.package_files = PACKAGED_FILES
end
file pt.package_dir_path + '/public/assets' => %w[assets:precompile]
file pt.package_dir_path + '/public/assets' do
pt.package_files = pt.package_files + Rake::FileList.new('public/assets/**/*')
end
task 'build' => pt.package_dir_path + '/public/assets'
task 'build' => %w[package]
task 'build' do
FileUtils.mkdir_p('tmp/out/bin/')
FileUtils.mv(File.join(pt.package_dir, pt.tar_gz_file), 'tmp/out/bin/')
end
end
task 'package' => %w[package:build]
end
CIコンフィギュレーション内の特定のコマンドラインを指定するときには、ビルドの種類が異なります(これはローカルビルドの一部ではありません).bundle install --standalone=test --deployment
RAILS_ENV=test bundle exec rake build:release
テスト依存性を考慮したパッケージ化には理想的ではないcapybara or RSpec Rails ). しかし、ヘイ:進行中の仕事.Reference
この問題について(ルビーの連続積分), 我々は、より多くの情報をここで見つけました https://dev.to/mcartoixa/continuous-integration-for-ruby-4h56テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol