【问题标题】:Github monorepo as source for AWS CodePipelineGithub monorepo 作为 AWS CodePipeline 的源
【发布时间】:2021-01-08 08:16:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: aws-codepipeline aws-codebuild


    【解决方案1】:

    我们正是在解决这个问题。简而言之:可以通过一些工作来解决。您可以将 GitHub Webhook 设置为单个 AWS CodeBuild 项目的源。该项目允许您为推送到该 Webhook 的事件配置过滤器(文件路径)。此外,您添加一个 S3 存储桶并将过滤事件引用的代码推送到该存储桶。存储桶可以作为 CodePipeline 的源阶段包含在内。

    我们在博客文章中记录了我们的解决方案:https://blog.codecentric.de/en/2019/05/codebuild-trigger-pipeline/

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这如何与 CodePipeline 一起工作,因为问题是 CodePipeline 触发构建而不是 CodeBuild?
        【解决方案4】:

        通常 CodePipeline 会监控 git repo,然后下载源代码并触发 CodeBuild。

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

        这有点不整洁,但提供管道中的第一步是单个 CodeBuild,那么它应该很容易做到。

        【讨论】:

          【解决方案5】:

          我尝试按照其他答案中的建议使用 CodeBuild,但它的设置比我预期的要复杂。

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

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

          • pipelines/api
          • pipelines/data

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

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

          如果 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 更改

          【讨论】:

            猜你喜欢
            • 2023-03-19
            • 2018-11-16
            • 2019-04-20
            • 2017-05-26
            • 2021-01-21
            • 2016-02-23
            • 2020-10-18
            • 1970-01-01
            • 2019-03-02
            相关资源
            最近更新 更多