docker - 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),成功将请求请求到主分支。如果它只在该路径中发生变化时才构建微服务,那将是理想的。
解决方案
这里的基本问题是存储与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 使用类似的技术。然后,只有在该特定项目存在已知差异的情况下,才会为每个组件项目运行构建。
推荐阅读
- python - TensorFlow 模型训练——.ipynb 有效,.py 崩溃
- kotlin - Kotlin 自定义计时器每 25hz 滴答一次
- mongodb - 使用所有集合的 mongodump 进行 MongoDB 增量备份
- angular - 如何从投影内容中获取父组件?
- r - 将数据框中的值与其他列中的其他出现匹配
- javascript - 在javascript字符串中连接laravel刀片变量
- aws-glue-spark - 使用 AWS Glue 在 AWS S3 中动态创建文件夹
- react-native - 如何为 ReactNative SectionList 项目可见性添加偏移量
- mysql - Flutter/Dart 仅提取日期和时间?
- ansible - Ansible-我如何从剧本中的块中传递 Jinja2 模板中的所有变量