Skip to content

Commit 3f5fb34

Browse files
committed
build/push manifest
1 parent 6229b93 commit 3f5fb34

File tree

6 files changed

+165
-26
lines changed

6 files changed

+165
-26
lines changed

.github/workflows/build-deps.yml

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,85 @@ jobs:
8585
with:
8686
username: ${{ secrets.DOCKER_USERNAME }}
8787
password: ${{ secrets.DOCKER_PASSWORD }}
88-
89-
- name: '[Build Docker images]'
88+
- name: '[Build Docker images] DockerHub'
9089
shell: pwsh
9190
run: |
9291
dotnet run/build.dll `
9392
--target=DockerBuildDeps --arch=${{ matrix.arch }} `
9493
--dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub `
9594
--push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic
96-
9795
- name: Login to GitHub Container Registry
9896
if: success() && env.PUSH_IMAGES == 'true'
9997
uses: docker/login-action@v3
10098
with:
10199
registry: ghcr.io
102100
username: ${{ github.repository_owner }}
103101
password: ${{ secrets.DOCKER_GITHUB_TOKEN }}
104-
- name: '[Build Docker images]'
102+
- name: '[Build Docker images] GitHub'
105103
shell: pwsh
106104
run: |
107105
dotnet run/build.dll `
108106
--target=DockerBuildDeps --arch=${{ matrix.arch }} `
109107
--dotnet_distro=${{ matrix.distro }} --docker_registry=github `
110108
--push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic
109+
110+
build_deps_manifests:
111+
name: Build Deps Manifests
112+
needs: [ prepare, build_deps ]
113+
env:
114+
PUSH_IMAGES: ${{github.event_name != 'pull_request' && github.repository_owner == 'GitTools'}}
115+
runs-on: ubuntu-24.04
116+
strategy:
117+
matrix:
118+
distro: ${{ fromJson(needs.prepare.outputs.dockerDistros) }}
119+
fail-fast: false
120+
steps:
121+
- name: Checkout
122+
uses: actions/checkout@v4
123+
- name: Use cached cake frosting
124+
id: cache-cake
125+
uses: actions/cache@v4
126+
with:
127+
path: run
128+
key: run-${{ runner.os }}-${{ hashFiles('./build/**') }}
129+
- name: Setup .NET SDK
130+
uses: actions/setup-dotnet@v4
131+
with:
132+
global-json-file: build/global.json
133+
- name: Set up Docker
134+
uses: docker/setup-docker-action@v4
135+
with:
136+
daemon-config: '{ "features": { "containerd-snapshotter": true } }'
137+
- name: Setup Docker Buildx
138+
uses: docker/setup-buildx-action@v3
139+
with:
140+
version: 'latest'
141+
driver-opts: 'image=moby/buildkit:buildx-stable-1'
142+
install: true
143+
- name: Login to DockerHub
144+
if: success() && env.PUSH_IMAGES == 'true'
145+
uses: docker/login-action@v3
146+
with:
147+
username: ${{ secrets.DOCKER_USERNAME }}
148+
password: ${{ secrets.DOCKER_PASSWORD }}
149+
- name: '[Build Docker manifests] DockerHub'
150+
shell: pwsh
151+
run: |
152+
dotnet run/build.dll `
153+
--target=DockerBuildDepsManifest `
154+
--dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub `
155+
--push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic
156+
- name: Login to GitHub Container Registry
157+
if: success() && env.PUSH_IMAGES == 'true'
158+
uses: docker/login-action@v3
159+
with:
160+
registry: ghcr.io
161+
username: ${{ github.repository_owner }}
162+
password: ${{ secrets.DOCKER_GITHUB_TOKEN }}
163+
- name: '[Build Docker manifests] GitHub'
164+
shell: pwsh
165+
run: |
166+
dotnet run/build.dll `
167+
--target=DockerBuildDepsManifest `
168+
--dotnet_distro=${{ matrix.distro }} --docker_registry=github `
169+
--push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
namespace Build;
2+
using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings;
3+
4+
public abstract class BaseDockerBuildManifest : FrostingTask<BuildContext>
5+
{
6+
protected const string Prefix = "org.opencontainers.image";
7+
8+
private static readonly string[] Annotations =
9+
[
10+
$"{Prefix}.authors=GitTools Maintainers",
11+
$"{Prefix}.vendor=GitTools",
12+
$"{Prefix}.licenses=MIT",
13+
$"{Prefix}.source=https://github.com/GitTools/build-images.git",
14+
$"{Prefix}.created={DateTime.UtcNow:O}",
15+
];
16+
17+
protected void DockerManifest(BuildContext context, DockerDepsImage dockerImage)
18+
{
19+
var manifestTags = dockerImage.GetDockerTags(context.DockerRegistry);
20+
foreach (var tag in manifestTags)
21+
{
22+
var amd64Tag = $"{tag}-{Architecture.Amd64.ToSuffix()}";
23+
var arm64Tag = $"{tag}-{Architecture.Arm64.ToSuffix()}";
24+
25+
var settings = GetManifestSettings(dockerImage, tag);
26+
context.DockerBuildXImageToolsCreate(settings, [amd64Tag, arm64Tag]);
27+
}
28+
}
29+
30+
protected virtual DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag)
31+
{
32+
var settings = new DockerBuildXImageToolsCreateSettings
33+
{
34+
Tag = [tag],
35+
Annotation =
36+
[
37+
.. Annotations.Select(a => "index:" + a).ToArray(),
38+
]
39+
};
40+
return settings;
41+
}
42+
}

