diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 20cf8bc..f45d7b6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,14 +1,59 @@ -name: "Build Docker Image" +name: "Build multi-arch images" on: - create: + push: + tags: + - "v*.*.*" jobs: - build: - if: ${{ startsWith(github.ref, 'refs/tags/v') }} + crate-info: + name: "Extract crate info" + runs-on: "ubuntu-latest" + outputs: + version: ${{ steps.derive.outputs.version }} + + steps: + - id: "derive" + name: "Derive crate info from Git tag" + run: | + FULL_REF="${{ github.ref }}" + REGEX="^refs\/tags\/v(.*)$" + [[ $FULL_REF =~ $REGEX ]]; + + echo "version=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT + + build-amd64: + name: "Build for linux/amd64" + runs-on: "ubuntu-latest" + needs: + - "crate-info" + + env: + DOCKER_REPOSITORY: "starknet/jsonrpc-to-firestark" + + steps: + - name: "Checkout" + uses: "actions/checkout@v3" + + - name: "Build Docker image" + run: | + docker build -t ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-amd64 -f ./Dockerfile . + + - name: "Export Docker image" + run: | + docker save ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-amd64 | gzip > /tmp/amd64.tar.gz + + - name: "Upload Docker image artifact" + uses: "actions/upload-artifact@v3" + with: + name: "amd64.tar.gz" + path: "/tmp/amd64.tar.gz" - name: "Build" + build-arm64: + name: "Build for linux/arm64" runs-on: "ubuntu-latest" + needs: + - "crate-info" env: DOCKER_REPOSITORY: "starknet/jsonrpc-to-firestark" @@ -17,23 +62,72 @@ jobs: - name: "Checkout" uses: "actions/checkout@v3" + - name: "Install cross" + run: | + cargo install --locked --version 0.2.5 cross + + - name: "Build release" + run: | + cross build --release --target aarch64-unknown-linux-gnu + + - name: "Build Docker image" + run: | + docker build -t ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-arm64 -f ./.github/workflows/docker/Dockerfile.arm64 . + + - name: "Export Docker image" + run: | + docker save ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-arm64 | gzip > /tmp/arm64.tar.gz + + - name: "Upload Docker image artifact" + uses: "actions/upload-artifact@v3" + with: + name: "arm64.tar.gz" + path: "/tmp/arm64.tar.gz" + + push: + name: "Push multi-arch manifest" + runs-on: "ubuntu-latest" + needs: + - "build-amd64" + - "build-arm64" + - "crate-info" + + env: + DOCKER_REPOSITORY: "ghcr.io/zklend/zklend-v1-dev-deploy" + + steps: - name: "Login to Docker Hub" uses: "docker/login-action@v1.6.0" with: username: "${{ secrets.DOCKER_HUB_USERNAME }}" password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - - name: "Determine image version" - run: | - version_line="${{ github.ref }}" - regex="^refs\/tags\/v(.*)$" - [[ $version_line =~ $regex ]]; - echo "VERSION=${BASH_REMATCH[1]}" >> $GITHUB_ENV + - name: "Download linux/amd64 image" + uses: "actions/download-artifact@v3" + with: + name: "amd64.tar.gz" + path: "/tmp/amd64.tar.gz" - - name: "Build Docker image" + - name: "Download linux/arm64/v8 image" + uses: "actions/download-artifact@v3" + with: + name: "arm64.tar.gz" + path: "/tmp/arm64.tar.gz" + + - name: "Load Docker images" run: | - docker build -t ${DOCKER_REPOSITORY}:${VERSION} -f ./Dockerfile . + docker load --input /tmp/amd64.tar.gz + docker load --input /tmp/arm64.tar.gz - - name: "Push Docker image" + - name: "Push Docker images" run: | - docker push ${DOCKER_REPOSITORY}:${VERSION} + docker push ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-amd64 + docker push ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-arm64 + docker manifest create ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }} \ + ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-amd64 \ + ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-arm64 + docker manifest create ${DOCKER_REPOSITORY}:latest \ + ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-amd64 \ + ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }}-arm64 + docker manifest push ${DOCKER_REPOSITORY}:${{ needs.crate-info.outputs.version }} + docker manifest push ${DOCKER_REPOSITORY}:latest build: diff --git a/.github/workflows/docker/Dockerfile.arm64 b/.github/workflows/docker/Dockerfile.arm64 new file mode 100644 index 0000000..4584641 --- /dev/null +++ b/.github/workflows/docker/Dockerfile.arm64 @@ -0,0 +1,7 @@ +FROM --platform=linux/arm64/v8 debian:bullseye-slim + +LABEL org.opencontainers.image.source=https://github.com/starknet-graph/jsonrpc-to-firestark + +COPY ./target/aarch64-unknown-linux-gnu/release/jsonrpc-to-firestark /usr/bin/ + +ENTRYPOINT [ "jsonrpc-to-firestark" ] diff --git a/.github/workflows/docker/Dockerfile.arm64.dockerignore b/.github/workflows/docker/Dockerfile.arm64.dockerignore new file mode 100644 index 0000000..2a9c8fd --- /dev/null +++ b/.github/workflows/docker/Dockerfile.arm64.dockerignore @@ -0,0 +1,4 @@ +/target/ +/.dockerignore +/Dockerfile +!/target/aarch64-unknown-linux-gnu/release/jsonrpc-to-firestark