Final version of python.exe
, node.exe
, ... support
#208
This file contains hidden or 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: 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 |