Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Infrastructure/Content/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ All breaking changes and new features in `eng/docker-tools` will be documented i

---

## 2026-08-10: Pre-ImageBuilder build customization

Build pipeline templates now accept `customPreImageBuilderBuildSteps`. These steps run after
ImageBuilder is available but before repository content is copied into the Linux ImageBuilder
image. Repositories can use the hook to stage files into Docker build contexts, such as shared
`eng/common` content required by Dockerfiles.

---

## 2026-06-11: Configurable per-registry referrer-lookup rate limit

- Issue: [#2141](https://github.com/dotnet/docker-tools/issues/2141)
Expand Down
16 changes: 16 additions & 0 deletions src/Infrastructure/Content/DEV-GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,22 @@ To force a rebuild regardless of cache state, set the `noCache` parameter to `tr

## Common Customization Patterns

### Pattern: Staging Files into Docker Build Contexts

Use `customPreImageBuilderBuildSteps` to modify repository content immediately before the
repository is copied into the Linux ImageBuilder image. For example, a repository can stage
shared `eng/common` files next to Dockerfiles whose build contexts cannot access the repository
root:

```yaml
customPreImageBuilderBuildSteps:
- powershell: ./eng/Stage-EngCommon.ps1
displayName: Stage eng/common in Docker Build Contexts
```

The steps run once per Linux build job, after ImageBuilder is available and before the
`Dockerfile.WithRepo` image is built.

### Pattern: Adding Build Arguments

Pass Dockerfile `ARG` values via ImageBuilder:
Expand Down
3 changes: 3 additions & 0 deletions src/Infrastructure/Content/templates/jobs/build-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ parameters:
# Custom steps that run after ImageBuilder is set up but before the build starts.
# Use for build-specific initialization (e.g., setting variables, additional setup).
customBuildInitSteps: []
# Custom steps that modify repository content before it is copied into the ImageBuilder image.
customPreImageBuilderBuildSteps: []
publishConfig: null
versionsRepoRef: ""
noCache: false
Expand Down Expand Up @@ -41,6 +43,7 @@ jobs:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
cleanupDocker: true
customInitSteps: ${{ parameters.customInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
- ${{ parameters.customBuildInitSteps }}
- template: /eng/docker-tools/templates/steps/reference-service-connections.yml@self
parameters:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ parameters:
# Custom steps that run after ImageBuilder is set up but before the build starts.
# Use for build-specific initialization (e.g., setting variables, additional setup).
customBuildInitSteps: []
# Custom steps that modify repository content before it is copied into the ImageBuilder image.
customPreImageBuilderBuildSteps: []
customTestInitSteps: []
sourceBuildPipelineRunId: ""
# When true, the Post-Build stage runs even if the Build stage failed (succeededOrFailed).
Expand Down Expand Up @@ -113,6 +115,7 @@ stages:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
customInitSteps: ${{ parameters.customInitSteps }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
noCache: ${{ parameters.noCache }}
publishConfig: ${{ parameters.publishConfig }}
internalProjectName: ${{ parameters.internalProjectName }}
Expand All @@ -128,6 +131,7 @@ stages:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
customInitSteps: ${{ parameters.customInitSteps }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
noCache: ${{ parameters.noCache }}
publishConfig: ${{ parameters.publishConfig }}
internalProjectName: ${{ parameters.internalProjectName }}
Expand All @@ -143,6 +147,7 @@ stages:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
customInitSteps: ${{ parameters.customInitSteps }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
noCache: ${{ parameters.noCache }}
publishConfig: ${{ parameters.publishConfig }}
internalProjectName: ${{ parameters.internalProjectName }}
Expand All @@ -158,6 +163,7 @@ stages:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
customInitSteps: ${{ parameters.customInitSteps }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
noCache: ${{ parameters.noCache }}
publishConfig: ${{ parameters.publishConfig }}
internalProjectName: ${{ parameters.internalProjectName }}
Expand All @@ -173,6 +179,7 @@ stages:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
customInitSteps: ${{ parameters.customInitSteps }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
noCache: ${{ parameters.noCache }}
publishConfig: ${{ parameters.publishConfig }}
internalProjectName: ${{ parameters.internalProjectName }}
Expand All @@ -188,6 +195,7 @@ stages:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
customInitSteps: ${{ parameters.customInitSteps }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
noCache: ${{ parameters.noCache }}
publishConfig: ${{ parameters.publishConfig }}
internalProjectName: ${{ parameters.internalProjectName }}
Expand All @@ -203,6 +211,7 @@ stages:
versionsRepoRef: ${{ parameters.versionsRepoRef }}
customInitSteps: ${{ parameters.customInitSteps }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
noCache: ${{ parameters.noCache }}
publishConfig: ${{ parameters.publishConfig }}
internalProjectName: ${{ parameters.internalProjectName }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ parameters:
linuxArmBuildJobTimeout: 60
windowsAmdBuildJobTimeout: 60
customBuildInitSteps: []
customPreImageBuilderBuildSteps: []

# Test parameters
testMatrixType: platformVersionedOs
Expand Down Expand Up @@ -58,6 +59,7 @@ stages:
testMatrixCustomBuildLegGroupArgs: ${{ parameters.testMatrixCustomBuildLegGroupArgs }}
customCopyBaseImagesInitSteps: ${{ parameters.customCopyBaseImagesInitSteps}}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
customInitSteps: ${{ parameters.customInitSteps }}
customTestInitSteps: ${{ parameters.customTestInitSteps }}
windowsAmdBuildJobTimeout: ${{ parameters.windowsAmdBuildJobTimeout }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ parameters:
linuxArmBuildJobTimeout: 60
windowsAmdBuildJobTimeout: 60
customBuildInitSteps: []
customPreImageBuilderBuildSteps: []

# Test parameters
testMatrixType: platformVersionedOs
Expand Down Expand Up @@ -60,6 +61,7 @@ stages:
linuxArmBuildJobTimeout: ${{ parameters.linuxArmBuildJobTimeout }}
windowsAmdBuildJobTimeout: ${{ parameters.windowsAmdBuildJobTimeout }}
customBuildInitSteps: ${{ parameters.customBuildInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
customInitSteps: ${{ parameters.customInitSteps }}
# Test
sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }}
Expand Down
6 changes: 6 additions & 0 deletions src/Infrastructure/Content/templates/steps/init-common.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ parameters:
type: stepList
default: []

# Custom steps that modify repository content before it is copied into the ImageBuilder image.
- name: customPreImageBuilderBuildSteps
type: stepList
default: []

# Registry and authentication configuration for publishing images.
# Contains server URLs, repo prefixes, subscriptions, and resource groups.
# When null, build/publish steps that require registry access will be skipped.
Expand Down Expand Up @@ -245,3 +250,4 @@ steps:
publishConfig: ${{ parameters.publishConfig }}
condition: ${{ parameters.condition }}
customInitSteps: ${{ parameters.customInitSteps }}
customPreImageBuilderBuildSteps: ${{ parameters.customPreImageBuilderBuildSteps }}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ parameters:
type: stepList
default: []

- name: customPreImageBuilderBuildSteps
type: stepList
default: []

steps:
# Custom ImageBuilder setup (e.g., bootstrap from source)
- ${{ if gt(length(parameters.customInitSteps), 0) }}:
Expand Down Expand Up @@ -67,6 +71,7 @@ steps:
# The withrepo image layers the checked-out repository into the ImageBuilder
# container at /repo, so ImageBuilder can access manifests and Dockerfiles
- ${{ if eq(parameters.dockerClientOS, 'linux') }}:
- ${{ parameters.customPreImageBuilderBuildSteps }}
- script: >-
docker build
-t $(imageNames.imageBuilder.withrepo)
Expand Down