build/build/Tasks/DockerBuildDeps.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using DockerBuildXBuildSettings = Build.Cake.Docker.DockerBuildXBuildSettings;
2-
using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings;
32

43
namespace Build;
54

@@ -14,16 +13,6 @@ public override void Run(BuildContext context)
1413
{
1514
DockerImage(context, dockerImage);
1615
}
17-
18-
if (!context.PushImages)
19-
return;
20-
21-
// build/push manifests
22-
// foreach (var group in context.DepsImages.GroupBy(x => new { x.Distro }))
23-
// {
24-
// var dockerImage = group.First();
25-
// DockerManifest(context, dockerImage);
26-
// }
2716
}
2817

2918
protected override DirectoryPath GetWorkingDir(DockerDepsImage dockerImage) =>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace Build;
2+
using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings;
3+
4+
public class DockerBuildDepsManifest : BaseDockerBuildManifest
5+
{
6+
public override void Run(BuildContext context)
7+
{
8+
if (!context.PushImages)
9+
return;
10+
11+
// build/push manifests
12+
foreach (var group in context.DepsImages.GroupBy(x => new { x.Distro }))
13+
{
14+
var dockerImage = group.First();
15+
DockerManifest(context, dockerImage);
16+
}
17+
}
18+
19+
protected override DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag)
20+
{
21+
var settings = base.GetManifestSettings(dockerImage, tag);
22+
settings.Annotation =
23+
[
24+
.. settings.Annotation,
25+
$"index:{Prefix}.description=GitTools deps images ({dockerImage.Distro})"
26+
];
27+
return settings;
28+
}
29+
}

build/build/Tasks/DockerBuildImages.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using DockerBuildXBuildSettings = Build.Cake.Docker.DockerBuildXBuildSettings;
2-
using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings;
32

43
namespace Build;
54

@@ -14,16 +13,6 @@ public override void Run(BuildContext context)
1413
{
1514
DockerImage(context, dockerImage);
1615
}
17-
18-
if (!context.PushImages)
19-
return;
20-
21-
// build/push manifests
22-
// foreach (var group in context.Images.GroupBy(x => new { x.Distro, x.Variant, x.Version }))
23-
// {
24-
// var dockerImage = group.First();
25-
// DockerManifest(context, dockerImage);
26-
// }
2716
}
2817

2918
protected override void DockerImage(BuildContext context, DockerDepsImage dockerImage)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
namespace Build;
2+
using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings;
3+
4+
public class DockerBuildImagesManifest : BaseDockerBuildManifest
5+
{
6+
public override void Run(BuildContext context)
7+
{
8+
if (!context.PushImages)
9+
return;
10+
11+
// build/push manifests
12+
foreach (var group in context.Images.GroupBy(x => new { x.Distro, x.Variant, x.Version }))
13+
{
14+
var dockerImage = group.First();
15+
DockerManifest(context, dockerImage);
16+
}
17+
}
18+
19+
protected override DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag)
20+
{
21+
var (distro, version, variant, _) = (DockerImage)dockerImage;
22+
var suffix = $"({distro}-{variant}-{version})";
23+
var settings = base.GetManifestSettings(dockerImage, tag);
24+
settings.Annotation =
25+
[
26+
.. settings.Annotation,
27+
$"index:{Prefix}.description=GitTools build images {suffix}",
28+
];
29+
return settings;
30+
}
31+
}

0 commit comments

Comments
 (0)