测试 请问怎么让 CircleCI 跑子目录的测试代码?

xiaoronglv for Workstream · 2022年03月10日 · 最后由 xiaoronglv 回复于 2022年03月11日 · 504 次阅读

CircleCI 是一个分布式的跑测试的云产品,本来一个小时的测试,它拆成 80 份,几分钟就可以跑完。此外它和 Ruby on Rails 的集成非常方便,官方还提供了实例代码。只要在代码的根目录,添加一个 .circleci/config.yml 文件就可以了。每次有人创建 PR,会自动触发 CI。

但是我最近遇到了一个问题,我的新项目是前后端分离的,前端一个文件夹,后端一个文件夹。

  • 后端是 RoR,用来做 API
  • 前端 react

有没有人设置过 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]
xiaoronglv 回复

时间有点久远。配置我已经不太记得了。我现在是用 github runner。我记得 steps 里面是可以自己配置 shell 脚本的。我的思路是有没有可能配置两个workflows,每个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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号