Jenkinsfile - 运行 RSpec 在容器内时出错

Jenkinsfile - Error when running RSpec INSIDE the container

我正在尝试创建一个 Jenkins 文件:

  1. 从 Dockerfile 构建 RoR 项目的映像
  2. 检查是否有数据库,如果没有则创建并迁移
  3. 做一些 RSpec 测试并删除容器
  4. 最终删除工作区

这是我的 Jenkins 文件:

pipeline {
    agent { label 'linux_slave' }

    stages {
        stage('Build') {
            steps {
                sh 'docker-compose build'
            }
        }
        stage('DB') {
            steps {
                script {
                    DB_EXISTS = sh (
                        script: 'psql postgres -tAc "SELECT 1 FROM pg_database WHERE datname=\'Jenkins_project_test\'"',
                        returnStdout: true
                    ).trim()
                    echo "Equal 1 if DB exists: ${DB_EXISTS}"
                    if(DB_EXISTS == "1") {
                        echo 'Database already exists'
                    } else {
                        sh 'docker-compose run web rake db:create'
                        sh 'docker-compose run web rake db:migrate'
                    }
                }
            }
        }
        stage('Test') {
            steps {
                sh 'docker-compose run --rm -e "RAILS_ENV=test" web bundle exec rspec'
                sh 'docker-compose down'
            }
        }
    } 
    post {
        always {
            junit(
                allowEmptyResults: true,
                testResults: '**/test-reports/*.xml'
            )
            cleanWs()       
        }
    }
}

我在步骤 3 中遇到问题。我收到以下错误:

+ docker-compose run --rm -e RAILS_ENV=test web bundle exec rspec
Creating test_rails_app_web_run ... 
Creating test_rails_app_web_run ... done
Users
  GET /new
    responds successfully (FAILED - 1)

Failures:

  1) Users GET /new responds successfully
     Failure/Error: @import "bootstrap/scss/bootstrap";

     ActionView::Template::Error:
       Error: File to import not found or unreadable: bootstrap/scss/bootstrap.
               on line 7:1 of app/assets/stylesheets/application.scss
       >> @import "bootstrap/scss/bootstrap";

          ^
     # ./app/assets/stylesheets/application.scss:7

但是,如果我尝试 运行 它在本地执行相同的步骤,则没有问题:

➜  Jenkins_project git:(master) docker-compose run --rm -e RAILS_ENV=test web bundle exec rspec
Creating network "jenkins_project_default" with the default driver
Creating jenkins_project_db_1 ... done
Creating jenkins_project_web_run ... done

Users
  GET /new
    responds successfully

Finished in 11.88 seconds (files took 23.43 seconds to load)
1 example, 0 failures

我的目录布局是:

app
├── assets
│   ├── config
│   ├── images
│   └── stylesheets
        ├── components
        │   ├── _alert.scss
        │   ├── _avatar.scss
        │   ├── _index.scss
        │   └── _navbar.scss
        ├── config
        │   ├── _bootstrap_variables.scss
        │   ├── _colors.scss
        │   └── _fonts.scss      
        ├── pages
        │   ├── _home.scss
        │   └── _index.scss  
        └── application.scss

application.scss如下:

// Graphical variables
@import "config/fonts";
@import "config/colors";
@import "config/bootstrap_variables";

// External libraries
@import "bootstrap/scss/bootstrap";
@import "font-awesome-sprockets";
@import "font-awesome";

// Your CSS partials
@import "components/index";
@import "pages/index";

这是我关于这个问题的两个问题:

  1. 关于为什么这发生在 Jenkins 而不是本地,有什么想法吗?

  2. 运行rspec在容器里面好还是在容器外面好(在构建镜像之前)

谢谢!!

很简单,我在rspec之前运行yarn。这将负责安装 bootstrap 依赖项和另一个与未编译 webpack 相关的错误:

sh 'docker-compose run -e "RAILS_ENV=test" web rake db:create db:migrate'
sh 'docker-compose run -e "RAILS_ENV=test" web yarn install --ignore-engines'
sh 'docker-compose run -e "RAILS_ENV=test" web bundle exec rspec'