CircleCI 是一个分布式的跑测试的云产品,本来一个小时的测试,它拆成 80 份,几分钟就可以跑完。此外它和 Ruby on Rails 的集成非常方便,官方还提供了实例代码。只要在代码的根目录,添加一个 .circleci/config.yml
文件就可以了。每次有人创建 PR,会自动触发 CI。
但是我最近遇到了一个问题,我的新项目是前后端分离的,前端一个文件夹,后端一个文件夹。
有没有人设置过 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}
到对应目录,再跑测试?
- 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。
这是 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