mirror of https://github.com/openwrt/docker.git
461 lines
16 KiB
YAML
461 lines
16 KiB
YAML
name: Build and push containers
|
|
run-name: ${{ inputs.ref }} ${{ inputs.target }}
|
|
|
|
on:
|
|
# push:
|
|
pull_request:
|
|
workflow_dispatch:
|
|
inputs:
|
|
ref:
|
|
description: "Tag or branch to deploy (empty for main)"
|
|
default: "main"
|
|
required: false
|
|
target:
|
|
description: "Single target to build (empty for all)"
|
|
required: false
|
|
file_host:
|
|
description: "File host to use (empty for default)"
|
|
required: false
|
|
prefix:
|
|
description: "Prefix for the image name (add '-' at the end)"
|
|
required: false
|
|
|
|
# schedule:
|
|
# - cron: "0 5 * * *" # daily snapshot
|
|
# - cron: "0 6 * * *" # daily 23.05-SNAPSHOT
|
|
# - cron: "0 7 * * 2" # weekly 22.03-SNAPSHOT
|
|
# - cron: "0 8 16 * *" # monthly 21.02-SNAPSHOT
|
|
|
|
jobs:
|
|
generate_matrix:
|
|
name: Set matrix
|
|
runs-on: ${{ (github.event_name != 'pull_request') && fromJSON('[ "docker-builder", "Linux", "X64" ]') || 'ubuntu-latest' }}
|
|
|
|
outputs:
|
|
imagebuilders: ${{ steps.find_targets.outputs.imagebuilders }}
|
|
rootfs: ${{ steps.find_targets.outputs.rootfs }}
|
|
sdks: ${{ steps.find_targets.outputs.sdks }}
|
|
ref: ${{ steps.find_targets.outputs.ref }}
|
|
version: ${{ steps.find_targets.outputs.version }}
|
|
version_path: ${{ steps.find_targets.outputs.version_path }}
|
|
file_host: ${{ steps.find_targets.outputs.file_host }}
|
|
|
|
steps:
|
|
- name: Set release to 23.05-SNAPSHOT
|
|
if: github.event.schedule == '0 6 * * *'
|
|
run: |
|
|
echo "VERSION=23.05-SNAPSHOT" >> "$GITHUB_ENV"
|
|
echo "VERSION_PATH=releases/23.05-SNAPSHOT" >> "$GITHUB_ENV"
|
|
echo "REF=openwrt-23.05" >> "$GITHUB_ENV"
|
|
|
|
- name: Set release to 22.03-SNAPSHOT
|
|
if: github.event.schedule == '0 7 * * 2'
|
|
run: |
|
|
echo "VERSION=22.03-SNAPSHOT" >> "$GITHUB_ENV"
|
|
echo "VERSION_PATH=releases/22.03-SNAPSHOT" >> "$GITHUB_ENV"
|
|
echo "REF=openwrt-22.03" >> "$GITHUB_ENV"
|
|
|
|
- name: Set release to 21.02-SNAPSHOT
|
|
if: github.event.schedule == '0 8 16 * *'
|
|
run: |
|
|
echo "VERSION=21.02-SNAPSHOT" >> "$GITHUB_ENV"
|
|
echo "VERSION_PATH=releases/21.02-SNAPSHOT" >> "$GITHUB_ENV"
|
|
echo "REF=openwrt-21.02" >> "$GITHUB_ENV"
|
|
|
|
- name: Set release manually
|
|
if: github.event.inputs.ref != ''
|
|
run: |
|
|
export REF=${{ github.event.inputs.ref == 'master' && 'main' || github.event.inputs.ref }}
|
|
echo "REF=$REF" >> "$GITHUB_ENV"
|
|
|
|
case $REF in
|
|
main)
|
|
VERSION=SNAPSHOT
|
|
echo "VERSION_PATH=snapshots" >> "$GITHUB_ENV"
|
|
;;
|
|
openwrt-*)
|
|
VERSION=${REF//openwrt-/}-SNAPSHOT
|
|
echo "VERSION_PATH=releases/$VERSION" >> "$GITHUB_ENV"
|
|
;;
|
|
v*)
|
|
VERSION=${REF//v/}
|
|
echo "VERSION_PATH=releases/$VERSION" >> "$GITHUB_ENV"
|
|
;;
|
|
*)
|
|
echo "No tag or branch found"
|
|
exit 1
|
|
;;
|
|
esac
|
|
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
|
|
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
repository: openwrt/openwrt
|
|
ref: ${{ env.REF}}
|
|
|
|
- name: Set targets
|
|
id: find_targets
|
|
run: |
|
|
TARGET_FILTER="${{ github.event.inputs.target }}"
|
|
|
|
# imagebuilders & rootfs
|
|
JSON_IB='['
|
|
FIRST_IB=1
|
|
|
|
JSON_ROOTFS='['
|
|
FIRST_ROOTFS=1
|
|
|
|
while read -r line;
|
|
do
|
|
TARGET=$(echo "$line" | cut -d " " -f 1)
|
|
ARCH=$(echo "$line" | cut -d " " -f 2)
|
|
|
|
[[ $FIRST_IB -ne 1 ]] && JSON_IB="$JSON_IB"','
|
|
FIRST_IB=0
|
|
|
|
JSON_IB="$JSON_IB"'{"target":"'"$TARGET"'"}'
|
|
|
|
case "$TARGET" in
|
|
x86/*|arm*|malta/be|mvebu/cortexa9)
|
|
[[ $FIRST_ROOTFS -ne 1 ]] && JSON_ROOTFS="$JSON_ROOTFS"','
|
|
FIRST_ROOTFS=0
|
|
|
|
JSON_ROOTFS="$JSON_ROOTFS"'{"target":"'"$TARGET"'","arch":"'"$ARCH"'"}'
|
|
;;
|
|
esac
|
|
|
|
done <<< $(perl ./scripts/dump-target-info.pl targets 2>/dev/null | ([[ -n "$TARGET_FILTER" ]] && grep -w "$TARGET_FILTER" || cat))
|
|
|
|
JSON_IB='{"include":'"$JSON_IB"']}'
|
|
echo -e "\n---- imagebuilders ----\n"
|
|
echo "$JSON_IB" | jq
|
|
echo -e "\n---- imagebuilders ----\n"
|
|
echo "imagebuilders=$JSON_IB" >> "$GITHUB_OUTPUT"
|
|
|
|
JSON_ROOTFS='{"include":'"$JSON_ROOTFS"']}'
|
|
echo -e "\n---- rootfs ----\n"
|
|
echo "$JSON_ROOTFS" | jq
|
|
echo -e "\n---- rootfs ----\n"
|
|
echo "rootfs=$JSON_ROOTFS" >> "$GITHUB_OUTPUT"
|
|
|
|
# sdks
|
|
JSON='['
|
|
FIRST=1
|
|
|
|
while read -r line;
|
|
do
|
|
ARCH=$(echo "$line" | cut -d " " -f 1)
|
|
[ -z "$TARGET_FILTER" ] && TARGET=$(echo "$line" | cut -d " " -f 2) || TARGET="$TARGET_FILTER"
|
|
TARGETS=$(echo "$line" | cut -d " " -f 2- | sed -e 's/ /\\n/g')
|
|
|
|
[[ $FIRST -ne 1 ]] && JSON="$JSON"','
|
|
FIRST=0
|
|
|
|
JSON="$JSON"'{"arch":"'"$ARCH"'","target":"'"$TARGET"'","tags":"'"$ARCH"'\n'"$TARGETS"'"}'
|
|
done <<< $(perl ./scripts/dump-target-info.pl architectures 2>/dev/null | ([[ -n "$TARGET_FILTER" ]] && grep -w "$TARGET_FILTER" || cat))
|
|
|
|
JSON='{"include":'"$JSON"']}'
|
|
echo -e "\n---- sdks ----\n"
|
|
echo "$JSON" | jq
|
|
echo -e "\n---- sdks ----\n"
|
|
echo "sdks=$JSON" >> "$GITHUB_OUTPUT"
|
|
|
|
echo "ref=${REF:-main}" >> "$GITHUB_OUTPUT"
|
|
echo "version=${VERSION:-SNAPSHOT}" >> "$GITHUB_OUTPUT"
|
|
echo "version_path=${VERSION_PATH:-snapshots}" >> "$GITHUB_OUTPUT"
|
|
|
|
FILE_HOST=${{ needs.generate_matrix.outputs.file_host }}
|
|
echo "file_host=${FILE_HOST:-mirror-03.infra.openwrt.org}" >> "$GITHUB_OUTPUT"
|
|
|
|
push-imagebuilder-container:
|
|
name: ImageBuilder
|
|
runs-on: ${{ (github.event_name != 'pull_request') && fromJSON('[ "docker-builder", "Linux", "X64" ]') || 'ubuntu-latest' }}
|
|
needs: generate_matrix
|
|
strategy:
|
|
fail-fast: False
|
|
matrix: ${{fromJson(needs.generate_matrix.outputs.imagebuilders)}}
|
|
|
|
steps:
|
|
- name: Login to GitHub Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Login to Docker.io Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_TOKEN }}
|
|
|
|
- name: Login to Quay.io Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: quay.io
|
|
username: ${{ secrets.QUAY_USER }}
|
|
password: ${{ secrets.QUAY_TOKEN }}
|
|
|
|
- name: Docker meta
|
|
id: meta
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: |
|
|
ghcr.io/openwrt/imagebuilder
|
|
docker.io/openwrt/imagebuilder
|
|
quay.io/openwrt/imagebuilder
|
|
flavor: |
|
|
latest=false
|
|
prefix=${{ github.event.inputs.prefix }}
|
|
tags: |
|
|
${{ matrix.target }}-${{ needs.generate_matrix.outputs.ref }}
|
|
${{ matrix.target }}-${{ needs.generate_matrix.outputs.version }}
|
|
${{ matrix.target }}-master,enable=${{ needs.generate_matrix.outputs.ref == 'main' }}
|
|
${{ matrix.target }},enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' }}
|
|
latest,enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' && matrix.target == 'x86/64'}}
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
push: ${{ github.event_name != 'pull_request' }}
|
|
tags: ${{ steps.meta.outputs.tags }}
|
|
labels: ${{ steps.meta.outputs.labels }}
|
|
build-args: |
|
|
DOWNLOAD_FILE=imagebuilder-.*x86_64.tar.[xz|zst]
|
|
VERSION_PATH=${{ needs.generate_matrix.outputs.version_path }}
|
|
TARGET=${{ matrix.target }}
|
|
FILE_HOST=${{ needs.generate_matrix.outputs.file_host }}
|
|
|
|
- name: Cleanup Docker containers
|
|
run: docker system prune -f
|
|
|
|
push-sdk-container:
|
|
name: SDK
|
|
runs-on: ${{ (github.event_name != 'pull_request') && fromJSON('[ "docker-builder", "Linux", "X64" ]') || 'ubuntu-latest' }}
|
|
needs: generate_matrix
|
|
strategy:
|
|
fail-fast: False
|
|
matrix: ${{fromJson(needs.generate_matrix.outputs.sdks)}}
|
|
|
|
steps:
|
|
- name: Login to GitHub Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Login to Docker.io Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_TOKEN }}
|
|
|
|
- name: Login to Quay.io Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: quay.io
|
|
username: ${{ secrets.QUAY_USER }}
|
|
password: ${{ secrets.QUAY_TOKEN }}
|
|
|
|
- name: Docker meta (tag or branch)
|
|
id: meta_ref
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: |
|
|
ghcr.io/openwrt/sdk
|
|
docker.io/openwrt/sdk
|
|
quay.io/openwrt/sdk
|
|
flavor: |
|
|
latest=false
|
|
prefix=${{ github.event.inputs.prefix }}
|
|
suffix=-${{ needs.generate_matrix.outputs.ref }}
|
|
tags: ${{ matrix.tags }}
|
|
|
|
- name: Docker meta (version)
|
|
id: meta_version
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: |
|
|
ghcr.io/openwrt/sdk
|
|
docker.io/openwrt/sdk
|
|
quay.io/openwrt/sdk
|
|
flavor: |
|
|
latest=false
|
|
prefix=${{ github.event.inputs.prefix }}
|
|
suffix=-${{ needs.generate_matrix.outputs.version }}
|
|
tags: ${{ matrix.tags }}
|
|
|
|
- name: Docker meta (master)
|
|
if: needs.generate_matrix.outputs.ref == 'main'
|
|
id: meta_master
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: |
|
|
ghcr.io/openwrt/sdk
|
|
docker.io/openwrt/sdk
|
|
quay.io/openwrt/sdk
|
|
flavor: |
|
|
latest=false
|
|
prefix=${{ github.event.inputs.prefix }}
|
|
suffix=-master
|
|
tags: ${{ matrix.tags }}
|
|
|
|
- name: Docker meta (target and arch)
|
|
if: needs.generate_matrix.outputs.version == 'SNAPSHOT'
|
|
id: meta_target_arch
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: |
|
|
ghcr.io/openwrt/sdk
|
|
docker.io/openwrt/sdk
|
|
quay.io/openwrt/sdk
|
|
flavor: |
|
|
latest=false
|
|
prefix=${{ github.event.inputs.prefix }}
|
|
tags: ${{ matrix.tags }}
|
|
|
|
- name: Docker meta (latest)
|
|
if: needs.generate_matrix.outputs.version == 'SNAPSHOT' && matrix.target == 'x86/64'
|
|
id: meta_latest
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: |
|
|
ghcr.io/openwrt/sdk
|
|
docker.io/openwrt/sdk
|
|
quay.io/openwrt/sdk
|
|
tags: latest
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
push: ${{ github.event_name != 'pull_request' }}
|
|
tags: |
|
|
${{ steps.meta_ref.outputs.tags }}
|
|
${{ steps.meta_version.outputs.tags }}
|
|
${{ steps.meta_master.outputs.tags }}
|
|
${{ steps.meta_target_arch.outputs.tags }}
|
|
${{ steps.meta_latest.outputs.tags }}
|
|
build-args: |
|
|
DOWNLOAD_FILE=sdk-.*.Linux-x86_64.tar.[xz|zst]
|
|
VERSION_PATH=${{ needs.generate_matrix.outputs.version_path }}
|
|
TARGET=${{ matrix.target }}
|
|
FILE_HOST=${{ needs.generate_matrix.outputs.file_host }}
|
|
labels: ${{ steps.meta_ref.outputs.labels }}
|
|
|
|
- name: Cleanup Docker containers
|
|
run: docker system prune -f
|
|
|
|
push-rootfs-container:
|
|
name: RootFS
|
|
runs-on: ${{ (github.event_name != 'pull_request') && fromJSON('[ "docker-builder", "Linux", "X64" ]') || 'ubuntu-latest' }}
|
|
needs: generate_matrix
|
|
if: needs.generate_matrix.outputs.rootfs != '{"include":[]}'
|
|
strategy:
|
|
fail-fast: False
|
|
matrix: ${{fromJson(needs.generate_matrix.outputs.rootfs)}}
|
|
|
|
steps:
|
|
- name: Set up QEMU
|
|
if: github.event_name == 'pull_request'
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y qemu-user-static binfmt-support
|
|
sudo update-binfmts --import
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Login to GitHub Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Login to Docker.io Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_TOKEN }}
|
|
|
|
- name: Login to Quay.io Container Registry
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: quay.io
|
|
username: ${{ secrets.QUAY_USER }}
|
|
password: ${{ secrets.QUAY_TOKEN }}
|
|
|
|
- name: Docker meta
|
|
id: meta
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: |
|
|
ghcr.io/openwrt/rootfs
|
|
docker.io/openwrt/rootfs
|
|
quay.io/openwrt/rootfs
|
|
flavor: |
|
|
latest=false
|
|
prefix=${{ github.event.inputs.prefix }}
|
|
tags: |
|
|
${{ matrix.target }}-${{ needs.generate_matrix.outputs.ref }}
|
|
${{ matrix.target }}-${{ needs.generate_matrix.outputs.version }}
|
|
${{ matrix.target }}-master,enable=${{ needs.generate_matrix.outputs.ref == 'main' }}
|
|
${{ matrix.target }},enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' }}
|
|
${{ matrix.arch }}-${{ needs.generate_matrix.outputs.ref }}
|
|
${{ matrix.arch }}-${{ needs.generate_matrix.outputs.version }}
|
|
${{ matrix.arch }}-master,enable=${{ needs.generate_matrix.outputs.ref == 'main' }}
|
|
${{ matrix.arch }},enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' }}
|
|
latest,enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' && matrix.target == 'x86/64'}}
|
|
|
|
- name: Generate build args
|
|
id: build_args
|
|
run: |
|
|
echo 'args<<EOF
|
|
DOWNLOAD_FILE=openwrt-.*-rootfs.tar.gz
|
|
WORKDIR=/
|
|
USER=root
|
|
VERSION_PATH=${{ needs.generate_matrix.outputs.version_path }}
|
|
TARGET=${{ matrix.target }}
|
|
BASE_IMAGE=scratch
|
|
CMD=ash
|
|
FILE_HOST=${{ needs.generate_matrix.outputs.file_host }}
|
|
EOF' >> $GITHUB_OUTPUT
|
|
|
|
- name: Build
|
|
id: build
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
push: false
|
|
tags: ${{ steps.meta.outputs.tags }}
|
|
load: true
|
|
build-args: ${{ steps.build_args.outputs.args }}
|
|
labels: ${{ steps.meta.outputs.labels }}
|
|
platforms: linux/${{ matrix.arch }}
|
|
|
|
- name: Smoke test
|
|
run: docker run --platform=linux/${{ matrix.arch }} ${{ steps.build.outputs.imageid }} uname -m
|
|
|
|
- name: Push
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
push: true
|
|
tags: ${{ steps.meta.outputs.tags }}
|
|
build-args: ${{ steps.build_args.outputs.args }}
|
|
labels: ${{ steps.meta.outputs.labels }}
|
|
platforms: linux/${{ matrix.arch }}
|
|
|
|
- name: Cleanup Docker containers
|
|
run: docker system prune -f
|