Solved Gem installation problem.
Hello, there is a problem with installing Gem files in the redmine application.
Plugins just don't find them.
I already had a problem with the Agil plugin, but even after updating the plugin version (with official support, the situation has not changed).
A "clean install" of redmine also didn't help.
To dispel my doubts, I checked the instructions indicated in the documentation and also tried to install only "REDMINE CRM PLUGIN" (https://docs.cloudron.io/apps/redmine/) and as it turned out there also the gem files are not installed correctly and the application goes in reboot.
@neluser mm, I thought I had fixed this one already but clearly not. Let me try to reproduce this and get back.
jegillikin 0 last edited by
+1 for reproducing this problem in the wild.
@girish Hello, I saw that a new version of Redmine 4.2.2 (2021-08-01) has been released.
Perhaps updating to the latest package will help fix the problem with the gems.
@neluser I am working on the update. Should be out this week.
@girish Ok, Thanks!
@girish Hello, how is the update going? Is there an improvement in installing gems correctly?
@neluser apologies, I haven't forgotten this. I will work on this tomorrow.
@girish Hello again, how are the redmine updates progressing?
@neluser I have pushed out update to 4.2.2. But I don't think the redmine version upgrade will fix the gem installation problem. I made some progress today with trying to figure how to get gems to install out of the plugin directory that redmine can also use. I will continue the work tomorrow.
@girish Hello, unfortunately the update did not bring any improvements.
If this information helps, then the latest version on which the gems worked properly is, "Package Version firstname.lastname@example.org ".
I have suspicions. that the problem might be with the Ruby version.
Because the latest working version of Redmine is installed with the Ruby version: "ruby 2.5.1". And the problems with gems started with the version: "ruby 2.7.0"
@neluser thanks for the hint. Let me see if downgrading ruby will help, but it's a bit complicated because the default ruby on ubuntu 20 is ruby 2.7. Maybe I can try via rvm but I would rather not use older ruby if we can avoid it.
This post is deleted!
@girish Hello! Are there improvements in the bug fixes?
The Redmine website states that Ruby 2.7 is not supported. Need to use Ruby 2.7.2 or higher.
(Redmine 4.2 does not support Ruby 2.7.0 and 2.7.1. Use Ruby 2.7.2 or higher )
@neluser you are right, the current app docker is not correct and should be updated to use rvm to install a more recent ruby. Looks like ubuntu 20 has ruby 2.7.0 out of the box.
root@6fb7aad07e35:/# ruby2.7 --version ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
I pushed the update to 4.2.3 already, I am updating it to use rvm now.
Looks like https://www.brightbox.com/docs/ruby/ubuntu/#installation is easier
@neluser I have fixed the ruby version issue now. On to the gem installation issue. I get the same error as you:
root@e6152e31-acac-4353-a1c4-8ceab636eed8:/app/code# bundle exec rake redmine:plugins RAILS_ENV=production Could not find gem 'redmine_crm' in locally installed gems. Run `bundle install` to install missing gems. root@e6152e31-acac-4353-a1c4-8ceab636eed8:/app/code# bundle exec rake redmine:plugins NAME=redmine_contacts RAILS_ENV=production Could not find gem 'redmine_crm' in locally installed gems. Run `bundle install` to install missing gems.
@girish Hi, I also tried to change Ruby version via brightbox to 2.6. But after every reboot of the application, Ruby reverts to version 2.7.0.
@neluser It's not a ruby version issue, it's to do with gem locations. I am still debugging why it can't find the gem anymore, because this used to work before.
@girish I noticed that the path has changed in the new version.
Alright, I am back on this case now. It seems I have re-learn how ruby/gems are deployed each time I investigate this. So, I will leave some notes this time around to help us all later.
OK, I think I figured this one out.
Just leaving my notes here, since I will surely need this few months from now
RubyGems is the package manager and the names of packages is gems. RubyGems is part of ruby since 1.9. The
gemCLI lets one install gems.
installare common subcommands.
gem installrequires sudo since into installs into system location
/var/lib/gems/2.7.0. It will also install deps of the gem. App can
requirethese gems in code.
Bundle(r) allows an app to specify a Gemfile that lists the gems and it's versions.
bundle installwill install the gems into the same system wide location.
bundle exec commandruns the executable command in context of the bundle. Meaning, it will ensure that the app does not use any gems not listed in the bundle and also ensure that the gems it is using are compatible with the versions in the Gemfile.
Gemfile.lockwith "resolved" versions. This has to be writable file even at runtime.
GEM_HOMEdefines where gems are installed.
GEM_PATHis list of search locations for gems. This is at the kernel level. Default value of these variables can be got from
gem env gemhomeand
gem env gempath.
GEM_HOMEis implicitly included into
bundler- by default, it's tuned for development and uses
gemdefaults underneath. This means everything is installing into system locations.
deploymentmode which is a shortcut for installing into
--localwill write to
<project_root>/.bundle/configand --global will write to
~/.bundle/config). When you call
bundle install --deploymentfirst time, it stashes this path info into
.bundle/configand all subsequent calls follow this "deployment" mode. In deployment mode, gems will only get loaded from the vendor directory and nowhere else. (As an aside,
BUNDLE_PATHenv var can be set to tell bundler where to install and locate gems).
Ruby kernel is just loading gems based on
bundle execis essentially overloading
requirecalls. It reads
LOAD_PATHto have paths of the gems and then calling the original kernel
OK, next part of notes is how things relate to Redmine package.
- Redmine is installed into
- gems needed by redmine are installed by calling bundle in
deploymentmode. This means gems are installed into
/app/code/vendor/bundle. The bundle calls creates a
- We set
BUNDLE_PATHenv var to
/app/data/vendor/bundle. The intention here is that when the user calls
cd plugindir && bundle install, the gems needed by the plugin will get installed into
/app/data/vendor/bundle. This works as expected. (We set env var because the
.bundle/configwon't be found after the
- For gem loading to work,
GEM_PATHis set to
/app/data/vendor/bundlewith the intention that
bundler execwill use it . But as read in the notes above, the whole point of deployment mode is to only load gems from the path in
.bundle/config. This means that gems required by plugins will never be loaded. This is obvious now... we cannot have gems in two locations in deployment mode.
This used to work because this commit switched to deployment mode without understanding the consequences.
- Install gems needed by redmine into system locations (so developer mode and not deployment mode)
/app/data/vendor/bundle. This way
bundle installinside plugin directory will install there.
- Loading also works fine because
GEM_HOMEis implicitly added into
- Redmine is installed into
@Neluser When you have the time, can you please try with the latest package? (You can ignore all my notes!) https://docs.cloudron.io/apps/redmine/#installing-plugins is pretty much the same.
In a plot twist worth of O. Henry novel... I went back to using
deploymentmode. There were two reasons:
Upstream plugin docs like the redmine up plugins recommend running
bundle installat the top level.
developmentmode means having to edit a plugin's
sourceline to make
I fixed the package to now have the bundle in
/run/redmine/vendorinstead. It's just copied over on startup, it greatly simplifies things.
Hi! The latest version of Redmine is working!
A clean install works as it should!
Updating Redmine from 1.6 to 1.9 also works. The only thing I had to manually delete the "Bundle" folder And after that everything worked as it should.
Thank you for your hard work!