【问题标题】:How to use multiple Travis CI files inside a single repository?如何在单个存储库中使用多个 Travis CI 文件?
【发布时间】:2021-04-22 16:55:32
【问题描述】:

我有一个项目在前端使用 Angular,在后端使用 Spring Boot。

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

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 应用程序的构建时间要长几倍)。我想将两个存储库合并为一个,后端和前端的代码在一个存储库中。我希望有两个独立的管道,因此后端代码的更改不会执行用于构建前端图像的管道。

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

【问题讨论】:

    标签: continuous-integration travis-ci monorepo


    【解决方案1】:

    在遇到与 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/**'
    

    【讨论】:

      【解决方案2】:

      此建议不使用多个 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$1" == "x" ]]; then
        echo "Commit range cannot be empty"
        exit 1
      fi
      
      if [[ "x$2" == "x" ]]; then
        echo "Change path cannot be empty"
        exit 1
      fi
      
      git diff --name-only $1 | sort -u | uniq | grep $2 > /dev/null
      

      每个TARGET目录中都有一个scripts/ci.sh,例如:

      # service/scripts/ci.sh
      
      #!/usr/bin/env bash
      
      set -e
      
      npm ci
      npm run test
      

      我喜欢 naming each job 让调查 builds 更容易一些:

      感谢 Github 用户 arnaskro

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 2016-01-04
        相关资源
        最近更新 更多