如何在单个存储库中使用多个 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。
我有一个在前端使用 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。