-
Notifications
You must be signed in to change notification settings - Fork 4
134 lines (117 loc) · 5.15 KB
/
build-docker-image-alpine.yml
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
name: Build and Push Alpine Docker Image
on:
repository_dispatch:
types: [caddy-release, build-alpine-image]
workflow_dispatch:
inputs:
build_version:
description: 'Caddy version to build (without v prefix, e.g., 2.8.0)'
required: false
permissions:
contents: write
packages: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set version if empty
id: set_version
run: |
if [ -n "${{ github.event.inputs.build_version }}" ]; then
VERSION=$(echo "${{ github.event.inputs.build_version }}" | sed 's/^v//')
elif [ -n "${{ github.event.client_payload.latest_version }}" ]; then
VERSION=$(echo "${{ github.event.client_payload.latest_version }}" | sed 's/^v//')
else
VERSION=$(cat version.json | jq -r '.version' | sed 's/^v//')
fi
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Check Caddy version availability
id: check_version
run: |
RETRY_COUNT=0
MAX_RETRIES=5
SLEEP_INTERVAL=3600 # 1 hour in seconds
check_availability() {
AVAILABLE_BUILDER_ALPINE=$(curl -sL https://hub.docker.com/v2/repositories/library/caddy/tags/${{ env.VERSION }}-builder-alpine | jq -r '.name')
AVAILABLE_BASE_ALPINE=$(curl -sL https://hub.docker.com/v2/repositories/library/caddy/tags/${{ env.VERSION }}-alpine | jq -r '.name')
if [ "$AVAILABLE_BUILDER_ALPINE" = "${{ env.VERSION }}-builder-alpine" ] && [ "$AVAILABLE_BASE_ALPINE" = "${{ env.VERSION }}-alpine" ]; then
return 0
else
return 1
fi
}
until check_availability; do
RETRY_COUNT=$((RETRY_COUNT + 1))
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
echo "Caddy version ${{ env.VERSION }}-builder-alpine or ${{ env.VERSION }}-alpine is not available after $MAX_RETRIES retries. Triggering workflow again."
echo "DEPENDENCIES_AVAILABILITY=false" >> $GITHUB_ENV
fi
echo "Caddy version ${{ env.VERSION }}-builder-alpine or ${{ env.VERSION }}-alpine is not available. Retrying in $SLEEP_INTERVAL seconds..."
sleep $SLEEP_INTERVAL
done
echo "DEPENDENCIES_AVAILABILITY=true" >> $GITHUB_ENV
- name: Trigger Build Workflow
if: env.DEPENDENCIES_AVAILABILITY == 'false'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.repos.createDispatchEvent({
owner: context.repo.owner,
repo: context.repo.repo,
event_type: 'build-alpine-image',
})
- name: Build and push Docker image (alpine)
if: env.DEPENDENCIES_AVAILABILITY == 'true'
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile.alpine
push: true
build-args: |
CADDY_VERSION=${{ env.VERSION }}
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x
tags: |
ghcr.io/${{ secrets.DOCKER_USERNAME }}/caddy-cloudflare:${{ env.VERSION }}-alpine
ghcr.io/${{ secrets.DOCKER_USERNAME }}/caddy-cloudflare:alpine
${{ secrets.DOCKERHUB_USERNAME }}/caddy-cloudflare:${{ env.VERSION }}-alpine
${{ secrets.DOCKERHUB_USERNAME }}/caddy-cloudflare:alpine
- name: Clean up Docker images
if: env.DEPENDENCIES_AVAILABILITY == 'true'
run: |
docker rmi ghcr.io/${{ secrets.DOCKER_USERNAME }}/caddy-cloudflare:${{ env.VERSION }}-alpine || true
docker rmi ghcr.io/${{ secrets.DOCKER_USERNAME }}/caddy-cloudflare:alpine || true
docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/caddy-cloudflare:${{ env.VERSION }}-alpine || true
docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/caddy-cloudflare:alpine || true
docker builder prune --force
- name: Create GitHub Release
if: env.DEPENDENCIES_AVAILABILITY == 'true'
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ env.VERSION }}-alpine
release_name: "Caddy Alpine v${{ env.VERSION }}"
body: "New Caddy release detected. See the full release notes [here](https://github.com/caddyserver/caddy/releases/tag/v${{ env.VERSION }})."
draft: false
prerelease: false