diff --git a/.github/workflows/on-tag.yml b/.github/workflows/on-tag.yml new file mode 100644 index 0000000..7dd6fdd --- /dev/null +++ b/.github/workflows/on-tag.yml @@ -0,0 +1,146 @@ +name: Build & deploy ElectrumX + +on: + push: + tags: + - '*' + +jobs: + build: + name: Build ElectrumX + runs-on: ubuntu-18.04 + + # NOTE: qemu v3.1.1 used instead of currently newest v4.1.0, because v4 is **much** slower for aarch64, see: + # https://github.com/meeDamian/docker-berkeleydb/commit/9e87d11314c2522726497f0c6059e61a31298e7f/checks + env: + QEMU_VERSION: v3.1.1 + DOCKER_BUILDKIT: 1 + + strategy: + matrix: + arch: + - arm32v7 + - arm64 + - amd64 + + steps: + - uses: actions/checkout@v1.0.0 + + - name: Setup environment + run: | + VERSION="$(echo "${GITHUB_REF}" | awk -F/ '{print $NF}' | tr -d v)" + echo ::set-env name=VERSION::"${VERSION}" + echo ::set-env name=DIR::"$(echo "${VERSION}" | cut -d. -f-2)" + - name: Register self-compiled qemu + if: matrix.arch != 'amd64' + run: docker run --rm --privileged "meedamian/simple-qemu:${QEMU_VERSION}-${{matrix.arch}}" -p yes + + # Alter `Dockerfile` to reference used architecture/image combos explicitly. Places changed are: + # * all `FROM` statements (ex. `FROM alpine…` -> `FROM arm64v8/alpine…`) + # `sed` `--expression`s change it in the following way: + # Matches all occurrences of `FROM alpine`, and injects arch prefix before `alpine`, ex: `arm64v8/alpine` + - name: Change Dockerfile to use arch-specific base images + if: matrix.arch != 'amd64' + run: | + CPU="${{matrix.arch}}" + if [[ "${CPU}" == "arm64" ]]; then + CPU="arm64v8" + fi + sed -i Dockerfile \ + -e "s|^FROM \(.*\)|FROM $CPU/\1|g" + - name: Build ElectrumX + run: docker build . --build-arg "VERSION=${VERSION}" --tag electrumx + - name: Print OS info + run: docker run --rm --entrypoint=uname electrumx -a + + - name: Print ElectrumX version + run: docker run --rm electrumx echo $SERVER_SUBVERSION + + - name: Save built image into a .tgz file + run: | + mkdir -p images/ + docker tag electrumx "electrumx:${{matrix.arch}}" + docker save "electrumx:${{matrix.arch}}" | gzip > "images/electrumx-${{matrix.arch}}.tgz" + - name: Print sha256sum of built image + run: sha256sum images/* + + - name: Upload built image + uses: actions/upload-artifact@v1.0.0 + with: + name: images + path: images/ + + + docker-hub-push: + name: Tag & deploy to Docker Hub. Only after successful build and on a git-tag push + + runs-on: ubuntu-18.04 + needs: build + steps: + - uses: actions/checkout@v1.0.0 + + - name: Setup environment + run: | + echo ::set-env name=DOCKER_USER::"${GITHUB_ACTOR,,}" + echo ::set-env name=SLUG::"$(echo ${GITHUB_REPOSITORY,,} | sed 's/docker-//')" + echo ::set-env name=VERSION::"$(echo "${GITHUB_REF}" | awk -F/ '{print $NF}')" + - name: Enable manifests + run: | + mkdir -p ~/.docker + echo '{ "experimental": "enabled" }' > ~/.docker/config.json + sudo systemctl restart docker + docker version + - name: Login to Docker Hub + run: | + echo "Logging in as ${DOCKER_USER}…" + echo "${{ secrets.DOCKER_TOKEN }}" | docker login -u="${DOCKER_USER}" --password-stdin + - name: Download all build artifacts + uses: actions/download-artifact@v1.0.0 + with: + name: images + + - name: Print sha256sum of all images + run: sha256sum images/* + + - name: Load images locally + run: ls images/ | xargs -I % docker load -i "images/%" + + # No short tags. IMO electrumx version should always be specified exactly, and explicitly. + - name: Version-tag all images + run: docker images electrumx --format "{{.Tag}}" | xargs -I % docker tag "electrumx:%" "${SLUG}:${VERSION}-%" + + - name: List all tagged images + run: docker images "${SLUG}" + + - name: Push all images + run: docker images "${SLUG}" --format "{{.Repository}}:{{.Tag}}" | xargs -I % docker push % + + - name: Create manifest + run: > + docker -D manifest create "${SLUG}:${VERSION}" \ + "${SLUG}:${VERSION}-amd64" \ + "${SLUG}:${VERSION}-arm64" \ + "${SLUG}:${VERSION}-arm32v7" + - name: Annotate arm32v7 + run: docker manifest annotate "${SLUG}:${VERSION}" "${SLUG}:${VERSION}-arm32v7" --os linux --arch arm --variant v7 + + - name: Annotate arm64v8 + run: docker manifest annotate "${SLUG}:${VERSION}" "${SLUG}:${VERSION}-arm64" --os linux --arch arm64 --variant v8 + + - name: Push manifest + run: docker manifest push "${SLUG}:${VERSION}" + + - name: Sync README.md and Description to Docker Hub + uses: meeDamian/sync-readme@v1.0.5 + with: + pass: ${{secrets.DOCKER_TOKEN}} + slug: lukechilds/electrumx + # currently hardcoded description as fetching from GH fails + description: Run an Electrum server with one command + + - name: Upload images to Github Release + uses: meeDamian/github-release@v1.0.1 + with: + token: ${{secrets.GITHUB_TOKEN}} + gzip: false + files: images/*