diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..a2ed39c --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,21 @@ +version: 2 +jobs: + build: + machine: true + steps: + - checkout + #- run: + # name : Getting docker + # command: curl https://get.docker.com | sh + - run: + name: Enabling qemu + command: docker run --rm --privileged multiarch/qemu-user-static:register --reset + - run: + name: Building arm based image. + command: docker build -t arm-test . + - run: + name: Listing built images + command: docker images + # - run: + # name: Running arm based image. + # command: docker run --rm arm-test \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index f904a29..45e9474 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,51 @@ sudo: required +language: c + services: - docker +addons: + apt: + packages: + - docker-ce + - qemu-user-static + env: global: - - NAME=phusion/baseimage # - VERSION=${TRAVIS_TAG} - VERSION=${TRAVIS_BRANCH} + - DOCKER_CLI_EXPERIMENTAL=enabled + - QEMU_VERSION=v4.0.0 + + matrix: + # PLATFORM = Base image architecture to be used + # QEMU_ARCH = qemu binary to be downloaded from https://github.com/multiarch/qemu-user-static/releases + # TAG_ARCH = Tag to be applied to the image when upload to DockerHub + - PLATFORM=amd64 QEMU_ARCH=amd64 TAG_ARCH=amd64 + - PLATFORM=arm64 QEMU_ARCH=aarch64 TAG_ARCH=arm64 + - PLATFORM=arm QEMU_ARCH=arm TAG_ARCH=arm + +stage: Compile + +before_script: + - echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json + - sudo service docker restart script: + - docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}"; - make build test -after_success: - - docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}"; - docker push ${NAME}:${VERSION}; - # - if [ "${TRAVIS_BRANCH}" == "master" ]; then - # docker tag ${NAME}:${VERSION} ${NAME}:latest - # docker push ${NAME}:latest; - # fi + - if [[ $TRAVIS_PULL_REQUEST == 'false' ]]; then + make release; + fi + +jobs: + include: + - stage: deploy + env: + - ARCHS="amd64 arm64 arm" + script: + - echo $NAME:$VERSION_TAG + - echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin + - ./build-multiarch.sh diff --git a/Makefile b/Makefile index da0e6be..c1aa614 100644 --- a/Makefile +++ b/Makefile @@ -1,35 +1,48 @@ +VERSION ?= 0.11 ifdef BASE_IMAGE BUILD_ARG = --build-arg BASE_IMAGE=$(BASE_IMAGE) -ifndef NAME - NAME = phusion/baseimage-$(subst :,-,${BASE_IMAGE}) -endif + ifndef NAME + NAME = phusion/baseimage-$(subst :,-,${BASE_IMAGE}) + endif else NAME ?= phusion/baseimage endif -VERSION ?= 0.11 - +ifdef TAG_ARCH + # VERSION_ARG = $(VERSION)-$(subst /,-,$(subst :,-,${BASE_IMAGE}))-$(TAG_ARCH) + VERSION_ARG = $(VERSION)-$(TAG_ARCH) + LATEST_VERSION = latest-$(TAG_ARCH) +else + # VERSION_ARG = $(VERSION)-$(subst /,-,$(subst :,-,${BASE_IMAGE})) + VERSION_ARG = $(VERSION) + LATEST_VERSION = latest +endif +VERSION_ARG ?= $(VERSION) .PHONY: all build test tag_latest release ssh all: build build: - docker build -t $(NAME):$(VERSION) $(BUILD_ARG) --rm image + ./build.sh + docker build --no-cache -t $(NAME):$(VERSION_ARG) $(BUILD_ARG) --build-arg QEMU_ARCH=$(QEMU_ARCH) --platform $(PLATFORM) --rm image test: - env NAME=$(NAME) VERSION=$(VERSION) ./test/runner.sh + env NAME=$(NAME) VERSION=$(VERSION_ARG) ./test/runner.sh tag_latest: - docker tag $(NAME):$(VERSION) $(NAME):latest + docker tag $(NAME):$(VERSION_ARG) $(NAME):$(LATEST_VERSION) + +tag_multiarch_latest: + env TAG_LATEST=true ./build-multiarch.sh release: test tag_latest - @if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi + @if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION_ARG); then echo "$(NAME) version $(VERSION_ARG) is not yet built. Please run 'make build'"; false; fi docker push $(NAME) @echo "*** Don't forget to create a tag by creating an official GitHub release." ssh: SSH_COMMAND?= ssh: - ID=$$(docker ps | grep -F "$(NAME):$(VERSION)" | awk '{ print $$1 }') && \ + ID=$$(docker ps | grep -F "$(NAME):$(VERSION_ARG)" | awk '{ print $$1 }') && \ if test "$$ID" = ""; then echo "Container is not running."; exit 1; fi && \ tools/docker-ssh $$ID ${SSH_COMMAND} diff --git a/build-multiarch.sh b/build-multiarch.sh new file mode 100755 index 0000000..e0d70f6 --- /dev/null +++ b/build-multiarch.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -e +set -x + +if [[ $TRAVIS_PULL_REQUEST == 'false' ]]; then + +for arch in $ARCHS; do + echo ${arch} + docker pull $NAME:$VERSION-${arch} + + if [[ $TAG_LATEST != 'true' ]]; then + docker manifest create --amend $NAME:$VERSION $NAME:$VERSION-${arch} + docker manifest annotate $NAME:$VERSION $NAME:$VERSION-${arch} --arch ${arch} + else + docker manifest create --amend $NAME:latest $NAME:$VERSION-${arch} + docker manifest annotate $NAME:latest $NAME:$VERSION-${arch} --arch ${arch} + fi +done + +echo "Push manifests" +if [[ $TAG_LATEST != 'true' ]]; then + docker manifest push $NAME:$VERSION +else + docker manifest push $NAME:latest +fi + +fi \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..186d049 --- /dev/null +++ b/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +# # Prepare qemu +# if [ '$QEMU_ARCH' != 'amd64' ]; then +# # docker run --rm --privileged multiarch/qemu-user-static:register --reset +# fi + +# Get qemu package +echo "Getting qemu package for $QEMU_ARCH" + +# Fake qemu for amd64 builds to avoid breaking COPY in Dockerfile +if [ $QEMU_ARCH == 'amd64' ]; then + touch x86_64_qemu-"$QEMU_ARCH"-static.tar.gz + mv x86_64_qemu-${QEMU_ARCH}-static.tar.gz image +else + curl -L -o x86_64_qemu-"$QEMU_ARCH"-static.tar.gz https://github.com/multiarch/qemu-user-static/releases/download/"$QEMU_VERSION"/x86_64_qemu-"$QEMU_ARCH"-static.tar.gz + mv x86_64_qemu-${QEMU_ARCH}-static.tar.gz image +fi diff --git a/image/Dockerfile b/image/Dockerfile index 07a7241..13baa59 100644 --- a/image/Dockerfile +++ b/image/Dockerfile @@ -2,6 +2,9 @@ ARG BASE_IMAGE=ubuntu:18.04 FROM $BASE_IMAGE MAINTAINER Phusion +ARG QEMU_ARCH +ADD x86_64_qemu-${QEMU_ARCH}-static.tar.gz /usr/bin + COPY . /bd_build RUN /bd_build/prepare.sh && \