-
Notifications
You must be signed in to change notification settings - Fork 3
140 lines (123 loc) · 5.02 KB
/
Copy pathdocker-build.yml
File metadata and controls
140 lines (123 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
name: Build Multi-Platform Docker Images
on:
workflow_run:
workflows: ["Build Binaries"]
types: [completed]
release:
types: [published]
workflow_dispatch:
env:
# GitHub Container Registry
GHCR_REGISTRY: ghcr.io
GHCR_IMAGE_NAME: ${{ github.repository }}
jobs:
build-docker:
name: Build Multi-Platform Docker Image
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' }}
permissions:
contents: read
packages: write
actions: read
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download artifacts from Build Binaries workflow (triggered by Build Binaries)
if: github.event_name == 'workflow_run'
uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
workflow: build.yml
run_id: ${{ github.event.workflow_run.id }}
name_is_regexp: true
name: perfecto-mcp-.*
path: artifacts/
- name: Download artifacts from Build Binaries workflow (triggered by release/manual)
if: github.event_name != 'workflow_run'
uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
workflow: build.yml
commit: ${{ github.sha }}
workflow_conclusion: success
name_is_regexp: true
name: perfecto-mcp-.*
path: artifacts/
- name: Get tag for version (when triggered by Build Binaries)
if: github.event_name == 'workflow_run'
id: get_tag
run: |
git fetch --tags --force 2>/dev/null || true
TAG=$(git tag --points-at ${{ github.event.workflow_run.head_sha }} 2>/dev/null | grep -E '^v[0-9]+\.[0-9]+' | sort -V | tail -1)
echo "tag_name=$TAG" >> $GITHUB_OUTPUT
echo "Tag for ${{ github.event.workflow_run.head_sha }}: $TAG"
- name: Set ref tag without v (tag event processed)
if: github.event_name == 'release' || (github.event_name == 'workflow_run' && steps.get_tag.outputs.tag_name != '')
id: ref_tag
run: |
if [ "${{ github.event_name }}" = "release" ]; then
RAW="${{ github.event.release.tag_name }}"
else
RAW="${{ steps.get_tag.outputs.tag_name }}"
fi
VERSION="${RAW#v}"
echo "version=$VERSION" >> $GITHUB_OUTPUT
MAJOR_MINOR=$(echo "$VERSION" | sed -n 's/^\([0-9]*\.[0-9]*\).*/\1/p')
echo "major_minor=$MAJOR_MINOR" >> $GITHUB_OUTPUT
MAJOR=$(echo "$VERSION" | sed -n 's/^\([0-9]*\).*/\1/p')
echo "major=$MAJOR" >> $GITHUB_OUTPUT
echo "Ref tag (no v): $VERSION ($MAJOR_MINOR, $MAJOR)"
- name: Organize binaries for Docker build
run: |
mkdir -p dist/
# Copy and rename binaries to match Docker expectations
if [ -f artifacts/perfecto-mcp-linux-amd64/perfecto-mcp-linux-amd64 ]; then
cp artifacts/perfecto-mcp-linux-amd64/perfecto-mcp-linux-amd64 dist/perfecto-mcp-linux-amd64
echo "AMD64 binary found"
else
echo "AMD64 binary missing"
exit 1
fi
# Check for ARM64 binary (optional for now)
if [ -f artifacts/perfecto-mcp-linux-arm64/perfecto-mcp-linux-arm64 ]; then
cp artifacts/perfecto-mcp-linux-arm64/perfecto-mcp-linux-arm64 dist/perfecto-mcp-linux-arm64
echo "ARM64 binary found"
echo "PLATFORMS=linux/amd64,linux/arm64" >> $GITHUB_ENV
else
echo "ARM64 binary missing - building AMD64 only"
echo "PLATFORMS=linux/amd64" >> $GITHUB_ENV
fi
echo "Available binaries:"
ls -la dist/
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.GHCR_REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.GHCR_REGISTRY }}/${{ env.GHCR_IMAGE_NAME }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=match,pattern=v(.*),group=1
type=raw,value=${{ steps.ref_tag.outputs.version }},enable=${{ steps.ref_tag.outputs.version != '' }}
type=raw,value=${{ steps.ref_tag.outputs.major_minor }},enable=${{ steps.ref_tag.outputs.major_minor != '' }}
type=raw,value=${{ steps.ref_tag.outputs.major }},enable=${{ steps.ref_tag.outputs.major != '' }}
type=raw,value=latest,enable=${{ steps.ref_tag.outputs.version != '' }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
platforms: ${{ env.PLATFORMS }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max