Skip to content

Final version of python.exe, node.exe, ... support #208

Final version of python.exe, node.exe, ... support

Final version of python.exe, node.exe, ... support #208

Workflow file for this run

name: Build and Push Docker Image for Multiple Architectures
on:
pull_request:
push:
branches:
- master
- develop
tags:
- 'v*.*.*'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
DOCKER_REGISTRY: index.docker.io
DOCKER_USERNAME: metacall
IMAGE_NAME: core
BUILDKIT_VERSION: 0.13.0
# TODO: Tests failing
# - linux/s390x
# TODO: Not tested or no hooking support
# - linux/mips64le
# - linux/mips64
# - linux/loong64
PLATFORM_LIST: >
[
"linux/amd64"
]
# [
# "linux/amd64",
# "linux/amd64/v2",
# "linux/amd64/v3",
# "linux/386",
# "linux/arm64",
# "linux/riscv64",
# "linux/ppc64le",
# "linux/arm/v7",
# "linux/arm/v6"
# ]
jobs:
matrix:
name: Generate Platform List
runs-on: ubuntu-latest
outputs:
platform_list: ${{ steps.generate_platform_list.outputs.platform_list }}
steps:
- name: Generate platform list
id: generate_platform_list
run: |
set -exuo pipefail
PLATFORM_STRING=$(cat <<EOF
${{ env.PLATFORM_LIST }}
EOF
)
PLATFORM_LIST=$(echo $PLATFORM_STRING | jq -c .)
echo "PLATFORM_LIST=$PLATFORM_LIST" >> $GITHUB_ENV
echo "::set-output name=platform_list::$PLATFORM_LIST"
build:
name: Build
runs-on: ubuntu-latest
needs: matrix
strategy:
fail-fast: false
matrix:
platform: ${{ fromJSON(needs.matrix.outputs.platform_list) }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker BuildX
uses: docker/setup-buildx-action@v3
with:
version: v${{ env.BUILDKIT_VERSION }}
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Build MetaCall Docker Images
env:
METACALL_PLATFORM: ${{ matrix.platform }}
DOCKER_BUILDKIT: 1
run: |
./docker-compose.sh platform
- name: Run Tests
env:
DOCKER_BUILDKIT: 1
run: |
set -exuo pipefail
docker image inspect ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:cli --format='{{.Os}}/{{.Architecture}}'
cat <<EOF > Dockerfile.test
FROM ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:cli
RUN apt-get update && apt-get install -y file
RUN file /usr/local/bin/metacallcli && ldd /usr/local/bin/metacallcli
RUN echo "console.log('0123456789abcdef')" > script.js
RUN metacallcli script.js | tee output.txt
RUN grep 0123456789abcdef output.txt
EOF
docker buildx build --progress=plain --platform ${{ matrix.platform }} -f Dockerfile.test -t test-image .
- name: Tag & Push Platform Images
# Only run when master or when tagging a version
if: (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/')) && github.event_name != 'pull_request'
run: |
platform_tag=$(echo "${{ matrix.platform }}" | tr '/' '-')
for tag in "deps" "dev" "runtime" "cli"; do
docker tag \
${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${tag} \
${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${tag}-${platform_tag}
echo "Pushing image for tag: ${tag} with platform: ${platform_tag}"
docker push ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${tag}-${platform_tag}
done
manifest:
name: Create and Push Manifest Lists
needs: [matrix, build]
# Only run when master or when tagging a version
if: (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/')) && github.event_name != 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Create and Push Manifest Lists
run: |
set -exuo pipefail
tags=("deps" "dev" "runtime" "cli")
platforms=($(echo '${{ needs.matrix.outputs.platform_list }}' | jq -r '.[]'))
echo "Create all the tags by platform"
for tag in "${tags[@]}"; do
echo "Creating manifest for tag: $tag"
platform_tags=""
for platform in "${platforms[@]}"; do
platform_tag=$(echo "${platform}" | tr '/' '-')
platform_tags="${platform_tags} ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${tag}-${platform_tag}"
done
echo "Creating manifest with tags: ${platform_tags}"
docker manifest create ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${tag} ${platform_tags} --amend
docker manifest push ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${tag}
done
echo "Create the latest tag"
cli_platform_tags=""
for platform in ${platforms[@]}"; do
platform_tag=$(echo "${platform}" | tr '/' '-')
cli_platform_tags="${cli_platform_tags} ${DOCKER_USERNAME}/${IMAGE_NAME}:cli-${platform_tag}"
done
docker manifest create ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:latest ${cli_platform_tags} --amend
docker manifest push ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:latest
if [[ "${{ startsWith(github.ref, 'refs/tags/') }}" = true ]]; then
VERSION=${GITHUB_REF#refs/tags/v}
echo "Create the version ${VERSION} tag"
for tag in "${tags[@]}"; do
platform_tags=""
for platform in "${platforms[@]}"; do
platform_tag=$(echo "${platform}" | tr '/' '-')
platform_tags="${platform_tags} ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${tag}-${platform_tag}"
done
docker manifest create ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${VERSION}-${tag} ${platform_tags} --amend
docker manifest push ${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${VERSION}-${tag}
done
fi
cleanup:
name: Cleanup Platform Specific Tags
needs: [matrix, build, manifest]
runs-on: ubuntu-latest
if: always()
steps:
- name: Remove Platform-Specific Tags
run: |
set -exuo pipefail
tags=("deps" "dev" "runtime" "cli")
platforms=($(echo '${{ needs.matrix.outputs.platform_list }}' | jq -r '.[]'))
for tag in "${tags[@]}"; do
for platform in "${platforms[@]}"; do
platform_tag=$(echo "${platform}" | tr '/' '-')
tag_to_delete="${tag}-${platform_tag}"
echo "Deleting tag: ${tag_to_delete}"
echo "https://hub.docker.com/v2/repositories/${DOCKER_USERNAME}/${IMAGE_NAME}/tags/${tag_to_delete}/"
curl -X DELETE \
-H "Authorization: Bearer ${{ secrets.DOCKER_HUB_ACCESS_TOKEN_DELETE }}" \
"https://hub.docker.com/v2/repositories/${DOCKER_USERNAME}/${IMAGE_NAME}/tags/${tag_to_delete}/"
done
done