diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index c66f990..276e1b0 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -1,36 +1,78 @@ -name: Docker images +name: Publish Releases to Hub +# When its time to do a release do a full cross platform build for all supported +# architectures and push all of them to Docker Hub. +# Only trigger on semver shaped tags. +# Ref: https://github.com/metcalfc/docker-action-examples/blob/main/.github/workflows/release.yml on: push: tags-ignore: - "invoiceninja-*" jobs: - deploy: - name: Build images + docker: runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 + - name: Checkout + uses: actions/checkout@v2 - - name: Login to DockerHub - run: echo ${{ secrets.DOCKERHUB_PASSWORD }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + - name: Prepare + id: prep + run: | + DOCKER_IMAGE=invoiceninja/invoiceninja + VERSION=edge + if [[ $GITHUB_REF == refs/tags/* ]]; then + VERSION=${GITHUB_REF#refs/tags/} + fi + TAGS="${DOCKER_IMAGE}:${VERSION}" + MAJOR="$(echo "${VERSION}" | cut -d. -f1)" + MINOR="$(echo "${VERSION}" | cut -d. -f2)" + TAGS="$TAGS,${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:${MAJOR}.${MINOR}" + if [[ $VERSION =~ ^5\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + TAGS="$TAGS,${DOCKER_IMAGE}:latest" + fi + echo ::set-output name=tags::${TAGS} + echo ::set-output name=version::${VERSION} + echo ::set-output name=major::${MAJOR} - - name: Get the latest tag - id: vars - run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10}) + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all - - name: Build image from alpine - v5 - run: make build-alpine-v5 TAG="${{steps.vars.outputs.tag}}" + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 - - name: Push alpine-based image - v5 - run: make push-alpine-v5 TAG="${{steps.vars.outputs.tag}}" + - name: Cache Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- - - name: Build image from alpine - v4 - run: make build-alpine TAG="${{steps.vars.outputs.tag}}" + - name: Login to DockerHub + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Push alpine-based image - v4 - run: make push-alpine TAG="${{steps.vars.outputs.tag}}" + - name: Build and push + id: docker_build + uses: docker/build-push-action@v2 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./alpine/${{ steps.prep.outputs.major }}/Dockerfile + build-args: INVOICENINJA_VERSION=${{ steps.prep.outputs.version }} + target: prod + platforms: linux/amd64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.prep.outputs.tags }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache - - name: Logout from DockerHub - run: docker logout + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/Makefile b/Makefile index a4baf94..09aa51b 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ VERSION=$(shell echo ${TAG} | sed "s/-.*//") build-alpine: ifeq ($(IS_V5),) $(info Make: Building "$(VERSION)" tagged images from alpine.) - @docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/Dockerfile . + @docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/4/Dockerfile . # Tag as alpine-4 @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} ${HUB_NAMESPACE}/${IMAGE}:alpine-4 $(info Make: Done.) @@ -42,7 +42,7 @@ endif build-alpine-v5: ifneq ($(IS_V5),) $(info Make: Building "$(VERSION)" tagged images from alpine.) - @docker build -t ${HUB_NAMESPACE}/${IMAGE}:${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/Dockerfile_v5 . + @docker build -t ${HUB_NAMESPACE}/${IMAGE}:${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/5/Dockerfile . @docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:5 @docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:latest $(info Make: Done.) diff --git a/alpine/Dockerfile b/alpine/4/Dockerfile similarity index 97% rename from alpine/Dockerfile rename to alpine/4/Dockerfile index ece2f62..3b37020 100644 --- a/alpine/Dockerfile +++ b/alpine/4/Dockerfile @@ -2,7 +2,7 @@ ARG PHP_VERSION=7.2 ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/ ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/ -FROM php:${PHP_VERSION}-fpm-alpine +FROM php:${PHP_VERSION}-fpm-alpine as prod LABEL maintainer="David Bomba " @@ -63,6 +63,7 @@ RUN curl -o /tmp/ninja.zip -L https://download.invoiceninja.com/ninja-v${INVOICE && rm -rf /var/www/app/docs /var/www/app/tests # Override the environment settings from projects .env file +ENV IS_DOCKER true ENV LOG errorlog ENV SELF_UPDATER_SOURCE '' diff --git a/alpine/Dockerfile_v5 b/alpine/5/Dockerfile similarity index 90% rename from alpine/Dockerfile_v5 rename to alpine/5/Dockerfile index cd8d5e1..2c45ed2 100644 --- a/alpine/Dockerfile_v5 +++ b/alpine/5/Dockerfile @@ -3,7 +3,7 @@ ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/ ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/ # Get Invoice Ninja and install nodejs packages -FROM node:lts-alpine as frontend +FROM node:lts-alpine as build ARG INVOICENINJA_VERSION ARG BAK_STORAGE_PATH ARG BAK_PUBLIC_PATH @@ -31,19 +31,27 @@ RUN npm install --production \ && mv /var/www/app/public $BAK_PUBLIC_PATH # Prepare php image -FROM php:${PHP_VERSION}-fpm-alpine +FROM php:${PHP_VERSION}-fpm-alpine as prod ARG INVOICENINJA_VERSION ARG BAK_STORAGE_PATH ARG BAK_PUBLIC_PATH -ENV INVOICENINJA_VERSION $INVOICENINJA_VERSION -ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH -ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH LABEL maintainer="David Bomba " WORKDIR /var/www/app -COPY --from=frontend /var/www/app /var/www/app +## Create user +ARG UID=1500 +ENV INVOICENINJA_USER=invoiceninja + +RUN addgroup --gid=$UID -S "$INVOICENINJA_USER" \ + && adduser --uid=$UID \ + --disabled-password \ + --gecos "" \ + --home "$(pwd)" \ + --ingroup "$INVOICENINJA_USER" \ + --no-create-home \ + "$INVOICENINJA_USER" RUN mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini @@ -71,28 +79,25 @@ RUN set -eux; \ chromium \ ttf-freefont +# Copy files COPY entrypoint.sh /usr/local/bin/docker-entrypoint COPY ./config/php/php.ini /usr/local/etc/php/conf.d/in-php.ini COPY ./config/supervisor/* / -## Separate user -ARG UID=1500 -ENV INVOICENINJA_USER=invoiceninja +# Set up app +ENV INVOICENINJA_VERSION $INVOICENINJA_VERSION +ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH +ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH +COPY --from=build /var/www/app /var/www/app -RUN addgroup --gid=$UID -S "$INVOICENINJA_USER" \ - && adduser --uid=$UID \ - --disabled-password \ - --gecos "" \ - --home "$(pwd)" \ - --ingroup "$INVOICENINJA_USER" \ - --no-create-home \ - "$INVOICENINJA_USER" \ - && chmod +x /usr/local/bin/docker-entrypoint \ +RUN chmod +x /usr/local/bin/docker-entrypoint \ && chmod +x /shutdown.sh \ && chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" /var/www/app USER $UID +# Do not remove this ENV +ENV IS_DOCKER true RUN /usr/local/bin/composer install --no-dev --quiet # Override the environment settings from projects .env file