Docker multi-arch build and push #341
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Docker multi-arch build and push | |
on: | |
push: | |
branches: | |
- master | |
schedule: | |
- cron: '20 4 * * *' | |
jobs: | |
build: | |
name: Build Docker image (${{ matrix.arch }}) | |
runs-on: ubuntu-latest | |
env: | |
IMAGE_TAG: ${{ secrets.DOCKERHUB_OWNER }}/telegram-bot-api | |
ALPINE_VERSION: '3.20' | |
strategy: | |
matrix: | |
arch: | |
- linux/386 | |
- linux/amd64 | |
- linux/arm/v6 | |
- linux/arm/v7 | |
- linux/arm64 | |
- linux/ppc64le | |
steps: | |
- name: Checkout current repo | |
uses: actions/[email protected] | |
- name: Checkout upstream repo | |
uses: actions/[email protected] | |
with: | |
repository: tdlib/telegram-bot-api | |
path: telegram-bot-api | |
submodules: recursive | |
- name: Get version | |
run: | | |
# Get latest commit short hash | |
HASH_VERSION=$(git rev-parse --short HEAD) | |
# Get real version from the code | |
VERSION=$(cat telegram-bot-api/CMakeLists.txt | grep TelegramBotApi | cut -d " " -f3) | |
# Convert IMAGE_TAG, HASH_VERSION and VERSION to lowercase (repository name must be lowercase) | |
IMAGE_TAG=$(echo "$IMAGE_TAG" | awk '{print tolower($0)}') | |
VERSION=$(echo "$VERSION" | awk '{print tolower($0)}') | |
ARCH=${{ matrix.arch }} | |
SAFE_ARCH=${ARCH///} # linux/amd64 -> linuxamd64 | |
# Store variable for future use | |
echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
echo "SAFE_ARCH=$SAFE_ARCH" >> $GITHUB_ENV | |
# Print debug info | |
echo "version: $VERSION" | |
echo "safe arch: $SAFE_ARCH" | |
# Save env to file | |
cat $GITHUB_ENV > github.env | |
- name: Upload environment info as artifact | |
uses: actions/[email protected] | |
if: matrix.arch == 'linux/amd64' # Run this step only once per all matrix builds | |
with: | |
name: github_env | |
path: github.env | |
- name: Set up QEMU | |
uses: docker/[email protected] | |
- name: Set up Docker Buildx | |
uses: docker/[email protected] | |
- name: Cache Docker layers | |
uses: actions/[email protected] | |
with: | |
path: /tmp/.buildx-cache | |
key: ${{ runner.os }}-buildx-${{ env.SAFE_ARCH }}-${{ github.sha }} | |
restore-keys: | | |
${{ runner.os }}-buildx-${{ env.SAFE_ARCH }}- | |
- name: Login to Docker Hub registry | |
uses: docker/[email protected] | |
if: ${{ github.event_name != 'pull_request' }} | |
with: | |
username: ${{ secrets.DOCKERHUB_LOGIN }} | |
password: ${{ secrets.DOCKERHUB_TOKEN }} | |
- name: Build image | |
uses: docker/[email protected] | |
with: | |
context: . | |
file: ./Dockerfile | |
cache-from: type=local,src=/tmp/.buildx-cache | |
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache | |
platforms: ${{ matrix.arch }} | |
build-args: | | |
ALPINE_VERSION=${{ env.ALPINE_VERSION }} | |
push: false | |
load: true | |
tags: | | |
${{ env.IMAGE_TAG }}:${{ env.VERSION }}-${{ env.SAFE_ARCH }} | |
- name: Tag and push image | |
if: ${{ github.event_name != 'pull_request' }} | |
run: | | |
docker push ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-${{ env.SAFE_ARCH }} | |
- name: Save image as tar archive | |
if: ${{ github.event_name != 'pull_request' }} | |
run: | | |
docker save ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-${{ env.SAFE_ARCH }} -o ${{ env.SAFE_ARCH }}.tar | |
- name: Upload image as artifact | |
uses: actions/[email protected] | |
with: | |
name: image_${{ env.SAFE_ARCH }} | |
path: ${{ env.SAFE_ARCH }}.tar | |
push-manifest: | |
name: Create and push multi-arch Docker manifest | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name != 'pull_request' }} | |
env: | |
DOCKER_CLI_EXPERIMENTAL: enabled | |
needs: build | |
steps: | |
- name: Download artifacts | |
uses: actions/[email protected] | |
- name: Load environment info and built images | |
run: | | |
cat github_env/github.env > $GITHUB_ENV | |
docker load --input image_linux386/linux386.tar | |
docker load --input image_linuxamd64/linuxamd64.tar | |
docker load --input image_linuxarmv6/linuxarmv6.tar | |
docker load --input image_linuxarmv7/linuxarmv7.tar | |
docker load --input image_linuxarm64/linuxarm64.tar | |
docker load --input image_linuxppc64le/linuxppc64le.tar | |
- name: Login to ghcr registry | |
uses: docker/[email protected] | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Login to Docker Hub registry | |
uses: docker/[email protected] | |
with: | |
username: ${{ secrets.DOCKERHUB_LOGIN }} | |
password: ${{ secrets.DOCKERHUB_TOKEN }} | |
- name: Create and push manifest | |
run: | | |
docker manifest create ${{ env.IMAGE_TAG }}:${{ env.VERSION }} \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linux386 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxamd64 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarmv6 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarmv7 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarm64 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxppc64le | |
docker manifest push ${{ env.IMAGE_TAG }}:${{ env.VERSION }} | |
docker manifest create ${{ env.IMAGE_TAG }}:latest \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linux386 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxamd64 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarmv6 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarmv7 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarm64 \ | |
--amend ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxppc64le | |
docker manifest push ${{ env.IMAGE_TAG }}:latest |