Ștefan Talpalaru 51bc1cf87f
dist: precompiled binaries and Docker images (#1015)
* dist: precompiled binaries and Docker images

The builds are reproducible, the binaries are portable and statically link librocksdb.

This took some patching. Upstream PR: https://github.com/facebook/rocksdb/pull/9752

32-bit ARM is missing as a target because two different GCC versions
fail with an ICE when trying to cross-compile RocksDB. Using Clang
instead is too much trouble for a platform that nobody should be using
anyway.

(Clang doesn't come with its own target headers and libraries, can't be
easily convinced to use the ones from GCC, so it needs an fs image from
a 32-bit ARM distro - at which point I stopped caring).

* CI: disable reproducibility test
2022-03-27 13:21:15 +02:00

263 lines
9.4 KiB
YAML

on:
push:
tags:
- 'v*' # "v1.2.3"
name: Upload Release Asset
jobs:
build-amd64:
name: Linux AMD64 release asset
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build project
id: make_dist
run: |
make dist-amd64
cd dist
ARCHIVE=$(echo nimbus-eth1_Linux_amd64_*.tar.gz)
echo "::set-output name=archive::"${ARCHIVE}
echo "::set-output name=archive_dir::"${ARCHIVE%.tar.gz}
tar -xzf ${ARCHIVE} ${ARCHIVE%.tar.gz}/build/nimbus.sha512sum
- name: Upload archive artefact
uses: actions/upload-artifact@v2
with:
name: Linux_amd64_archive
path: ./dist/${{ steps.make_dist.outputs.archive }}
retention-days: 2
- name: Upload checksum artefact
uses: actions/upload-artifact@v2
with:
name: Linux_amd64_checksum
path: ./dist/${{ steps.make_dist.outputs.archive_dir }}/build/nimbus.sha512sum
retention-days: 2
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push a Docker image for end users
run: |
cd dist
tar -xzf ${{ steps.make_dist.outputs.archive }}
mv ${{ steps.make_dist.outputs.archive_dir }} ../docker/dist/binaries/nimbus-eth1
cd ../docker/dist/binaries
REFNAME="${{ github.ref }}"
TAG="${REFNAME#refs/tags/}"
DOCKER_BUILDKIT=1 docker build -f Dockerfile.amd64 -t statusim/nimbus-eth1:amd64-${TAG} -t statusim/nimbus-eth1:amd64-latest .
docker push statusim/nimbus-eth1:amd64-${TAG}
docker push statusim/nimbus-eth1:amd64-latest
build-arm64:
name: Linux ARM64 release asset
runs-on: ubuntu-latest
steps:
- name: Install packages
env:
DEBIAN_FRONTEND: "noninteractive"
TZ: "Etc/UTC"
run: |
sudo apt-get -qq update
sudo apt-get -qq -y install binfmt-support qemu-user-static
- name: Checkout code
uses: actions/checkout@v2
- name: Build project
id: make_dist
run: |
make dist-arm64
cd dist
ARCHIVE=$(echo nimbus-eth1_Linux_arm64v8_*.tar.gz)
echo "::set-output name=archive::"${ARCHIVE}
echo "::set-output name=archive_dir::"${ARCHIVE%.tar.gz}
tar -xzf ${ARCHIVE} ${ARCHIVE%.tar.gz}/build/nimbus.sha512sum
- name: Upload archive artefact
uses: actions/upload-artifact@v2
with:
name: Linux_arm64_archive
path: ./dist/${{ steps.make_dist.outputs.archive }}
retention-days: 2
- name: Upload checksum artefact
uses: actions/upload-artifact@v2
with:
name: Linux_arm64_checksum
path: ./dist/${{ steps.make_dist.outputs.archive_dir }}/build/nimbus.sha512sum
retention-days: 2
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push a Docker image for end users
run: |
cd dist
tar -xzf ${{ steps.make_dist.outputs.archive }}
mv ${{ steps.make_dist.outputs.archive_dir }} ../docker/dist/binaries/nimbus-eth1
cd ../docker/dist/binaries
REFNAME="${{ github.ref }}"
TAG="${REFNAME#refs/tags/}"
cp -a /usr/bin/qemu-aarch64-static .
DOCKER_BUILDKIT=1 docker build -f Dockerfile.arm64 -t statusim/nimbus-eth1:arm64-${TAG} -t statusim/nimbus-eth1:arm64-latest .
docker push statusim/nimbus-eth1:arm64-${TAG}
docker push statusim/nimbus-eth1:arm64-latest
build-win64:
name: Windows AMD64 release asset
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build project
id: make_dist
run: |
make dist-win64
cd dist
ARCHIVE=$(echo nimbus-eth1_Windows_amd64_*.tar.gz)
echo "::set-output name=archive::"${ARCHIVE}
echo "::set-output name=archive_dir::"${ARCHIVE%.tar.gz}
tar -xzf ${ARCHIVE} ${ARCHIVE%.tar.gz}/build/nimbus.sha512sum
- name: Upload archive artefact
uses: actions/upload-artifact@v2
with:
name: Windows_amd64_archive
path: ./dist/${{ steps.make_dist.outputs.archive }}
retention-days: 2
- name: Upload checksum artefact
uses: actions/upload-artifact@v2
with:
name: Windows_amd64_checksum
path: ./dist/${{ steps.make_dist.outputs.archive_dir }}/build/nimbus.sha512sum
retention-days: 2
build-macos-amd64:
name: macOS AMD64 release asset
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build project
id: make_dist
run: |
make dist-macos
cd dist
ARCHIVE=$(echo nimbus-eth1_macOS_amd64_*.tar.gz)
echo "::set-output name=archive::"${ARCHIVE}
echo "::set-output name=archive_dir::"${ARCHIVE%.tar.gz}
tar -xzf ${ARCHIVE} ${ARCHIVE%.tar.gz}/build/nimbus.sha512sum
- name: Upload archive artefact
uses: actions/upload-artifact@v2
with:
name: macOS_amd64_archive
path: ./dist/${{ steps.make_dist.outputs.archive }}
retention-days: 2
- name: Upload checksum artefact
uses: actions/upload-artifact@v2
with:
name: macOS_amd64_checksum
path: ./dist/${{ steps.make_dist.outputs.archive_dir }}/build/nimbus.sha512sum
retention-days: 2
build-macos-arm64:
name: macOS ARM64 release asset
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build project
id: make_dist
run: |
make dist-macos-arm64
cd dist
ARCHIVE=$(echo nimbus-eth1_macOS_arm64_*.tar.gz)
echo "::set-output name=archive::"${ARCHIVE}
echo "::set-output name=archive_dir::"${ARCHIVE%.tar.gz}
tar -xzf ${ARCHIVE} ${ARCHIVE%.tar.gz}/build/nimbus.sha512sum
- name: Upload archive artefact
uses: actions/upload-artifact@v2
with:
name: macOS_arm64_archive
path: ./dist/${{ steps.make_dist.outputs.archive }}
retention-days: 2
- name: Upload checksum artefact
uses: actions/upload-artifact@v2
with:
name: macOS_arm64_checksum
path: ./dist/${{ steps.make_dist.outputs.archive_dir }}/build/nimbus.sha512sum
retention-days: 2
prepare-release:
name: Prepare release draft
needs: [build-amd64, build-arm64, build-win64, build-macos-amd64, build-macos-arm64]
runs-on: ubuntu-latest
steps:
- name: Download artefacts
uses: actions/download-artifact@v2
- name: Create release notes
run: |
cat > release_notes.md <<EOF
## Notes
## SHA512 checksums
\`\`\`text
EOF
echo '# Linux AMD64' >> release_notes.md
cat Linux_amd64_checksum/* >> release_notes.md
echo '# Linux ARM64' >> release_notes.md
cat Linux_arm64_checksum/* >> release_notes.md
echo '# Windows AMD64' >> release_notes.md
cat Windows_amd64_checksum/* >> release_notes.md
echo '# macOS AMD64' >> release_notes.md
cat macOS_amd64_checksum/* >> release_notes.md
echo '# macOS ARM64' >> release_notes.md
cat macOS_arm64_checksum/* >> release_notes.md
echo '```' >> release_notes.md
- name: Create release
id: create_release
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
draft: true
prerelease: false
body_path: release_notes.md
files: |
Linux_amd64_archive/*
Linux_arm64_archive/*
Windows_amd64_archive/*
macOS_amd64_archive/*
macOS_arm64_archive/*
- name: Delete artefacts
uses: geekyeggo/delete-artifact@v1
with:
failOnError: false
name: |
Linux_amd64_archive
Linux_amd64_checksum
Linux_arm64_archive
Linux_arm64_checksum
Windows_amd64_archive
Windows_amd64_checksum
macOS_amd64_archive
macOS_amd64_checksum
macOS_arm64_archive
macOS_arm64_checksum
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build multi-arch Docker image
run: |
REFNAME="${{ github.ref }}"
TAG="${REFNAME#refs/tags/}"
docker manifest create \
statusim/nimbus-eth1:multiarch-${TAG} \
--amend statusim/nimbus-eth1:amd64-${TAG} \
--amend statusim/nimbus-eth1:arm64-${TAG}
docker manifest push statusim/nimbus-eth1:multiarch-${TAG}
docker manifest create \
statusim/nimbus-eth1:multiarch-latest \
--amend statusim/nimbus-eth1:amd64-latest \
--amend statusim/nimbus-eth1:arm64-latest
docker manifest push statusim/nimbus-eth1:multiarch-latest