我具有以下git repo结构:
.
├── docker
│ ├── Dockerfile
│ └── requirements.txt
└── software
├── app
│ └── app.py
└── Dockerfile
docker
文件夹负责创建将由我的应用程序使用的docker映像。
然后,如果我更改docker
文件夹下的文件,我想重新创建base image
,然后使用最后创建的app image
创建新的base image
。 / p>
但是,如果我只更改应用程序,则在software
文件夹下,我只想触发该应用程序映像的阶段。
在我的.gitlab-ci.yml
文件下面:
image: docker:latest
services:
- docker:dind
stages:
- buildDockerImage
- buildAppImage
build docker image:
stage: buildDockerImage
script:
- docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
- docker build --target final --build-arg docker_image_version=$CI_COMMIT_SHORT_SHA -t $DOCKER_IMAGE_NAME docker
- docker tag $DOCKER_IMAGE_NAME $CI_REGISTRY/xx/$APP_IMAGE_NAME:base
- docker push $CI_REGISTRY/xx/$APP_IMAGE_NAME
only:
changes:
- docker/**/*
build app image:
stage: buildAppImage
script:
- docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
- docker build --build-arg app_image_version=$CI_COMMIT_SHORT_SHA -t $APP_IMAGE_NAME software
- docker tag $APP_IMAGE_NAME $CI_REGISTRY/xx/$APP_IMAGE_NAME:$CI_COMMIT_SHORT_SHA
- docker push $CI_REGISTRY/xx/$APP_IMAGE_NAME
except:
changes:
- docker/**/*
only / except : changes
可以很好地识别更改的位置,但是如果我更改docker
文件夹,则不会在两个阶段都创建管道。它仅创建buildDockerImage
。
如果我删除only / except : changes
配置,则管道将按预期工作。
有可能实现我所需要的?我的意思是,如果仅更改应用程序,则不想运行buildDockerImage
,但是如果我更改了base image
,则需要同时运行buildDockerImage
和buildAppImage
在管道中。
答案 0 :(得分:0)
因此,如果我理解正确的话,您想:
buildDockerImage
位置更改时才构建docker/**/*
,因此您当前在此阶段的Yaml很好。构建buildAppImage
总是从<{1}}阶段仅删除子句
仅适用于对docker位置的更改,请仅将和替换为2个位置:
buildAppImage