بناء Ruby وJRuby على CircleCi بالتوازي
اضبطوا CircleCI لبناء تطبيقكم على Ruby وJRuby بالتوازي.

احتجت مؤخرًا إلى تحويل تطبيق Rails ليس بالبسيط من MRI إلى JRuby لأحد عملائنا. سارت العملية بسلاسة إلى حد كبير، لكن متطلبات الأعمال تتغير، وقد يحتاج العميل إلى تشغيل التطبيق على MRI أو JRuby.
وللتأكد من أن تغييرات الكود لن تكسر البناء على أيٍّ من المنصتين، ضبطت CircleCI لبناء النسختين في الوقت نفسه. وقررت ضبط التوازي يدويًا، بحيث تُبنى كل منصة في container مختلف في الوقت نفسه (MRI في container 0، وJRuby في container 1).
إعداد البيئة
يبدأ الإعداد بإضافة بعض متغيرات البيئة لتحديد إصدارات Ruby المختلفة. وأضفت أيضًا متغيرًا مجمّعًا باسم RUBY_VERSIONS، يُستخدم لتشغيل أوامر RVM على المنصتين عبر rvm do. كما أضفت بعض خيارات الضبط الخاصة بـ Java لضمان أن تعمل عمليات بناء JRuby بسرعة معقولة دون أن تستهلك ذاكرة كبيرة.
machine:
environment:
MRI_VERSION: 2.3.3
JRUBY_VERSION: jruby-9.1.6.0
RUBY_VERSIONS: $MRI_VERSION,$JRUBY_VERSION
JRUBY_OPTS: '--debug -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -J-Xms512m -J-Xmx1024m'
# other environment variables
lang-yaml
تثبيت التبعيات
هذا تجاوز (override) بسيط لطريقة CircleCI المعتادة في تثبيت التبعيات: نحدّث RVM للحصول على أحدث إصدارات Ruby، ونثبّت الإصدارات المحددة في RUBY_VERSIONS، ثم نستخدم rvm do لتثبيت Bundler والـ gems المحددة في Gemfile (وباستخدام platforms يسهل إلى حد ما بناء Gemfile يعمل مع إصداري Ruby كليهما).
dependencies:
override:
- rvm get head
- rvm install $RUBY_VERSIONS
- rvm $RUBY_VERSIONS do gem install bundler
- rvm $RUBY_VERSIONS do bundle install
lang-yaml
إعداد الاختبارات
هذه حيلة ذكية تعلّمتها من توثيق CircleCI. يمكنكم استخدام عبارة case من الـ shell داخل ملف الإعداد لتشغيل أوامر مختلفة في containers مختلفة. ومع rvm use أتاح لي ذلك "تثبيت" MRI على container 0 وJRuby على container 1، فنعرف فورًا أي إصدار تسبّب في فشل البناء.
test:
override:
- case $CIRCLE_NODE_INDEX in 0) rvm use $MRI_VERSION && bundle exec rspec ;; 1) rvm use $JRUBY_VERSION && bundle exec rspec ;; esac:
parallel: true
lang-yaml
الخلاصة
رغم أن CircleCI بصيغته الحالية لا يدعم شيئًا مثل build matrix في Travis، فإنه مرن بما يكفي لإيجاد حلول بديلة. وآمل أن يبسّط الإصدار 2.0 هذه العملية، لكن الحل الحالي سهل بما يكفي ويؤدي الغرض جيدًا بالنسبة إلينا.


