首页 > 解决方案 > Azure Pipelines 中的 Docker 微服务 monorepo CI/CD

问题描述

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

Common
 /src
SvcA
 /src
 Dockerfile
SvcB
 /src
 Dockerfile

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

标签: dockerazure-devopscontinuous-integrationazure-pipelinesmonorepo

解决方案


这里的基本问题是存储与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 使用类似的技术。然后,只有在该特定项目存在已知差异的情况下,才会为每个组件项目运行构建。


推荐阅读