Jenkinsfile - 运行 RSpec 在容器内时出错
Jenkinsfile - Error when running RSpec INSIDE the container
我正在尝试创建一个 Jenkins 文件:
- 从 Dockerfile 构建 RoR 项目的映像
- 检查是否有数据库,如果没有则创建并迁移
- 做一些 RSpec 测试并删除容器
- 最终删除工作区
这是我的 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";
这是我关于这个问题的两个问题:
关于为什么这发生在 Jenkins 而不是本地,有什么想法吗?
运行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'
我正在尝试创建一个 Jenkins 文件:
- 从 Dockerfile 构建 RoR 项目的映像
- 检查是否有数据库,如果没有则创建并迁移
- 做一些 RSpec 测试并删除容器
- 最终删除工作区
这是我的 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";
这是我关于这个问题的两个问题:
关于为什么这发生在 Jenkins 而不是本地,有什么想法吗?
运行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'