2017-01-30 7 views
1

В настоящее время я работаю над строительным конвейером, который использует Jenkins и GitLab для запуска сборок для проекта. В принципе, сборка запускается, когда кто-то подталкивает к репозиторию. Кроме того, некоторые скрипты Ruby выполняются как часть процесса сборки. Эти скрипты выполняют некоторые проверки проектов и выполняют некоторые исправления, такие как синхронизация проекта Xcode с добавленными и удаленными файлами из исходного каталога - в этом случае они не совпадают.Как найти правильную версию Ruby

Я использую несколько инструментов для настройки конвейера. Сборка выполняется на машине, физически расположенной на ведомом устройства. Дженкинс развернут на машине AWS. По этой причине я использовал pritunl для подключения двух в виртуальной сети. Я могу использовать локальные IP-адреса для связи между машинами, и SSH отлично работает в обоих направлениях.

Когда я нажимаю на пульт, сборка начинается правильно на подчиненном устройстве, но она не может быть завершена. Однако, если я вручную получаю доступ через SSH через терминал, сборка выполняется нормально. Это выход я получаю от Jenkins:

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- xcodeproj (LoadError) 
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from /Users/jenkins/workspace/Core/platform/ios/scripts/pbxsync.rb:58:in `<main>' 

Как вы можете видеть, она не требует Xcodeproj, в результате чего сборка на провал. Тем не менее, это происходит только в том случае, если сборка запускается Jenkins, а не вручную.

Это заставляет меня думать, что Дженкинс использует какую-то другую установку Ruby или, по крайней мере, другую среду. В основном мне нужно установить драгоценные камни для той же среды Ruby, что и Jenkins, но я не знаю, какой именно. Есть идеи?


У Jenkins есть консоль, которая запускает скрипты Groovy на удаленном подчиненном устройстве. Я играл с ним немного, но не так много выводов. Может быть, это помогает.


Это может быть важно; это притон я использую для сценариев Ruby: #!/usr/bin/env ruby


На терминале, я использую тот же пользователь, как Дженкинс доступа к ведомой машине. Это называется «дженкинс».


Одна вещь, которую я забыл упомянуть о том, что выход говорит мне правильную версию: /Users/jenkins/.rvm/rubies/ruby-2.4.0. По крайней мере, это путь, который указывает, что он пытается загрузить драгоценный камень. Так что я попытался следующие:

: /Users/jenkins/.rvm/rubies/ruby-2.4.0/bin/ruby 
require 'xcodeproj' 

Потом нажмите Ctrl + D и не получить никакого вывода - что установка рубина найти драгоценный камень правильно.

+0

Не нужно и нежелательно использовать теги «Изменить» или «Обновить» в тексте. Вместо этого поместите информацию в текст, где бы она была, если бы вы добавили ее изначально. Мы можем видеть, где и когда вы изменили текст, если нам нужно. –

+0

Вы не можете использовать '/ usr/bin/env ruby' и получать согласованные результаты по различным учетным записям и системам, если они не настроены одинаково, что маловероятно при использовании Jenkins. 'env' смотрит внутри PATH, чтобы найти Ruby и возвращает первый найденный Ruby. Если вы не устанавливаете свой PATH и не установили тот же Ruby, что и локальные коэффициенты, хорошо, Дженкинс находит Ruby, установленный ОС в/usr/bin/ruby. Вам нужно будет проверить, что Дженкинс использует против вашей локальной системы, когда вы создаете вручную. –

+0

Ну, да, но как? Я понимаю, что мне нужно знать, какая установка Jenkins работает, я просто не знаю, как это сделать. Идеи? –

ответ

2

Если вы используете плагин Jenkins Slave для связи между Jenkins Master и Jenkins Slave, каждая команда, которую вы укажете, будет запускаться в неинтерактивной оболочке. Это означает, что у Дженкинса будет только доступ к рубину системы в вашем случае.

Итак, если вы хотите установить что-то, что необходимо установить, вам нужно сделать это в рубине системы. Вы используете rvm так: rvm use system, и вы можете установить gem в системный рубин.

Если вы хотите использовать другую версию Ruby, кроме рубинового, вам нужно добавить RVM в $ PATH для неинтерактивной оболочки.Вот основные настройки, которые должны помочь: https://rvm.io/rvm/basics

+0

Ах! Делает совершенный смысл. Поэтому я знаю, что делать. Я попробую. Одна вещь, которую я заметил, это то, что моя рубина системы 2.0.0, но для чего мне нужно 2.2.2. Это, должно быть, было началом всего этого. Я также заметил, что 'gem' (используя' gem env') дает совершенно разные результаты. Я попробую обновить систему и вернуться к результатам. Спасибо! –

+0

Проблема сохраняется ... Я редактировал как '~/.bash_profile', так и' ~/.bashrc', но ни один из них не загружается бегуном Jenkins. Я также попробовал «rvm --default use 2.4». Есть ли способ изменить системную версию ruby? –

+1

@ AndréFratelli У меня была проблема, подобная вашей, с Gradle и Jenkins, и я редактировал «/ etc/environment», чтобы включить путь к Gradle, и Дженкинс мог использовать его в шагах Pipeline в неинтерактивной оболочке. – Cosaquee

1

Я наконец-то справился. Поскольку @Cosaquee указано в другом ответе, важно различать интерактивные и неинтерактивные оболочки. Основная причина этого заключается в том, что в зависимости от того, как вы называете SSH, это имеет значение. Как man page указывает:

Если указана команда, она выполняется на удаленном хосте вместо Войти оболочки.

Это имеет смысл, так как запуск команды для узла я поставил Дженкинс это один:

ssh [email protected] java -jar ~/bin/slave.jar 

В то же время, я был вход с стандартной ssh [email protected] от терминала, который запускает оболочку входа. Имеет смысл, что я получал разные результаты, потому что две оболочки load different initial scripts. В принципе, если вы используете ssh [email protected] для входа в систему, загружается ~/.bash_profile, а если вы укажете команду, например ssh [email protected] whatever, то вместо этого будет загружена . Таким образом, я добавил эту строку ~/.bashrc:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" 

Без него я получил:

РВМ не является функция, выбирая рубины с «использованием РВМ ...» не будет работы.

Преимущество состояло в том, что теперь я мог использовать RVM из той же среды, которую использовал Дженкинс. Остальное просто:

ssh [email protected] rvm --default use 2.3 

И:

ssh [email protected] 
rvm --default use 2.3 

И оба теперь используют ту же версию рубина.

Смежные вопросы