Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 146 additions & 0 deletions .github/workflows/on-tag.yml
Original file line number Diff line number Diff line change
@@ -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/[email protected]

- 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/[email protected]
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/[email protected]

- 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/[email protected]
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/[email protected]
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/[email protected]
with:
token: ${{secrets.GITHUB_TOKEN}}
gzip: false
files: images/*