Github monorepo作为AWS CodePipeline的源代码

时间:2017-10-09 22:36:51

标签: aws-codepipeline aws-codebuild

我们使用monorepo方法将源存储在github中。

目前是否可以在提交特定子文件夹时触发CodePipeline。

这是TeamCity目前可以通过在源存储库上设置过滤器来实现的,但我没有看到CodePipeline的这个例子。

5 个答案:

答案 0 :(得分:1)

我们正致力于解决这个问题。简而言之:稍作处理就可以实现。您可以将GitHub Webhook设置为单个AWS CodeBuild项目的源。该项目允许您为推送到该Webhook的事件配置过滤器(文件路径)。此外,您添加了一个S3存储桶,并将过滤事件引用的代码推送到该存储桶。可以将存储桶作为您的CodePipeline的源阶段。

我们已经在博客文章https://blog.codecentric.de/en/2019/05/codebuild-trigger-pipeline/

中记录了我们的解决方案

答案 1 :(得分:1)

我们写了一篇有关部署GitHub MonoRepo using CodeBuild的变通方法的文章,其中包括an example repository

答案 2 :(得分:1)

通常CodePipeline监视git repo,然后下载源并触发CodeBuild。

我通过让CodeBuild监视git存储库来解决此问题,因为这使您可以将更改限制在存储库中的子目录中。构建完成后,会将工件上传到S3,然后您就可以在S3工件上传上让CodePipeline触发并继续该过程。

这有点杂乱无章,但如果要在管道中提供的第一步是单个CodeBuild,则应该很容易做到。

答案 3 :(得分:0)

看起来你回答了自己的问题;)。答案还没有,但作为一种解决方法,您可以解析已更改文件的列表,并从中导出已更改的子文件夹列表:https://forums.aws.amazon.com/thread.jspa?messageID=811027&#811027/

答案 4 :(得分:0)

我尝试按照其他答案中的建议使用 CodeBuild,但结果比我的设置更复杂。

我最终得到了一个使用 GitHub Actions 和每个堆栈的源分支的解决方案。

1) 我为每个堆栈创建了一个分支

  • pipelines/api
  • pipelines/data

2) 然后我为每个堆栈创建了一个 GitHub 操作

这些操作仅在主推送时触发,并根据更改的文件进行过滤。

如果匹配的 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

3) 然后,我相应地更改了每个 CodePipeline 的源分支

// 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"
});

此设置的一些好处:

  • 如果我想部署所有堆栈,我可以绕过堆栈操作直接推送到每个分支
  • Very powerful filtering options
  • 易于测试和更改。 CodeBuild/CodePipeline 测试周期可能需要一些时间
  • 最少的 CodePipeline 更改