【问题标题】:Docker microservice monorepo CI/CD in Azure PipelinesAzure Pipelines 中的 Docker 微服务 monorepo CI/CD
【发布时间】:2021-11-04 21:43:27
【问题描述】:

如何为由单独的微服务(.NET Core 后端 API)组成的 MonoRepo 构建用于 CI/CD 的 Azure Pipelines,每个微服务(.NET Core 后端 API)都有自己的 Dockerfile,所有这些都使用公共库?当前文件夹结构为:

Common
 /src
SvcA
 /src
 Dockerfile
SvcB
 /src
 Dockerfile

我想为每个项目构建一个 Docker 容器(并推送到 docker 注册表,然后部署到 Kubernetes),成功将请求请求到主分支。如果它只在该路径内发生变化时构建一个微服务,那将是理想的。

【问题讨论】:

    标签: docker azure-devops continuous-integration azure-pipelines monorepo


    【解决方案1】:

    这里的基本问题是在 mono-repo 中存储与每个项目相关的先前构建的哈希(可能是 git commit)。最基本的方法是做一个单独的提交来存储这些信息,然后在上面做 git diff 。但是,如果存储库经常更新,这可能会变得非常混乱。

    我们的解决方案是使用我们正在开发的外部工具——Reliza Hub——本质上,我们在 monorepo 中记录每个项目的每个构建元数据。然后在每个构建中,我们检索每个项目的最后一个已知版本,并在当前提交和项目的最后一个已知提交之间执行 git diff 命令。如果有差异,我们会重建。

    以下是在 GitHub Actions 下的 Dockerfile 存储库上运行的此逻辑示例:https://github.com/relizaio/dockerfile-collection/blob/master/.github/workflows/dockerimage.yml

    特别是,这个 yaml 块可以解决问题:

            dir=maven-postgresql
            dobuild=false
            last_commit=$(docker run --rm relizaio/reliza-cli getlatestrelease -i ${{ secrets.RELIZA_MAVEN_POSTGRESQL_API_ID }} -k ${{ secrets.RELIZA_MAVEN_POSTGRESQL_API_KEY }} --branch $GITHUB_REF | jq -r ".sourceCodeEntryDetails.commit")
            if [ ! -z "$last_commit" ]
            then
              echo -n "--commits $(git log $last_commit..$GITHUB_SHA --date=iso-strict --pretty='%H|||%ad|||%s' -- $dir | base64 -w 0) " > commit_list
              difflines=$(git diff $last_commit..$GITHUB_SHA $dir | wc -l)
              if [ "$difflines" != "0" ]
              then
                dobuild=true
              fi
            else
              dobuild=true
            fi
            if [ "$dobuild" == "true" ]
                # actual build logic goes here
    

    现在,对于 Azure DevOps,我没有完整的 monorepo 示例,但通常可以在此处找到 Azure DevOps 的单个项目 repo 的示例实现:https://github.com/relizaio/reliza-hub-integrations/blob/master/AzureDevOps/azureDevOpsBuildPush.yaml

    然后可以根据 Azure Devops 下的 GitHub Actions 使用类似的技术。然后,只有在该特定项目存在已知差异时,才会为每个组件项目运行构建。

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多