如何在单个存储库中使用多个 Travis CI 文件?

How to use multiple Travis CI files inside a single repository?

我有一个在前端使用 Angular 并在后端使用 Spring 启动的项目。

目前,前端和后端位于两个独立的存储库中,我在其中准备了特定的 travis.yaml 文件,例如 Spring 启动应用程序:

language: java
services: docker
addons:
  sonarcloud:
    organization: "mixeway" # the key of the org you chose at step #3
    token:
      secure: $SONAR_TOKEN


script:
  - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar -Dmaven.test.skip=true -Dsonar.projectKey=Mixeway_MixewayBackend
  - mvn package -Dmaven.test.skip=true
  - docker build --build-arg JAR_FILE=target/mixeway-0.9.jar -t mixeway/backend:0.9 .
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
  - docker push mixeway/backend:0.9

Angular travis.yaml 非常相似(除了 Angular 应用程序的构建时间要长几倍)。我想将两个存储库合并为一个,将后端和前端的代码放在一个存储库中。我想要两个独立的管道,因此后端代码的更改不会执行用于构建前端图像的管道。

这可能吗?如果是,怎么做?

在我自己遇到与 travis CI 完全相同的问题并且没有找到令人满意的解决方案后,我发现使用新的 github actions.

可以轻松解决这个问题

基本上,您为存储库中的每个项目创建一个工作流文件(类似于 .travis.yml),它是自包含的并且只负责构建它所属的项目。

这是基本的 monorepo 结构:

.
├── .github
│   └── workflows
│       ├── project1.yml
│       ├── project2.yml
├── project1
│   └── build.gradle
├── project2
│   └── build.gradle

并且在工作流文件本身中,比方说 project1.yml,您可以指定哪个路径应该触发该项目的构建:

on:
  push:
    paths:
      - 'project1/**'

此建议不使用多个 Travis CI 文件(我也找不到方法),但如果阅读本文的人真的想使用 Travis,那么这可能会满足您的需求。

Travis CI 让一个 list separate jobs 在一个 .travis.yml 配置中。这些作业 运行 并行进行。在底部添加一个 script: 以检查是否进行了任何更改,我相信这符合您的要求。

# .travis.yml at the repo root

language: generic

jobs:
  include:
    - name: Detention Service
    language: node_js
    node_js: 12
    cache: npm
    env: TARGET=service
  - name: Client - Ruby RSpec
    language: ruby
    rvm: 2.6
    cache: bundler
    env: TARGET=clients/ruby/rspec

script: if .travis/build.sh $TRAVIS_COMMIT_RANGE $TARGET; then echo "Building '$TARGET' ..." && cd $TARGET && scripts/ci.sh; else echo "No changes detected in '$TARGET'; skipping build."; fi

Works great 对我来说!请注意,此方法需要在您的存储库的根目录中使用以下 .travis/build.sh 脚本:

# .travis/build.sh

#!/usr/bin/env bash

if [[ "x" == "x" ]]; then
  echo "Commit range cannot be empty"
  exit 1
fi

if [[ "x" == "x" ]]; then
  echo "Change path cannot be empty"
  exit 1
fi

git diff --name-only  | sort -u | uniq | grep  > /dev/null

和每个 TARGET 目录中的 scripts/ci.sh,例如:

# service/scripts/ci.sh

#!/usr/bin/env bash

set -e

npm ci
npm run test

我喜欢 naming each job makes investigating builds 简单一点:

归功于 Github 用户 arnaskro