diff --git a/.github/workflows/natives_docker.yaml b/.github/workflows/natives_docker.yaml new file mode 100644 index 0000000..ed5c809 --- /dev/null +++ b/.github/workflows/natives_docker.yaml @@ -0,0 +1,234 @@ +name: Docker multi-arch build and push + +on: + push: + pull_request: + + +jobs: + build: + name: Build Docker image (${{ matrix.arch }}) + runs-on: ubuntu-latest + env: + IMAGE_TAG: ghcr.io/${{ github.repository_owner }}/tdlight-java-natives + IMAGE_TAG_DH: ${{ secrets.DOCKERHUB_OWNER }}/tdlight-java-natives + strategy: + matrix: + arch: [linux/386, linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64, linux/ppc64le] + + steps: + - name: Checkout current repo + uses: actions/checkout@v2 + with: + submodules: "recursive" + + - name: Get version + run: | + # Get latest commit short hash + HASH_VERSION=$(git rev-parse --short HEAD) + + # Strip git ref prefix from version + VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') + + # Strip "v" prefix from tag name + [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') + + # Use Docker `latest` tag convention + [ "$VERSION" == "master" ] && VERSION=latest + + # Convert IMAGE_TAG, HASH_VERSION and VERSION to lowercase (repository name must be lowercase) + IMAGE_TAG=$(echo "$IMAGE_TAG" | awk '{print tolower($0)}') + IMAGE_TAG_DH=$(echo "$IMAGE_TAG_DH" | awk '{print tolower($0)}') + HASH_VERSION=$(echo "$HASH_VERSION" | 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 "IMAGE_TAG_DH=$IMAGE_TAG_DH" >> $GITHUB_ENV + echo "HASH_VERSION=$HASH_VERSION" >> $GITHUB_ENV + echo "VERSION=$VERSION" >> $GITHUB_ENV + echo "SAFE_ARCH=$SAFE_ARCH" >> $GITHUB_ENV + + # Print debug info + echo "hash version: $HASH_VERSION" + 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/upload-artifact@v2 + with: + name: github_env + path: github.env + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Cache Docker layers + uses: actions/cache@v2 + 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 ghcr registry + uses: docker/login-action@v1 + if: ${{ github.event_name != 'pull_request' }} + with: + registry: ghcr.io + username: ${{ secrets.GH_USERNAME }} + password: ${{ secrets.GH_ACCESS_TOKEN }} + + - name: Login to Docker Hub registry + uses: docker/login-action@v1 + if: ${{ github.event_name != 'pull_request' }} + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} + + - name: Build image + uses: docker/build-push-action@v2 + 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 }} + push: false + load: true + tags: | + tdlight-java-natives:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} + + - name: Tag and push image + if: ${{ github.event_name != 'pull_request' }} + run: | + docker tag tdlight-java-natives:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} + docker tag tdlight-java-natives:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-${{ env.SAFE_ARCH }} + docker tag tdlight-java-natives:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} + docker tag tdlight-java-natives:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-${{ env.SAFE_ARCH }} + docker push ${{ env.IMAGE_TAG}}:${{ env.HASH_VERSION}}-${{ env.SAFE_ARCH }} + docker push ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-${{ env.SAFE_ARCH }} + docker push ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} + docker push ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-${{ env.SAFE_ARCH }} + + - name: Save image as tar archive + if: ${{ github.event_name != 'pull_request' }} + run: | + docker save ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} -o ${{ env.SAFE_ARCH }}.tar + + - name: Save image as tar archive (pull request) + if: ${{ github.event_name == 'pull_request' }} + run: | + docker save tdlight-java-natives:${{ env.HASH_VERSION }}-${{ env.SAFE_ARCH }} -o ${{ env.SAFE_ARCH }}.tar + + - name: Upload image as artifact + uses: actions/upload-artifact@v2 + 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/download-artifact@v2 + + - 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/login-action@v1 + with: + registry: ghcr.io + username: ${{ secrets.GH_USERNAME }} + password: ${{ secrets.GH_ACCESS_TOKEN }} + + - name: Login to Docker Hub registry + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} + + - name: Create and push manifest + run: | + # -- Push to ghcr.io + docker manifest create ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }} \ + --amend ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linux386 \ + --amend ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxamd64 \ + --amend ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv6 \ + --amend ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv7 \ + --amend ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarm64 \ + --amend ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxppc64le + docker manifest push ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }} + + # Tag images as VERSION (like 'latest') + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linux386 ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linux386 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxamd64 ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxamd64 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv6 ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarmv6 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv7 ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarmv7 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarm64 ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxarm64 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxppc64le ${{ env.IMAGE_TAG }}:${{ env.VERSION }}-linuxppc64le + + 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 }} + + # -- Push to Docker Hub + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linux386 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linux386 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxamd64 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxamd64 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv6 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarmv6 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv7 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarmv7 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarm64 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarm64 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxppc64le ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxppc64le + + docker manifest create ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }} \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-linux386 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-linuxamd64 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-linuxarmv6 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-linuxarmv7 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-linuxarm64 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }}-linuxppc64le + docker manifest push ${{ env.IMAGE_TAG_DH }}:${{ env.HASH_VERSION }} + + # Tag images as VERSION (like 'latest') + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linux386 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linux386 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxamd64 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxamd64 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv6 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarmv6 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarmv7 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarmv7 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxarm64 ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarm64 + docker tag ${{ env.IMAGE_TAG }}:${{ env.HASH_VERSION }}-linuxppc64le ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxppc64le + + docker manifest create ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }} \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linux386 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxamd64 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarmv6 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarmv7 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxarm64 \ + --amend ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }}-linuxppc64le + docker manifest push ${{ env.IMAGE_TAG_DH }}:${{ env.VERSION }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..51fced9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM ubuntu:groovy + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt update && apt upgrade -y +RUN apt install -y make git zlib1g-dev libssl-dev gperf cmake clang-10 libc++-10-dev libc++abi-10-dev ccache maven python3 python3-pip php7.4-cli openjdk-15-jdk + +WORKDIR /usr/src/tdlight-java-natives/scripts/utils + +ADD implementations /usr/src/tdlight-java-natives/implementations +ADD scripts /usr/src/tdlight-java-natives/scripts +ADD src /usr/src/tdlight-java-natives/src + +RUN ./compile-natives-package.sh + +ENTRYPOINT [ "/bin/bash" ]