Home > front end >  Bundle install really slow on Jenkins Pipeline (AWS EC2 Instance)
Bundle install really slow on Jenkins Pipeline (AWS EC2 Instance)

Time:11-23

I am running Jenkins on AWS EC2 Linux Instance and I am trying to bundle install the gems needed for my rails repo on GitHub.

It is a new project that I created for testing but the bundle takes hours, Jenkins freezes and I need to restart the server and Jenkins and it never finishes installing the gems in the end.

This is my code:

    pipeline {
    agent { docker { image 'ruby:2.6.6' } }
    stages {
        stage('Fetching Git') {

            steps {
                git credentialsId: 'user-key',
                    url: '[email protected]:user/jenkins_project.git'
            }
        }
        stage('Build') {

            steps {
                sh 'gem install bundler'
                sh 'bundle install --jobs 4'
                sh 'RAILS_ENV=test rake db:migrate'
            }
        }
        stage('Test') {

            steps {
                sh 'RAILS_ENV=test bundle exec rspec --format RspecJunitFormatter --out result_spec.xml'
            }
        }
    }
}

What I tried doing is:

  1. Using --jobs when bundle install (it doesn't seem to work)

  2. Using http instead of https on the Gemfile when on

    source 'http://rubygems.org'

I know it is unsafe. And this doesn't seem to work either. 3. Also tried this:

echo 'export MAKE="make -j$(nproc)"' >> $home/.bash_profile
time MAKE="make --jobs 8" bundle install

From here (https://build.betterup.com/one-weird-trick-that-will-speed-up-your-bundle-install/). But it doesn't work either.

Any ideas on why is this happening and how can I solve it greatly appreciated!

CodePudding user response:

Solved this by:

  1. Creating a master server with Java & Jenkins
  2. Creating a slave server (called 'linux_slave') with Java & Git & Docker

The code would be something like this:

pipeline {
    agent {
        docker {
            image 'ruby:2.6.6'
            label 'linux_slave'
        }
    }
    stages {
        stage('Fetching Git') {
            
            steps {
                git credentialsId: 'user-key',
                    url: '[email protected]:user/jenkins_project.git'
            }
        }
        stage('Build') {
            steps {
                sh 'gem install bundler:2.0.1'
                sh 'bundle install'
                sh 'RAILS_ENV=test rake db:migrate'
            }
        }
    }
}

Hope it helps someone in need sometime!

CodePudding user response:

add this as first line before gem install as each installed package will be less in size because no documenation is been downloaded with it

'echo''gem: --no-document'' > ~/.gemrc'

I have used this for Travis and it helped a lot I am not fully sure for Jenkins syntax but try the following one

        stage('Build') {

        steps {
            sh 'echo''gem: --no-document'' > ~/.gemrc'
            sh 'gem install bundler'
            sh 'bundle install --jobs 4'
            sh 'RAILS_ENV=test rake db:migrate'
        }
    }
  • Related