From 56dd70cf4a24decd35b2b817242a752c478289a7 Mon Sep 17 00:00:00 2001 From: Dimitri Huisman Date: Wed, 17 Nov 2021 20:00:04 +0000 Subject: [PATCH 1/5] Implement versioning for CI/CD workflow (see #1182). --- .github/workflows/CI.yml | 332 +++++++++++++++++++++---- RELEASE_TEMPLATE.md | 10 + core/admin/Dockerfile | 4 + core/dovecot/Dockerfile | 5 +- core/nginx/Dockerfile | 4 + core/postfix/Dockerfile | 5 + core/rspamd/Dockerfile | 5 +- docs/Dockerfile | 4 + optional/clamav/Dockerfile | 4 + optional/fetchmail/Dockerfile | 4 + optional/postgresql/Dockerfile | 4 + optional/radicale/Dockerfile | 4 + optional/traefik-certdumper/Dockerfile | 4 + optional/unbound/Dockerfile | 4 + setup/Dockerfile | 4 + tests/build.yml | 109 +++++--- tests/deploy.sh | 46 +++- towncrier/newsfragments/1182.feature | 10 + webmails/rainloop/Dockerfile | 4 + webmails/roundcube/Dockerfile | 5 +- 20 files changed, 482 insertions(+), 89 deletions(-) create mode 100644 RELEASE_TEMPLATE.md create mode 100644 towncrier/newsfragments/1182.feature diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index dba30722..2a0ff932 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -9,10 +9,6 @@ on: - '1.7' - '1.8' - master - # version tags, e.g. 1.7.1 - - '[1-9].[0-9].[0-9]' - # pre-releases, e.g. 1.8-pre1 - - 1.8-pre[0-9] # test branches, e.g. test-debian - test-* @@ -28,6 +24,18 @@ on: # The docker repository for test images. Only used for the branch TESTING (BORS try). # Add the above secrets to your github repo to determine where the images will be pushed. ################################################ +# Code block that is used as one liner. +##!/bin/bash +#version=$( git tag --list "{{ env.MAILU_VERSION }}.*" | tail -1 ) +#root_version=${version:0:3} +#patch_version=${version:4:4} +#if [ "$patch_version" == "" ] +#then +# pinned_version={{ env.MAILU_VERSION }}.0 +#else +# pinned_version=$root_version.$(expr $patch_version + 1) +#fi +#echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV jobs: build: @@ -35,27 +43,49 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV #For branch TESTING, we set the image tag to PR-xxxx - - name: Derive MAILU_VERSION for branch testing + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'staging' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -76,7 +106,7 @@ jobs: - name: Build all docker images env: MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} run: docker-compose -f tests/build.yml build - name: Save all docker images @@ -89,26 +119,49 @@ jobs: - build steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV - - name: Derive MAILU_VERSION for branch testing + #For branch TESTING, we set the image tag to PR-xxxx + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -128,7 +181,7 @@ jobs: run: python tests/compose/test.py core 2 env: MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} test-fetchmail: @@ -138,26 +191,49 @@ jobs: - build steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV - - name: Derive MAILU_VERSION for branch testing + #For branch TESTING, we set the image tag to PR-xxxx + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -177,7 +253,7 @@ jobs: run: python tests/compose/test.py fetchmail 2 env: MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} test-filters: @@ -187,26 +263,49 @@ jobs: - build steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV - - name: Derive MAILU_VERSION for branch testing + #For branch TESTING, we set the image tag to PR-xxxx + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -226,7 +325,7 @@ jobs: run: python tests/compose/test.py filters 3 env: MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} test-rainloop: @@ -236,26 +335,49 @@ jobs: - build steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV - - name: Derive MAILU_VERSION for branch testing + #For branch TESTING, we set the image tag to PR-xxxx + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -275,7 +397,7 @@ jobs: run: python tests/compose/test.py rainloop 2 env: MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} test-roundcube: @@ -285,26 +407,49 @@ jobs: - build steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV - - name: Derive MAILU_VERSION for branch testing + #For branch TESTING, we set the image tag to PR-xxxx + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -324,7 +469,7 @@ jobs: run: python tests/compose/test.py roundcube 2 env: MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} test-webdav: @@ -334,26 +479,49 @@ jobs: - build steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV - - name: Derive MAILU_VERSION for branch testing + #For branch TESTING, we set the image tag to PR-xxxx + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -373,7 +541,7 @@ jobs: run: python tests/compose/test.py webdav 2 env: MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} deploy: @@ -389,27 +557,49 @@ jobs: - test-webdav steps: - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 - name: Extract branch name shell: bash run: | echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV #For branch TESTING, we set the image tag to PR-xxxx - - name: Derive MAILU_VERSION for branch testing + - name: Derive MAILU_VERSION and PINNED_MAILU_VERSION for branch testing if: ${{ env.BRANCH == 'testing' }} shell: bash env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + DOCKER_ORG_TESTS: ${{ secrets.DOCKER_ORG_TESTS }} run: | echo "MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG_TESTS }}" >> $GITHUB_ENV + echo "PINNED_MAILU_VERSION=pr-${COMMIT_MESSAGE//[!0-9]/}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG_TESTS" >> $GITHUB_ENV - name: Derive MAILU_VERSION for other branches than testing if: ${{ env.BRANCH != 'testing' }} shell: bash env: - MAILU_BRANCH: ${{ env.BRANCH }} + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} run: | - echo "MAILU_VERSION=${{ env.MAILU_BRANCH }}" >> $GITHUB_ENV - echo "DOCKER_ORG=${{ secrets.DOCKER_ORG }}" >> $GITHUB_ENV + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for staging + if: ${{ env.BRANCH == 'staging' }} + shell: bash + run: | + echo "PINNED_MAILU_VERSION=staging" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for master + if: ${{ env.BRANCH == 'master' }} + shell: bash + env: + GITHUB_SHA: ${{ env.GITHUB_SHA }} + run: | + echo "PINNED_MAILU_VERSION=$GITHUB_SHA" >> $GITHUB_ENV - name: Create folder for storing images run: | sudo mkdir -p /images @@ -430,13 +620,49 @@ jobs: DOCKER_PW: ${{ secrets.Docker_Password }} DOCKER_ORG: ${{ env.DOCKER_ORG }} MAILU_VERSION: ${{ env.MAILU_VERSION }} - TRAVIS_BRANCH: ${{ env.BRANCH }} + PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} + BRANCH: ${{ env.BRANCH }} run: bash tests/deploy.sh + tag-release: + runs-on: ubuntu-latest + needs: + - deploy + steps: + - uses: actions/checkout@v2 + with: + # fetch-depth 0 is required to also retrieve all tags. + fetch-depth: 0 + - name: Extract branch name + shell: bash + run: | + echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV + - name: Derive MAILU_VERSION amd DOCKER_ORG + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'staging' && env.BRANCH != 'master' }} + shell: bash + env: + DOCKER_ORG: ${{ secrets.DOCKER_ORG }} + run: | + echo "MAILU_VERSION=${{ env.BRANCH }}" >> $GITHUB_ENV + echo "DOCKER_ORG=$DOCKER_ORG" >> $GITHUB_ENV + - name: Derive PINNED_MAILU_VERSION for normal release x.y + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'staging' && env.BRANCH != 'master' }} + shell: bash + run: | + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + - name: Tag and create release + if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'staging' && env.BRANCH != 'master' && env.PINNED_MAILU_VERSION != '' }} + uses: ncipollo/release-action@v1 + with: + bodyFile: "RELEASE_TEMPLATE.md" + commit: ${{ env.GITHUB_SHA }} + tag: ${{ env.PINNED_MAILU_VERSION }} + token: ${{ secrets.GITHUB_TOKEN }} + # This job is watched by bors. It only complets if building,testing and deploy worked. ci-success: name: CI-Done - #Returns true when none of the **previous** steps have failed or been canceled. + #Returns true when none of the **previous** steps have failed or have been canceled. if: ${{ success() }} needs: - deploy diff --git a/RELEASE_TEMPLATE.md b/RELEASE_TEMPLATE.md new file mode 100644 index 00000000..48178938 --- /dev/null +++ b/RELEASE_TEMPLATE.md @@ -0,0 +1,10 @@ +This is a new automatic release of Mailu. The new version can be seen in the tag name. +The main version X.Y (e.g. 1.8) will always reflect the latest version of the branch. To update your Mailu installation simply pull the latest images `docker-compose pull && docker-compose up -d`. +The pinned version X.Y.Z (e.g. 1.8.1) is not updated. It is pinned to the commit that was used for creating this release. You can use a pinned version to make sure your Mailu installation is not suddenly updated when recreating containers. The pinned version allows the user to manually update. It also allows to go back to a previous pinned version. + +To check what was changed: +- Go to https://github.com/Mailu/Mailu/tree/master/towncrier/newsfragments +- Change the branch to the tag of this release. +- Read the news fragment files to check what was changed. + +The release notes of the original release can be accessed via menu item 'Release notes' on [mailu.io](https://mailu.io/). \ No newline at end of file diff --git a/core/admin/Dockerfile b/core/admin/Dockerfile index 1958ae61..ac8ae9fc 100644 --- a/core/admin/Dockerfile +++ b/core/admin/Dockerfile @@ -21,10 +21,14 @@ RUN set -eu \ # Actual application FROM $DISTRO +ARG VERSION COPY --from=balenalib/rpi-alpine:3.14 /usr/bin/qemu-arm-static /usr/bin/qemu-arm-static ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN set -eu \ && apk add --no-cache python3 py3-pip py3-wheel git bash tzdata \ diff --git a/core/dovecot/Dockerfile b/core/dovecot/Dockerfile index 7a2dbdc1..791b6c04 100644 --- a/core/dovecot/Dockerfile +++ b/core/dovecot/Dockerfile @@ -11,9 +11,12 @@ RUN git clone https://github.com/grosjo/fts-xapian.git \ && make install FROM $DISTRO - +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict py3-yarl tzdata \ diff --git a/core/nginx/Dockerfile b/core/nginx/Dockerfile index d8899144..e5d30073 100644 --- a/core/nginx/Dockerfile +++ b/core/nginx/Dockerfile @@ -1,8 +1,12 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict \ diff --git a/core/postfix/Dockerfile b/core/postfix/Dockerfile index 9f0cc701..5c6238b3 100644 --- a/core/postfix/Dockerfile +++ b/core/postfix/Dockerfile @@ -1,8 +1,13 @@ ARG DISTRO=alpine:3.14.2 + FROM $DISTRO +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict py3-yarl tzdata \ diff --git a/core/rspamd/Dockerfile b/core/rspamd/Dockerfile index 33174c1a..d1172ffc 100644 --- a/core/rspamd/Dockerfile +++ b/core/rspamd/Dockerfile @@ -1,8 +1,11 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO - +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict tzdata \ diff --git a/docs/Dockerfile b/docs/Dockerfile index 289697da..b3d1af01 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -19,7 +19,11 @@ RUN apk add --no-cache --virtual .build-deps \ FROM nginx:1.21-alpine ARG version=master +ARG pinned_version=master ENV VERSION=$version +ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $pinned_version >> /version COPY ./nginx.conf /etc/nginx/conf.d/default.conf COPY --from=build /build/$VERSION /build/$VERSION diff --git a/optional/clamav/Dockerfile b/optional/clamav/Dockerfile index e17d2d70..c68b8888 100644 --- a/optional/clamav/Dockerfile +++ b/optional/clamav/Dockerfile @@ -1,8 +1,12 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip bash tzdata \ diff --git a/optional/fetchmail/Dockerfile b/optional/fetchmail/Dockerfile index 068a5dce..3c670bca 100644 --- a/optional/fetchmail/Dockerfile +++ b/optional/fetchmail/Dockerfile @@ -1,8 +1,12 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip bash tzdata \ diff --git a/optional/postgresql/Dockerfile b/optional/postgresql/Dockerfile index 3ddbb40a..14d879f3 100644 --- a/optional/postgresql/Dockerfile +++ b/optional/postgresql/Dockerfile @@ -1,8 +1,12 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip bash py3-multidict tzdata \ diff --git a/optional/radicale/Dockerfile b/optional/radicale/Dockerfile index 4eb8d5a7..2eee6915 100644 --- a/optional/radicale/Dockerfile +++ b/optional/radicale/Dockerfile @@ -1,8 +1,12 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip bash tzdata \ diff --git a/optional/traefik-certdumper/Dockerfile b/optional/traefik-certdumper/Dockerfile index 506c09c2..1aecc48e 100644 --- a/optional/traefik-certdumper/Dockerfile +++ b/optional/traefik-certdumper/Dockerfile @@ -1,7 +1,11 @@ FROM ldez/traefik-certs-dumper +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + RUN apk --no-cache add inotify-tools util-linux bash tzdata COPY run.sh / diff --git a/optional/unbound/Dockerfile b/optional/unbound/Dockerfile index bf5d4840..501d562a 100644 --- a/optional/unbound/Dockerfile +++ b/optional/unbound/Dockerfile @@ -1,8 +1,12 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # python3 shared with most images RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict tzdata \ diff --git a/setup/Dockerfile b/setup/Dockerfile index e0f685ee..0635566b 100644 --- a/setup/Dockerfile +++ b/setup/Dockerfile @@ -1,5 +1,9 @@ ARG DISTRO=alpine:3.14.2 FROM $DISTRO +ARG VERSION +ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version RUN mkdir -p /app WORKDIR /app diff --git a/tests/build.yml b/tests/build.yml index eda5550c..a61277ba 100644 --- a/tests/build.yml +++ b/tests/build.yml @@ -3,69 +3,114 @@ version: '3' services: front: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-local} - build: ../core/nginx + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${PINNED_MAILU_VERSION:-local} + build: + context: ../core/nginx + args: + VERSION: ${PINNED_MAILU_VERSION:-local} resolver: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}unbound:${MAILU_VERSION:-local} - build: ../optional/unbound + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}unbound:${PINNED_MAILU_VERSION:-local} + build: + context: ../optional/unbound + args: + VERSION: ${PINNED_MAILU_VERSION:-local} imap: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-local} - build: ../core/dovecot + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${PINNED_MAILU_VERSION:-local} + build: + context: ../core/dovecot + args: + VERSION: ${PINNED_MAILU_VERSION:-local} smtp: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-local} - build: ../core/postfix + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${PINNED_MAILU_VERSION:-local} + build: + context: ../core/postfix + args: + VERSION: ${PINNED_MAILU_VERSION:-local} antispam: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-local} - build: ../core/rspamd + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${PINNED_MAILU_VERSION:-local} + build: + context: ../core/rspamd + args: + VERSION: ${PINNED_MAILU_VERSION:-local} antivirus: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}clamav:${MAILU_VERSION:-local} - build: ../optional/clamav + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}clamav:${PINNED_MAILU_VERSION:-local} + build: + context: ../optional/clamav + args: + VERSION: ${PINNED_MAILU_VERSION:-local} webdav: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}radicale:${MAILU_VERSION:-local} - build: ../optional/radicale + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}radicale:${PINNED_MAILU_VERSION:-local} + build: + context: ../optional/radicale + args: + VERSION: ${PINNED_MAILU_VERSION:-local} traefik-certdumper: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}traefik-certdumper:${MAILU_VERSION:-local} - build: ../optional/traefik-certdumper + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}traefik-certdumper:${PINNED_MAILU_VERSION:-local} + build: + context: ../optional/traefik-certdumper + args: + VERSION: ${PINNED_MAILU_VERSION:-local} admin: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-local} - build: ../core/admin + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${PINNED_MAILU_VERSION:-local} + build: + context: ../core/admin + args: + VERSION: ${PINNED_MAILU_VERSION:-local} postgresql: - image: ${DOCKER_ORG:-mailu}/postgresql:${MAILU_VERSION:-local} - build: ../optional/postgresql + image: ${DOCKER_ORG:-mailu}/postgresql:${PINNED_MAILU_VERSION:-local} + build: + context: ../optional/postgresql + args: + VERSION: ${PINNED_MAILU_VERSION:-local} roundcube: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}roundcube:${MAILU_VERSION:-local} - build: ../webmails/roundcube + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}roundcube:${PINNED_MAILU_VERSION:-local} + build: + context: ../webmails/roundcube + args: + VERSION: ${PINNED_MAILU_VERSION:-local} rainloop: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rainloop:${MAILU_VERSION:-local} - build: ../webmails/rainloop + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rainloop:${PINNED_MAILU_VERSION:-local} + build: + context: ../webmails/rainloop + args: + VERSION: ${PINNED_MAILU_VERSION:-local} fetchmail: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}fetchmail:${MAILU_VERSION:-local} - build: ../optional/fetchmail + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}fetchmail:${PINNED_MAILU_VERSION:-local} + build: + context: ../optional/fetchmail + args: + VERSION: ${PINNED_MAILU_VERSION:-local} none: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}none:${MAILU_VERSION:-local} - build: ../core/none + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}none:${PINNED_MAILU_VERSION:-local} + build: + context: ../core/none + args: + VERSION: ${PINNED_MAILU_VERSION:-local} docs: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}docs:${MAILU_VERSION:-local} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}docs:${PINNED_MAILU_VERSION:-local} build: context: ../docs args: version: ${MAILU_VERSION:-local} + pinned_version: ${PINNED_MAILU_VERSION:-local} setup: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}setup:${MAILU_VERSION:-local} - build: ../setup - + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}setup:${PINNED_MAILU_VERSION:-local} + build: + context: ../setup + args: + VERSION: ${PINNED_MAILU_VERSION:-local} diff --git a/tests/deploy.sh b/tests/deploy.sh index abb37b6b..6913e404 100755 --- a/tests/deploy.sh +++ b/tests/deploy.sh @@ -1,7 +1,51 @@ #!/bin/bash # Skip deploy for staging branch -[ "$TRAVIS_BRANCH" = "staging" ] && exit 0 +[ "$BRANCH" = "staging" ] && exit 0 docker login -u $DOCKER_UN -p $DOCKER_PW + +if [ "$BRANCH" = "testing" ] +then + docker-compose -f tests/build.yml push + exit 0 +fi + +#Deploy for main releases +#Images are built with tag PINNED_MAILU_VERSION (x.y.z). +#We are tagging them as well with MAILU_VERSION (x.y) +#After that, both tags are pushed to the docker repository. +if [ "$PINNED_MAILU_VERSION" != "" ] && [ "$BRANCH" != "master" ] +then + images=$(docker-compose -f tests/build.yml config | grep 'image: ' | awk -F ':' '{ print $2 }') + for image in $images + do + docker tag "${image}":"${PINNED_MAILU_VERSION}" "${image}":${MAILU_VERSION} + done +#Push PINNED_MAILU_VERSION images + docker-compose -f tests/build.yml push +#Push MAILU_VERSION images + PINNED_MAILU_VERSION=$MAILU_VERSION + docker-compose -f tests/build.yml push + exit 0 +fi + +#Deploy for master. For master we only publish images with tag master +#Images are built with tag PINNED_MAILU_VERSION (commit hash). +#We are tagging them as well with MAILU_VERSION (master) +#Then we publish the images with tag master +if [ "$PINNED_MAILU_VERSION" != "" ] && [ "$BRANCH" == "master" ] +then + images=$(docker-compose -f tests/build.yml config | grep 'image: ' | awk -F ':' '{ print $2 }') + for image in $images + do + docker tag "${image}":"${PINNED_MAILU_VERSION}" "${image}":${MAILU_VERSION} + done +#Push MAILU_VERSION images + PINNED_MAILU_VERSION=$MAILU_VERSION + docker-compose -f tests/build.yml push + exit 0 +fi + +#Fallback in case $PINNED_MAILU_VERSION is empty. This should never execute. docker-compose -f tests/build.yml push diff --git a/towncrier/newsfragments/1182.feature b/towncrier/newsfragments/1182.feature new file mode 100644 index 00000000..51ff61cb --- /dev/null +++ b/towncrier/newsfragments/1182.feature @@ -0,0 +1,10 @@ +Use semantic versioning for building releases. +- Add versioning (tagging) for branch x.y (1.8). E.g. 1.8.0, 1.8.1 etc. + - docker repo will contain x.y (latest) and x.y.z (pinned version) images. + - The X.Y.Z tag is incremented automatically. E.g. if 1.8.0 already exists, then the next merge on 1.8 will result in the new tag 1.8.1 being used. +- Make the version available in the image. + - For X.Y and X.Y.Z write the version (X.Y.Z) into /version on the image and add a label with version=X.Y.Z + - This means that the latest X.Y image shows the pinned version (X.Y.Z e.g. 1.8.1) it was based on. Via the tag X.Y.Z you can see the commit hash that triggered the built. + - For master write the commit hash into /version on the image and add a label with version={commit hash} +- Automatic releases. For x.y triggered builts (e.g. merge on 1.9) do a new github release for the pinned x.y.z (e.g. 1.9.2). + - Release shows a static message (see RELEASE_TEMPLATE.md) that explains how to reach the newsfragments folder and change the branch to the tag (x.y.z) mentioned in the release. Now you can get the changelog by reading all newsfragment files in this folder. \ No newline at end of file diff --git a/webmails/rainloop/Dockerfile b/webmails/rainloop/Dockerfile index 02910e39..8039f69a 100644 --- a/webmails/rainloop/Dockerfile +++ b/webmails/rainloop/Dockerfile @@ -2,10 +2,14 @@ ARG ARCH="" # NOTE: only add file if building for arm FROM ${ARCH}alpine:3.14 +ARG VERSION ONBUILD COPY --from=balenalib/rpi-alpine:3.14 /usr/bin/qemu-arm-static /usr/bin/qemu-arm-static ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + # Shared later between dovecot postfix nginx rspamd rainloop and roundloop RUN apk add --no-cache \ python3 py3-pip tzdata \ diff --git a/webmails/roundcube/Dockerfile b/webmails/roundcube/Dockerfile index 4ad89022..5c411f84 100644 --- a/webmails/roundcube/Dockerfile +++ b/webmails/roundcube/Dockerfile @@ -7,9 +7,12 @@ ONBUILD COPY --from=balenalib/rpi-alpine:3.14 /usr/bin/qemu-arm-static /usr/bin/ FROM ${ARCH}php:7.4-apache as build_other FROM build_${QEMU} - +ARG VERSION ENV TZ Etc/UTC +LABEL version=$VERSION +RUN echo $VERSION >> /version + #Shared layer between rainloop and roundcube RUN apt-get update && apt-get install -y \ python3 curl python3-pip git python3-multidict tzdata \ From f7677543c69ebe7389a2f7e6e593427562eb45f3 Mon Sep 17 00:00:00 2001 From: Dimitri Huisman Date: Thu, 18 Nov 2021 17:21:56 +0000 Subject: [PATCH 2/5] Process code review remarks - Moved run to bottom of Dockerfile to allow using unmodified / cached states. - Simplified bash code in deploy.sh. - Improved the large bash one-liner in CI.yml. It could not handle >9 for 1.x. --- .github/workflows/CI.yml | 22 +++++++++++----------- core/admin/Dockerfile | 2 +- core/dovecot/Dockerfile | 2 +- core/nginx/Dockerfile | 2 +- core/postfix/Dockerfile | 2 +- core/rspamd/Dockerfile | 2 +- docs/Dockerfile | 2 +- optional/clamav/Dockerfile | 2 +- optional/fetchmail/Dockerfile | 4 ++-- optional/postgresql/Dockerfile | 2 +- optional/radicale/Dockerfile | 2 +- optional/traefik-certdumper/Dockerfile | 2 +- optional/unbound/Dockerfile | 2 +- setup/Dockerfile | 3 ++- tests/deploy.sh | 4 ++-- webmails/rainloop/Dockerfile | 2 +- webmails/roundcube/Dockerfile | 2 +- 17 files changed, 30 insertions(+), 29 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 2a0ff932..8cc174f7 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -27,8 +27,8 @@ on: # Code block that is used as one liner. ##!/bin/bash #version=$( git tag --list "{{ env.MAILU_VERSION }}.*" | tail -1 ) -#root_version=${version:0:3} -#patch_version=${version:4:4} +#root_version=${version%.*} +#patch_version=${version##*.} #if [ "$patch_version" == "" ] #then # pinned_version={{ env.MAILU_VERSION }}.0 @@ -73,7 +73,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'staging' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -149,7 +149,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -221,7 +221,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -293,7 +293,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -365,7 +365,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -437,7 +437,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -509,7 +509,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -587,7 +587,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Derive PINNED_MAILU_VERSION for staging if: ${{ env.BRANCH == 'staging' }} shell: bash @@ -649,7 +649,7 @@ jobs: if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'staging' && env.BRANCH != 'master' }} shell: bash run: | - version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version:0:3};patch_version=${version:4:4};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV + version=$( git tag --list "${{ env.MAILU_VERSION }}.*" | tail -1 );root_version=${version%.*};patch_version=${version##*.};if [ "$patch_version" == "" ]; then pinned_version=${{ env.MAILU_VERSION }}.0; else pinned_version=$root_version.$(expr $patch_version + 1); fi;echo "PINNED_MAILU_VERSION=$pinned_version" >> $GITHUB_ENV - name: Tag and create release if: ${{ env.BRANCH != 'testing' && env.BRANCH != 'staging' && env.BRANCH != 'master' && env.PINNED_MAILU_VERSION != '' }} uses: ncipollo/release-action@v1 diff --git a/core/admin/Dockerfile b/core/admin/Dockerfile index ac8ae9fc..fde7c877 100644 --- a/core/admin/Dockerfile +++ b/core/admin/Dockerfile @@ -27,7 +27,6 @@ COPY --from=balenalib/rpi-alpine:3.14 /usr/bin/qemu-arm-static /usr/bin/qemu-arm ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN set -eu \ @@ -60,3 +59,4 @@ ENV FLASK_APP mailu CMD /start.py HEALTHCHECK CMD curl -f -L http://localhost/sso/login?next=ui.index || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/core/dovecot/Dockerfile b/core/dovecot/Dockerfile index 791b6c04..16f35490 100644 --- a/core/dovecot/Dockerfile +++ b/core/dovecot/Dockerfile @@ -15,7 +15,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -44,3 +43,4 @@ VOLUME ["/mail"] CMD /start.py HEALTHCHECK --start-period=350s CMD echo QUIT|nc localhost 110|grep "Dovecot ready." +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/core/nginx/Dockerfile b/core/nginx/Dockerfile index e5d30073..744de810 100644 --- a/core/nginx/Dockerfile +++ b/core/nginx/Dockerfile @@ -5,7 +5,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -32,3 +31,4 @@ VOLUME ["/overrides"] CMD /start.py HEALTHCHECK CMD curl -k -f -L http://localhost/health || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/core/postfix/Dockerfile b/core/postfix/Dockerfile index 5c6238b3..deedd9b8 100644 --- a/core/postfix/Dockerfile +++ b/core/postfix/Dockerfile @@ -6,7 +6,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -35,3 +34,4 @@ VOLUME ["/queue"] CMD /start.py HEALTHCHECK --start-period=350s CMD echo QUIT|nc localhost 25|grep "220 .* ESMTP Postfix" +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/core/rspamd/Dockerfile b/core/rspamd/Dockerfile index d1172ffc..59e6fefa 100644 --- a/core/rspamd/Dockerfile +++ b/core/rspamd/Dockerfile @@ -4,7 +4,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -29,3 +28,4 @@ VOLUME ["/var/lib/rspamd"] CMD /start.py HEALTHCHECK --start-period=350s CMD curl -f -L http://localhost:11334/ || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/docs/Dockerfile b/docs/Dockerfile index b3d1af01..18ca8333 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -23,7 +23,6 @@ ARG pinned_version=master ENV VERSION=$version ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $pinned_version >> /version COPY ./nginx.conf /etc/nginx/conf.d/default.conf COPY --from=build /build/$VERSION /build/$VERSION @@ -31,3 +30,4 @@ COPY --from=build /build/$VERSION /build/$VERSION EXPOSE 80/tcp CMD nginx -g "daemon off;" +RUN echo $pinned_version >> /version \ No newline at end of file diff --git a/optional/clamav/Dockerfile b/optional/clamav/Dockerfile index c68b8888..97a47d30 100644 --- a/optional/clamav/Dockerfile +++ b/optional/clamav/Dockerfile @@ -5,7 +5,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -24,3 +23,4 @@ VOLUME ["/data"] CMD /start.py HEALTHCHECK --start-period=350s CMD /health.sh +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/optional/fetchmail/Dockerfile b/optional/fetchmail/Dockerfile index 3c670bca..81ccc2d1 100644 --- a/optional/fetchmail/Dockerfile +++ b/optional/fetchmail/Dockerfile @@ -5,7 +5,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -20,4 +19,5 @@ RUN mkdir -p /data COPY fetchmail.py /fetchmail.py -CMD ["/fetchmail.py"] \ No newline at end of file +CMD ["/fetchmail.py"] +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/optional/postgresql/Dockerfile b/optional/postgresql/Dockerfile index 14d879f3..e66096ec 100644 --- a/optional/postgresql/Dockerfile +++ b/optional/postgresql/Dockerfile @@ -5,7 +5,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -41,3 +40,4 @@ EXPOSE 5432 CMD /start.py HEALTHCHECK CMD psql -h 127.0.0.1 -d postgres -U health -c "select 1 as ok;" || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/optional/radicale/Dockerfile b/optional/radicale/Dockerfile index 2eee6915..93796eb1 100644 --- a/optional/radicale/Dockerfile +++ b/optional/radicale/Dockerfile @@ -5,7 +5,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -25,3 +24,4 @@ VOLUME ["/data"] CMD radicale -S -C /radicale.conf HEALTHCHECK CMD curl -f -L http://localhost:5232/ || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/optional/traefik-certdumper/Dockerfile b/optional/traefik-certdumper/Dockerfile index 1aecc48e..829655f0 100644 --- a/optional/traefik-certdumper/Dockerfile +++ b/optional/traefik-certdumper/Dockerfile @@ -4,7 +4,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version RUN apk --no-cache add inotify-tools util-linux bash tzdata @@ -14,3 +13,4 @@ VOLUME ["/traefik"] VOLUME ["/output"] ENTRYPOINT ["/run.sh"] +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/optional/unbound/Dockerfile b/optional/unbound/Dockerfile index 501d562a..3a86cc6c 100644 --- a/optional/unbound/Dockerfile +++ b/optional/unbound/Dockerfile @@ -5,7 +5,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # python3 shared with most images RUN apk add --no-cache \ @@ -31,3 +30,4 @@ EXPOSE 53/udp 53/tcp CMD /start.py HEALTHCHECK CMD dig @127.0.0.1 || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/setup/Dockerfile b/setup/Dockerfile index 0635566b..baa35da9 100644 --- a/setup/Dockerfile +++ b/setup/Dockerfile @@ -3,7 +3,7 @@ FROM $DISTRO ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version + RUN mkdir -p /app WORKDIR /app @@ -21,3 +21,4 @@ COPY static ./static EXPOSE 80/tcp CMD gunicorn -w 4 -b :80 --access-logfile - --error-logfile - --preload main:app +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/tests/deploy.sh b/tests/deploy.sh index 6913e404..e66310af 100755 --- a/tests/deploy.sh +++ b/tests/deploy.sh @@ -17,7 +17,7 @@ fi #After that, both tags are pushed to the docker repository. if [ "$PINNED_MAILU_VERSION" != "" ] && [ "$BRANCH" != "master" ] then - images=$(docker-compose -f tests/build.yml config | grep 'image: ' | awk -F ':' '{ print $2 }') + images=$(docker-compose -f Mailu/tests/build.yml config | awk -F ':' '/image:/{ print $2 }') for image in $images do docker tag "${image}":"${PINNED_MAILU_VERSION}" "${image}":${MAILU_VERSION} @@ -36,7 +36,7 @@ fi #Then we publish the images with tag master if [ "$PINNED_MAILU_VERSION" != "" ] && [ "$BRANCH" == "master" ] then - images=$(docker-compose -f tests/build.yml config | grep 'image: ' | awk -F ':' '{ print $2 }') + images=$(docker-compose -f Mailu/tests/build.yml config | awk -F ':' '/image:/{ print $2 }') for image in $images do docker tag "${image}":"${PINNED_MAILU_VERSION}" "${image}":${MAILU_VERSION} diff --git a/webmails/rainloop/Dockerfile b/webmails/rainloop/Dockerfile index 8039f69a..0938056c 100644 --- a/webmails/rainloop/Dockerfile +++ b/webmails/rainloop/Dockerfile @@ -8,7 +8,6 @@ ONBUILD COPY --from=balenalib/rpi-alpine:3.14 /usr/bin/qemu-arm-static /usr/bin/ ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version # Shared later between dovecot postfix nginx rspamd rainloop and roundloop RUN apk add --no-cache \ @@ -75,3 +74,4 @@ VOLUME ["/data"] CMD php-fpm7 && /start.py HEALTHCHECK CMD curl -f -L http://localhost/ || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file diff --git a/webmails/roundcube/Dockerfile b/webmails/roundcube/Dockerfile index 5c411f84..f28f316c 100644 --- a/webmails/roundcube/Dockerfile +++ b/webmails/roundcube/Dockerfile @@ -11,7 +11,6 @@ ARG VERSION ENV TZ Etc/UTC LABEL version=$VERSION -RUN echo $VERSION >> /version #Shared layer between rainloop and roundcube RUN apt-get update && apt-get install -y \ @@ -62,3 +61,4 @@ VOLUME ["/data"] CMD /start.py HEALTHCHECK CMD curl -f -L -H 'User-Agent: health' http://localhost/ || exit 1 +RUN echo $VERSION >> /version \ No newline at end of file From f247520fe5d0a33afd42dccb8b1b8d20c43c3f8c Mon Sep 17 00:00:00 2001 From: Dimitri Huisman Date: Fri, 19 Nov 2021 07:35:08 +0000 Subject: [PATCH 3/5] Forgot to update tests to use PINNED_MAILU_VERSION as tag. --- tests/compose/core/docker-compose.yml | 10 +++++----- tests/compose/fetchmail/docker-compose.yml | 12 ++++++------ tests/compose/filters/docker-compose.yml | 12 ++++++------ tests/compose/rainloop/docker-compose.yml | 12 ++++++------ tests/compose/roundcube/docker-compose.yml | 12 ++++++------ tests/compose/webdav/docker-compose.yml | 12 ++++++------ 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/tests/compose/core/docker-compose.yml b/tests/compose/core/docker-compose.yml index f64c82b0..195d8a59 100644 --- a/tests/compose/core/docker-compose.yml +++ b/tests/compose/core/docker-compose.yml @@ -15,7 +15,7 @@ services: # Core services front: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env logging: @@ -34,7 +34,7 @@ services: - "/mailu/certs:/certs" admin: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -44,7 +44,7 @@ services: - redis imap: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -54,7 +54,7 @@ services: - front smtp: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -63,7 +63,7 @@ services: - front antispam: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: diff --git a/tests/compose/fetchmail/docker-compose.yml b/tests/compose/fetchmail/docker-compose.yml index 49c292e9..d31479d4 100644 --- a/tests/compose/fetchmail/docker-compose.yml +++ b/tests/compose/fetchmail/docker-compose.yml @@ -15,7 +15,7 @@ services: # Core services front: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env logging: @@ -34,7 +34,7 @@ services: - "/mailu/certs:/certs" admin: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -44,7 +44,7 @@ services: - redis imap: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -54,7 +54,7 @@ services: - front smtp: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -63,7 +63,7 @@ services: - front antispam: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -77,7 +77,7 @@ services: fetchmail: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}fetchmail:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}fetchmail:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env diff --git a/tests/compose/filters/docker-compose.yml b/tests/compose/filters/docker-compose.yml index 94b97399..381d3683 100644 --- a/tests/compose/filters/docker-compose.yml +++ b/tests/compose/filters/docker-compose.yml @@ -15,7 +15,7 @@ services: # Core services front: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env logging: @@ -34,7 +34,7 @@ services: - "/mailu/certs:/certs" admin: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -44,7 +44,7 @@ services: - redis imap: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -54,7 +54,7 @@ services: - front smtp: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -63,7 +63,7 @@ services: - front antispam: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -75,7 +75,7 @@ services: # Optional services antivirus: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}clamav:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}clamav:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: diff --git a/tests/compose/rainloop/docker-compose.yml b/tests/compose/rainloop/docker-compose.yml index 98425d7a..62d5890f 100644 --- a/tests/compose/rainloop/docker-compose.yml +++ b/tests/compose/rainloop/docker-compose.yml @@ -15,7 +15,7 @@ services: # Core services front: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env logging: @@ -34,7 +34,7 @@ services: - "/mailu/certs:/certs" admin: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -44,7 +44,7 @@ services: - redis imap: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -54,7 +54,7 @@ services: - front smtp: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -63,7 +63,7 @@ services: - front antispam: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -79,7 +79,7 @@ services: # Webmail webmail: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rainloop:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rainloop:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: diff --git a/tests/compose/roundcube/docker-compose.yml b/tests/compose/roundcube/docker-compose.yml index b2f415df..0bb54e8c 100644 --- a/tests/compose/roundcube/docker-compose.yml +++ b/tests/compose/roundcube/docker-compose.yml @@ -15,7 +15,7 @@ services: # Core services front: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env logging: @@ -34,7 +34,7 @@ services: - "/mailu/certs:/certs" admin: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -44,7 +44,7 @@ services: - redis imap: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -54,7 +54,7 @@ services: - front smtp: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -63,7 +63,7 @@ services: - front antispam: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -79,7 +79,7 @@ services: # Webmail webmail: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}roundcube:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}roundcube:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: diff --git a/tests/compose/webdav/docker-compose.yml b/tests/compose/webdav/docker-compose.yml index adc094a8..a597b2d2 100644 --- a/tests/compose/webdav/docker-compose.yml +++ b/tests/compose/webdav/docker-compose.yml @@ -15,7 +15,7 @@ services: # Core services front: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env logging: @@ -34,7 +34,7 @@ services: - "/mailu/certs:/certs" admin: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}admin:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -44,7 +44,7 @@ services: - redis imap: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}dovecot:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -54,7 +54,7 @@ services: - front smtp: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}postfix:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -63,7 +63,7 @@ services: - front antispam: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rspamd:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: @@ -76,7 +76,7 @@ services: # Optional services webdav: - image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}radicale:${MAILU_VERSION:-master} + image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}radicale:${PINNED_MAILU_VERSION:-local} restart: always env_file: mailu.env volumes: From 04bbd9f5153c90a59bce480bf2022881c40f39ec Mon Sep 17 00:00:00 2001 From: Dimitri Huisman Date: Sun, 5 Dec 2021 16:10:55 +0000 Subject: [PATCH 4/5] Fix folder path twice in deploy.sh. --- tests/deploy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/deploy.sh b/tests/deploy.sh index e66310af..db843b9c 100755 --- a/tests/deploy.sh +++ b/tests/deploy.sh @@ -17,7 +17,7 @@ fi #After that, both tags are pushed to the docker repository. if [ "$PINNED_MAILU_VERSION" != "" ] && [ "$BRANCH" != "master" ] then - images=$(docker-compose -f Mailu/tests/build.yml config | awk -F ':' '/image:/{ print $2 }') + images=$(docker-compose -f tests/build.yml config | awk -F ':' '/image:/{ print $2 }') for image in $images do docker tag "${image}":"${PINNED_MAILU_VERSION}" "${image}":${MAILU_VERSION} @@ -36,7 +36,7 @@ fi #Then we publish the images with tag master if [ "$PINNED_MAILU_VERSION" != "" ] && [ "$BRANCH" == "master" ] then - images=$(docker-compose -f Mailu/tests/build.yml config | awk -F ':' '/image:/{ print $2 }') + images=$(docker-compose -f tests/build.yml config | awk -F ':' '/image:/{ print $2 }') for image in $images do docker tag "${image}":"${PINNED_MAILU_VERSION}" "${image}":${MAILU_VERSION} From 15e64e8e500ab0372bd42a776e025c513d4886a8 Mon Sep 17 00:00:00 2001 From: Dimitri Huisman Date: Mon, 6 Dec 2021 15:22:42 +0000 Subject: [PATCH 5/5] Add concurrency to ensure that only a single workflow can run for a branch. --- .github/workflows/CI.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 8cc174f7..51f569f8 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,6 +12,8 @@ on: # test branches, e.g. test-debian - test-* +concurrency: ci-${{ github.ref }} + ############################################### # REQUIRED secrets # DOCKER_UN: ${{ secrets.Docker_Login }}