#jenkins #bootstrap-4 #jenkins-pipeline #rspec-rails
#дженкинс #начальная загрузка-4 #дженкинс-трубопровод #rspec-рельсы
Вопрос:
Я пытаюсь создать файл Дженкинса, который:
- Создает образ проекта RoR из файла Dockerfile
- Проверяет, есть ли база данных, и если ее нет, она создает ее и переносит
- Выполняет некоторые тесты RSpec и удаляет контейнеры
- Окончательно удаляет рабочее пространство
Это мой файл Дженкинса:
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 gt;gt; @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
My directory layout is:
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";
Это два моих вопроса, касающихся проблемы:
- Есть какие-нибудь идеи о том, почему это происходит на Дженкинсе, а не локально?
- Лучше ли запускать rspec внутри контейнера или снаружи контейнера (перед созданием изображения)
Спасибо!!
Ответ №1:
Достаточно просто, я побежал yarn
перед rspec. Это позаботится об установке зависимостей начальной загрузки и другой ошибке, связанной с тем, что 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'