CircleCI 是一个分布式的跑测试的云产品,本来一个小时的测试,它拆成 80 份,几分钟就可以跑完。此外它和 Ruby on Rails 的集成非常方便,官方还提供了实例代码。只要在代码的根目录,添加一个 .circleci/config.yml 文件就可以了。每次有人创建 PR,会自动触发 CI。
.circleci/config.yml
但是我最近遇到了一个问题,我的新项目是前后端分离的,前端一个文件夹,后端一个文件夹。
有没有人设置过 CircleCI 去跑两个文件夹中的测试吗?我折腾了半天,还是没搞定。
@lanzhiheng 大佬,我看你还给官方 demo 提供过代码,你折腾过前后端分离的项目的 CircleCI 的配置文件吗?
https://circleci.com/docs/2.0/configuration-reference/#steps
试试 working_directory 参数,看起来和 Github Actions 的格式挺像的。
在尝试 Monorepo 是吗? 我只在用 Gitlab CI 的,看起来是这样的:
/.gitlab-ci.yml
include: 'react/.gitlab-ci.yml'
/react/.gitlab-ci.yml
.react: before_script: - cd react react-build: extends: .react stage: build only: - react-prod - react-stage cache: { policy: pull } environment: { name: $CI_COMMIT_REF_SLUG } artifacts: name: react-build-$CI_COMMIT_REF_SLUG paths: [react/build] script: [pnpm build]
时间有点久远。配置我已经不太记得了。我现在是用 github runner。我记得 steps 里面是可以自己配置 shell 脚本的。我的思路是有没有可能配置两个workflows,每个workflows 跑测试之前都先通过 cd ${directory} 到对应目录,再跑测试?
workflows
cd ${directory}
- checkout - run: cd frontend - run test - run: yarn test
- checkout - run: cd backend - run test - run: rails test
大概这样。
PS:我还是建议前后端分离的项目,还是把仓库分离了吧。不然后面可能很多耦合的东西相互影响。 比如后端合并个代码都要跑前端的 CI 就。。。。
直接跑脚本应该可以。可以重新开一个 jobs,然后并行测试。
类似这样
jobs: front_test: steps: - run: name: front test command: #{ your test command }
花了 1 天的时间,折腾了各种各样的参数,CircleCI 都跑不起来,实在是太沮丧了。幸运的是,github actions 对这种情况支持的特别好,我只需要加一个参数就搞定了。
这个子服务代码量很小,3 分钟就可以跑完测试,我就先不用 CircleCI 了,转投 Github Actions。
这是我用的范例文件,如果将来有人也有类似的需求“在一个子文件夹中跑测试”,可以试试 Github Actions。
https://github.com/xiaoronglv/rails-github-actions-example/blob/master/.github/workflows/rails.yml#L10
这是 Github Actions 的配置文件
name: "Backend Test" on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest defaults: run: working-directory: ./backend env: RAILS_ENV: test DATABASE_NAME: connector_test DATABASE_USER: postgres DATABASE_PASSWORD: password services: postgres: image: postgres:11 env: POSTGRES_USER: postgres POSTGRES_DB: connector_test POSTGRES_PASSWORD: password ports: ["5432:5432"] options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - name: Checkout code uses: actions/checkout@v2 - name: Install dependencies run: | sudo apt-get -yqq install libpq-dev build-essential libcurl4-openssl-dev - name: Install Ruby and gems uses: ruby/setup-ruby@v1 with: rubygems: latest working-directory: ./backend ruby-version: 2.7.3 cache-version: 3 bundler-cache: true - name: Set up database schema run: bundle exec rake db:schema:load - name: Run tests run: bundle exec rspec