ルビーの連続積分


私は最近Rubyのいくつかのプロジェクトに対処しなければなりませんでした、そして、私はこの新しい環境に適応しようとしました.個人的なレベルでは、私はこれらのプロジェクトに数ヶ月後に戻って来なければならないときに、より認知的な負担を意味します.それが起こるように、私は(一貫して)対立している規則のために連続統合を実装している若干のトラブルを持ちました.でもとにかく試してみました.
  • A simple project
  • A more complete 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\ フォルダ).

  • ビルド:テスト:プロジェクトをテストします.
  • 私のウェブサイトのリンクをチェックしたいHTMLProofer . 私は使えるa Jekyll plugin これについては、テストリンクはかなり時間がかかり、エラーが発生しやすくなります.

  • Build : Analysis :チェックの廃止と設定の問題(Jekyllを使用).

  • ビルド:パッケージ:Webサイトの静的バージョンの展開可能なアーカイブを作成しますtmp\out\bin\​ フォルダ).
  • すべてが展開を含むGithubページによって扱われるので、これはほとんど役に立ちません、しかし、これは部分的に概念の証明です.そして、私は私がいつか他の場所で私のウェブサイトを主催することができたということを知っている自由を好みます.

  • ビルド:ビルド:ビルドの組み合わせのショートカット:コンパイル、ビルド:テストとビルド:分析.

  • ビルド:ビルド:ビルドの組み合わせのためのショートカット:クリーンとビルド:ビルド.

  • ビルド:リリース:ビルドの組み合わせのショートカット:クリーン、ビルド:ビルド、ビルド:パッケージ.
  • ここで注目すべきことは、タスク名の名前空間の使用です.繰り返しますが、これはa Rails project . したがって、build : compileタスクの説明は単純です.
    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
    
    ここで、ビルドツールの主な特徴の一つは、ターゲット間の依存関係を記述する能力です.これは以下の通りです.
  • ビルド:パッケージタスクはビルドに依存します:​パッケージ:ビルドします.
  • ビルド:​パッケージ:ビルドタスクは、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はクロスプラットフォーム技術であることがわかりました.実際に私は、ネイティブコンパイルを必要とする多くの依存関係が維持されていないことを経験しました.
    免責事項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プロジェクトに同じ原則を適用しようとして、私は克服するのが難しいようである困難に対して来ました.これは私の環境そのものの知識不足のためかもしれませんが、それは矛盾する規則のためかもしれません.私はすべての開発者がコマンドラインからすべて(そして何か)を達成できるようにすべてが行われているという感覚を持っています.これは以下のような多くのことを意味します.
  • 別のディレクトリで作業する必要はありません.これは、パッケージの目的のための生産依存性のみを取得するソースコードのコピーを処理するために(例えばJavaScriptと比較して)かなり面倒です.
  • いくつかのツールにはメモリがあります.Bundler 現在の環境(開発、生産)を覚えています.
  • 悪いことに、いわゆるDeployment Mode あなたの開発環境を説明します.
  • これらの機能をハード!しかし、これは両方の世界を調整する方法についていくつかの洞察力を持っている場合は、請求書として意図されていません:共有してください.
    私はここで本当の、そして完全なプロジェクトを共有することができませんが、いくつかの使用でありえるrakefile要素を示すことができます
  • Rubyを実行してソースファイルの構文をチェックする方法
  • 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 ファイルを出力し、出力します.定義するタスクは、これらのファイルの生成に依存します.
  • ハウツー動画Reek Rubyファイル(これはreekターゲットを作成します)
  • 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
    
  • ハウツー動画Rubocop Rubyファイル( RuboCopターゲットを作成)
  • 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 ). しかし、ヘイ:進行中の仕事.