【发布时间】:2021-01-08 08:16:07
【问题描述】:
我们使用 monorepo 方法将源代码存储在 github 中。
目前是否可以仅在提交到特定子文件夹时触发 CodePipeline。
TeamCity 目前可以通过在源存储库上设置过滤器来实现这一点,但我在 CodePipeline 中没有看到这样的示例。
【问题讨论】:
标签: aws-codepipeline aws-codebuild
我们使用 monorepo 方法将源代码存储在 github 中。
目前是否可以仅在提交到特定子文件夹时触发 CodePipeline。
TeamCity 目前可以通过在源存储库上设置过滤器来实现这一点,但我在 CodePipeline 中没有看到这样的示例。
【问题讨论】:
标签: aws-codepipeline aws-codebuild
我们正是在解决这个问题。简而言之:可以通过一些工作来解决。您可以将 GitHub Webhook 设置为单个 AWS CodeBuild 项目的源。该项目允许您为推送到该 Webhook 的事件配置过滤器(文件路径)。此外,您添加一个 S3 存储桶并将过滤事件引用的代码推送到该存储桶。存储桶可以作为 CodePipeline 的源阶段包含在内。
我们在博客文章中记录了我们的解决方案:https://blog.codecentric.de/en/2019/05/codebuild-trigger-pipeline/
【讨论】:
看起来您回答了自己的问题;)。答案还没有,但作为一种解决方法,您可以解析更改的文件列表并从中派生更改的子文件夹列表:https://forums.aws.amazon.com/thread.jspa?messageID=811027󆀓/。
【讨论】:
我们写了一篇关于部署GitHub MonoRepo using CodeBuild 的解决方法的文章,其中包括an example repository。
【讨论】:
通常 CodePipeline 会监控 git repo,然后下载源代码并触发 CodeBuild。
我通过让 CodeBuild 监控 git 存储库来解决此问题,因为这允许您将更改限制在存储库中的子目录中。构建完成后,它将工件上传到 S3,然后您可以在 S3 工件上传时触发 CodePipeline 并继续该过程。
这有点不整洁,但提供管道中的第一步是单个 CodeBuild,那么它应该很容易做到。
【讨论】:
我尝试按照其他答案中的建议使用 CodeBuild,但它的设置比我预期的要复杂。
我最终得到了一个使用 GitHub Actions 和每个堆栈的源分支的解决方案。
pipelines/apipipelines/data这些操作仅在主推送时触发,并根据更改的文件进行过滤。
如果 api 匹配更改然后合并到 pipelines/api,对于数据堆栈和 pipelines/data 类似
# .github/workflows/sync-pipelines-api-yaml
name: Sync pipelines/api
on:
push:
branches:
- main
paths:
- "package-lock.json"
- "lib/api/**"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
run: |
git switch -c main
git remote set-url origin "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY"
git push origin main:pipelines/api --force
# .github/workflows/sync-pipelines-data-yaml
name: Sync pipelines/data
on:
push:
branches:
- main
paths:
- "package-lock.json"
- "lib/data/**"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
run: |
git switch -c main
git remote set-url origin "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY"
git push origin main:pipelines/data --force
// lib/api/stack.ts
const sourceAction = new actions.GitHubSourceAction({
owner,
repo,
branch: "pipelines/api"
});
// lib/data/stack.ts
const sourceAction = new actions.GitHubSourceAction({
owner,
repo,
branch: "pipelines/data"
});
这种设置的一些好处:
【讨论】: