Skip to content

feat[99_DockerImageInfo]: provide Email Stuffer function for email send #733

feat[99_DockerImageInfo]: provide Email Stuffer function for email send

feat[99_DockerImageInfo]: provide Email Stuffer function for email send #733

Workflow file for this run

# This is a basic workflow to help you get started with Actions
name: Build and Test
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the dev branch
push:
branches:
- "dev*" # Support wildcard matching
- "master"
pull_request:
branches: [ dev ]
release:
types:
- published
- released
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
get_dependencies:
# Min Version for the prereq scanner to ignore core modules
runs-on: ubuntu-latest
steps:
- name: Checkout this repository
uses: actions/checkout@v4
- name: Prepare SVN repository checkout and variables
id: prepareSVN
uses: ./.github/workflows/prepare-svn
- name: Remove contrib from dependency scan
run: |
rm -r ./src/fhem/trunk/fhem/contrib || true
- uses: shogo82148/actions-setup-perl@v1
with:
perl-version: "5.38"
install-modules-with: cpanm
install-modules-args: --notest
install-modules: PPI Perl::PrereqScanner::NotQuiteLite File::Path File::Find::Rule List::MoreUtils CPAN::Meta Module::CPANfile CPAN::Meta::Merge Scalar::Util Module::CoreList
- name: clone 3rdparty repositories at github
run: |
mapfile -t REPO_URLS < <( scripts/get-FHEMRepositorys.sh | awk '{print $4}' && printf '\0' )
mkdir ./3rdparty
cd ./3rdparty
printf "%s\n" "${REPO_URLS[@]}" | xargs -I {} -P3 sh -c 'echo "{}: $(basename $(dirname {}))/$(basename {})"; git clone --depth 1 "{}" "$(basename $(dirname {}))/$(basename {})"; '
- name: Init PPI Cache
uses: actions/cache@v4
with:
path: .cache/PPI
save-always: true
restore-keys: |
PPI-SVN-
key: PPI-SVN-${{ steps.prepareSVN.outputs.FHEM_REVISION_LATEST }}
- name: "create private modules filter regex, to not install them from CPAN"
run: |
DYNAMIC_EXCLUDE=$(perl scripts/get-Packages.pl ./3rdparty ./src/fhem/trunk/fhem)
STATIC_EXCLUDE=$(grep -v '^#' scripts/excluded_packages.txt | tr '\n' '|' | sed 's/^|//' | sed 's/|\{2,\}/|/g' | sed 's/.$//')
echo "FHEM_MODULES=^(${STATIC_EXCLUDE}|${DYNAMIC_EXCLUDE})" >> "$GITHUB_ENV"
- name: create cpanfile from local cloned 3rdparty repositories
run: |
scan-perl-prereqs-nqlite -save_cpanfile -exclude_core -suggests -private_re "$FHEM_MODULES" -ignore "fhem-streamdeck" ./3rdparty
perl scripts/parse-METAJson.pl ./3rdparty
echo "## 3rdparty cpanfile" >> $GITHUB_STEP_SUMMARY
cat cpanfile >> $GITHUB_STEP_SUMMARY
- uses: actions/upload-artifact@v4
with:
name: cpanfile-3rdParty
path: cpanfile
overwrite: true
- name: create cpanfile from FHEM svn dependencies
run: |
rm cpanfile
scan-perl-prereqs-nqlite -save_cpanfile -exclude_core -suggests -private_re "$FHEM_MODULES" ./src/fhem/trunk/fhem ./src/FHEM
perl scripts/parse-METAJson.pl ./src/fhem/trunk/fhem ./src/FHEM
echo "## FHEM svn cpanfile" >> $GITHUB_STEP_SUMMARY
cat cpanfile >> $GITHUB_STEP_SUMMARY
- uses: actions/upload-artifact@v4
with:
name: cpanfile-FHEM
path: cpanfile
overwrite: true
base_build:
strategy:
matrix:
dockerfile: [-bullseye, -threaded-bullseye]
platform: [arm/v7, amd64, arm64, 386]
runs-on: ubuntu-latest
steps:
- name: Checkout this repository
uses: actions/checkout@v4
- name: Prepare docker for build and publish
id: prepareDOCKER
uses: ./.github/workflows/prepare-docker
with:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_HUB_ACCESS_TOKEN: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
GHCR_OWNER: ${{ github.repository_owner }}
GHCR_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKERFILE: ${{ matrix.dockerfile }}
- name: Build for bats with fhem base layer ${{ matrix.platform }}
uses: docker/build-push-action@v6
with:
context: .
load: true
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/${{ matrix.platform }}
push: false
target: base
cache-from: |
type=gha,scope=base_linux/${{ matrix.platform }}-${{ matrix.dockerfile }}
cache-to: type=gha,mode=max,scope=base_linux/${{ matrix.platform }}-${{ matrix.dockerfile }}
tags: baseonly
cpan_build:
needs: [get_dependencies, base_build]
runs-on: ubuntu-latest
strategy:
matrix:
dockerfile: [-bullseye, -threaded-bullseye]
platform: [arm/v7, arm64, 386]
steps:
- name: Checkout this repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Inject slug/short variables
uses: rlespinasse/[email protected]
- name: Get git vars
shell: bash
run: |
echo "IMAGE_VERSION=$( git describe --tags --dirty --match "v[0-9]*")" >> $GITHUB_OUTPUT
id: gitVars
- name: Prepare SVN repository checkout and variables
id: prepareSVN
uses: ./.github/workflows/prepare-svn
- uses: actions/download-artifact@v4
with:
name: cpanfile-FHEM
- uses: actions/download-artifact@v4
with:
name: cpanfile-3rdParty
path: 3rdParty
- name: Prepare docker for build and publish
id: prepareDOCKER
uses: ./.github/workflows/prepare-docker
with:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_HUB_ACCESS_TOKEN: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
GHCR_OWNER: ${{ github.repository_owner }}
GHCR_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKERFILE: ${{ matrix.dockerfile }}
- name: Build cpan packages for ${{ matrix.platform }}
uses: docker/build-push-action@v6
with:
context: .
load: true
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/${{ matrix.platform }}
push: false
target: base-cpan
cache-from: |
type=gha,scope=base_linux/${{ matrix.platform }}-${{ matrix.dockerfile }}
type=gha,scope=base-cpan_linux/${{ matrix.platform }}-${{ matrix.dockerfile }}
cache-to: type=gha,mode=max,scope=base-cpan_linux/${{ matrix.platform }}-${{ matrix.dockerfile }}
tags: buildcpanonly
test_build:
# The type of runner that the job will run on
needs: [get_dependencies, base_build]
runs-on: ubuntu-latest
strategy:
matrix:
dockerfile: [-bullseye, -threaded-bullseye]
# Steps represent a sequence of tasks that will be executed as part of the job
env:
TAG_LATEST: ${{ (contains(matrix.dockerfile,'threaded') || github.event.release.prerelease == 1) && 'false' || 'auto' }}
steps:
- name: Checkout this repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Inject slug/short variables
uses: rlespinasse/[email protected]
- name: Get git vars
shell: bash
run: |
echo "IMAGE_VERSION=$( git describe --tags --dirty --match "v[0-9]*")" >> $GITHUB_OUTPUT
id: gitVars
- name: Prepare SVN repository checkout and variables
id: prepareSVN
uses: ./.github/workflows/prepare-svn
- uses: actions/download-artifact@v4
with:
name: cpanfile-FHEM
- uses: actions/download-artifact@v4
with:
name: cpanfile-3rdParty
path: 3rdParty
- name: Prepare docker for build and publish
id: prepareDOCKER
uses: ./.github/workflows/prepare-docker
with:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_HUB_ACCESS_TOKEN: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
GHCR_OWNER: ${{ github.repository_owner }}
GHCR_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKERFILE: ${{ matrix.dockerfile }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
env:
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
with:
images: |
ghcr.io/${{ github.repository_owner }}/fhem-docker
fhem/fhem
flavor: |
latest= ${{ env.TAG_LATEST }}
tags: |
type=semver,pattern={{version}},suffix=${{ matrix.dockerfile }}
type=semver,pattern={{major}},enable=${{ github.event.release.prerelease == 0 }},suffix=${{ matrix.dockerfile }}
type=ref,event=branch,suffix=${{ matrix.dockerfile }}
type=ref,event=pr,suffix=${{ matrix.dockerfile }}
- name: Build and cache fhem base layer
uses: docker/build-push-action@v6
id: docker_build_fhem
with:
context: .
load: true
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/amd64
push: false
target: with-fhem-bats
cache-from: |
type=gha,scope=fhem_linux/amd64-${{ matrix.dockerfile }}
type=gha,scope=base_linux/amd64-${{ matrix.dockerfile }}
cache-to: type=gha,mode=max,scope=fhem_linux/amd64-${{ matrix.dockerfile }}
tags: with-fhem
labels: ${{ steps.meta.outputs.labels }}
build-args: |
BUILD_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
IMAGE_VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
IMAGE_VCS_REF=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
L_USAGE=${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/README.md
L_VCS_URL=${{ github.server_url }}/${{ github.repository }}/
L_AUTHORS=${{ github.server_url }}/${{ github.repository }}/graphs/contributors
- name: Build for bats with fhem base layer
uses: docker/build-push-action@v6
id: docker_build_bats
with:
context: .
load: true
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/amd64
push: false
target: with-fhem-bats
cache-from: |
type=gha,scope=fhem_linux/amd64-${{ matrix.dockerfile }}
tags: bats-withfhem
labels: ${{ steps.meta.outputs.labels }}
build-args: |
BUILD_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
IMAGE_VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
IMAGE_VCS_REF=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
L_USAGE=${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/README.md
L_VCS_URL=${{ github.server_url }}/${{ github.repository }}/
L_AUTHORS=${{ github.server_url }}/${{ github.repository }}/graphs/contributors
- uses: Wandalen/[email protected]
name: Run bats unit and integration tests in bidge network mode
with:
attempt_limit: 3
command: timeout 9m docker run --rm -e GITHUB_RUN_ID=$GITHUB_RUN_ID -v "${PWD}/src/tests/bats:/code" bats-withfhem:latest -T -t . --filter-tags '!hostMode,!extendedOnly'
- uses: Wandalen/[email protected]
name: Run bats unit and integration tests in host network mode
with:
attempt_limit: 3
command: timeout 1m docker run --rm --net=host -e GITHUB_RUN_ID=$GITHUB_RUN_ID -v "${PWD}/src/tests/bats:/code" bats-withfhem:latest -T -t . --filter-tags 'hostMode,!extendedOnly'
- name: Build for test fhem, python and nodejs layer added for amd64
uses: docker/build-push-action@v6
id: docker_build
with:
context: .
load: true
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/amd64
push: false
target: with-fhem-extended-python-nodejs
cache-from: |
type=gha,scope=full_linux/amd64-${{ matrix.dockerfile }}
type=gha,scope=fhem_linux/amd64-${{ matrix.dockerfile }}
cache-to: type=gha,mode=max,scope=full_linux/amd64-${{ matrix.dockerfile }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
BUILD_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
IMAGE_VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
IMAGE_VCS_REF=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
L_USAGE=${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/README.md
L_VCS_URL=${{ github.server_url }}/${{ github.repository }}/
L_AUTHORS=${{ github.server_url }}/${{ github.repository }}/graphs/contributors
- name: Inspect and run integration tests
run: |
docker image inspect ${{ fromJSON(steps.meta.outputs.json).tags[0] }}
./scripts/test-integration.sh;
- name: Run build in unittests
run: |
CONTAINER=$(docker run -d -ti --health-interval=10s --health-timeout=8s --health-start-period=10s --health-retries=5 ${{ fromJSON(steps.meta.outputs.json).tags[0] }} )
sleep 15;
until [ "$(/usr/bin/docker inspect -f {{.State.Health.Status}} $CONTAINER)" == "healthy" ];
do sleep 1;
echo -n ".";
done;
echo -e "\n"
docker exec ${CONTAINER} /bin/bash -c "prove --exec 'perl fhem.pl -t' -I FHEM --recurse /opt/fhem/t/FHEM/" || true
docker container rm $CONTAINER --force --volumes
- name: Build for bats with fhem extended layer
uses: docker/build-push-action@v6
id: docker_build_bats_extended
with:
context: .
load: true
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/amd64
push: false
target: with-fhem-bats-extended-python-nodejs
cache-from: |
type=gha,scope=fhem_linux/amd64-${{ matrix.dockerfile }}
type=gha,mode=max,scope=full_linux/amd64-${{ matrix.dockerfile }}
tags: bats-withfhem-extended
labels: ${{ steps.meta.outputs.labels }}
build-args: |
BUILD_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
IMAGE_VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
IMAGE_VCS_REF=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
L_USAGE=${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/README.md
L_VCS_URL=${{ github.server_url }}/${{ github.repository }}/
L_AUTHORS=${{ github.server_url }}/${{ github.repository }}/graphs/contributors
- uses: Wandalen/[email protected]
name: Run bats unit and integration tests in host network mode
with:
attempt_limit: 3
command: timeout 1m docker run --rm -e GITHUB_RUN_ID=$GITHUB_RUN_ID -v "${PWD}/src/tests/bats:/code" bats-withfhem-extended:latest -T -t . --filter-tags 'extendedOnly'
published_build:
runs-on: ubuntu-latest
needs: [test_build, cpan_build]
strategy:
matrix:
dockerfile: [-bullseye, -threaded-bullseye]
env:
TAG_LATEST: ${{ (contains(matrix.dockerfile,'threaded') || github.event.release.prerelease == 1) && 'false' || 'auto' }}
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Checkout this repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Inject slug/short variables
uses: rlespinasse/[email protected]
- name: Get git vars
shell: bash
run: |
echo "IMAGE_VERSION=$( git describe --tags --dirty --match "v[0-9]*")" >> $GITHUB_OUTPUT
id: gitVars
- uses: actions/download-artifact@v4
with:
name: cpanfile-FHEM
- uses: actions/download-artifact@v4
with:
name: cpanfile-3rdParty
path: 3rdParty
- name: Prepare docker for build and publish
id: prepareDOCKER
uses: ./.github/workflows/prepare-docker
with:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_HUB_ACCESS_TOKEN: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
GHCR_OWNER: ${{ github.repository_owner }}
GHCR_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKERFILE: ${{ matrix.dockerfile }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
env:
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
with:
images: |
ghcr.io/${{ github.repository_owner }}/fhem-docker
fhem/fhem
flavor: |
latest= ${{ env.TAG_LATEST }}
tags: |
type=semver,pattern={{version}},suffix=${{ matrix.dockerfile }}
type=semver,pattern={{major}},enable=${{ github.event.release.prerelease == 0 }},suffix=${{ matrix.dockerfile }}
type=ref,event=branch,suffix=${{ matrix.dockerfile }},enable=${{ github.event.release.prerelease == 0 && env.GITHUB_REF_SLUG != 'master' }}
type=ref,event=pr,suffix=${{ matrix.dockerfile }}
type=raw,enable=${{ env.GITHUB_REF_SLUG == 'master' }},priority=200,prefix=,suffix=${{ matrix.dockerfile }},value=
- name: Build and push cross compiled fhem, python and nodejs layer on supported platforms
uses: docker/build-push-action@v6
id: docker_build
with:
context: .
load: false
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/386
push: ${{ github.event_name != 'pull_request' }}
target: with-fhem-extended-python-nodejs
cache-from: |
type=gha,scope=base-cpan_linux/386-${{ matrix.dockerfile }}
type=gha,scope=base-cpan_linux/arm64-${{ matrix.dockerfile }}
type=gha,scope=base-cpan_linux/arm/v7-${{ matrix.dockerfile }}
type=gha,scope=full_linux/amd64-${{ matrix.dockerfile }}
type=gha,scope=full_linux/cross-${{ matrix.dockerfile }}
cache-to: type=gha,mode=max,scope=full_linux/cross-${{ matrix.dockerfile }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
annotations: ${{ steps.meta.outputs.annotations }}
build-args: |
BUILD_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
IMAGE_VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
IMAGE_VCS_REF=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
L_USAGE=${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/README.md
L_VCS_URL=${{ github.server_url }}/${{ github.repository }}/
L_AUTHORS=${{ github.server_url }}/${{ github.repository }}/graphs/contributors
L_DESCR=A full blown Docker image for FHEM house automation system, based on Debian Perl ${{ matrix.dockerfile }}.
- name: Docker meta
id: meta_base
uses: docker/metadata-action@v5
env:
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
with:
images: |
ghcr.io/${{ github.repository_owner }}/fhem-minimal-docker
fhem/fhem-minimal
flavor: |
latest= ${{ env.TAG_LATEST }}
tags: |
type=semver,pattern={{version}},suffix=${{ matrix.dockerfile }}
type=semver,pattern={{major}},enable=${{ github.event.release.prerelease == 0 }},suffix=${{ matrix.dockerfile }}
type=ref,event=branch,suffix=${{ matrix.dockerfile }},enable=${{ github.event.release.prerelease == 0 && env.GITHUB_REF_SLUG != 'master' }}
type=ref,event=pr,suffix=${{ matrix.dockerfile }}
type=raw,enable=${{ env.GITHUB_REF_SLUG == 'master' }},priority=200,prefix=,suffix=${{ matrix.dockerfile }},value=
- name: Build and push cross compiled base image on supported platforms
uses: docker/build-push-action@v6
id: docker_build_base
with:
context: .
load: false
file: ./Dockerfile${{ matrix.dockerfile }}
platforms: linux/386,linux/amd64,linux/arm/v7,linux/arm64,386
push: ${{ github.event_name != 'pull_request' }}
target: with-fhem
cache-from: |
type=gha,scope=base_linux/arm64-${{ matrix.dockerfile }}
type=gha,scope=base_linux/amd64-${{ matrix.dockerfile }}
type=gha,scope=base_linux/arm/v7-${{ matrix.dockerfile }}
type=gha,scope=base_linux/386-${{ matrix.dockerfile }}
type=gha,scope=full_linux/amd64-${{ matrix.dockerfile }}
type=gha,scope=full_linux/cross-${{ matrix.dockerfile }}
tags: ${{ steps.meta_base.outputs.tags }}
annotations: ${{ steps.meta_base.outputs.annotations }}
labels: ${{ steps.meta_base.outputs.labels }}
build-args: |
BUILD_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
IMAGE_VERSION=${{ fromJSON(steps.meta_base.outputs.json).labels['org.opencontainers.image.version'] }}
IMAGE_VCS_REF=${{ fromJSON(steps.meta_base.outputs.json).labels['org.opencontainers.image.revision'] }}
L_USAGE=${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/README.md
L_VCS_URL=${{ github.server_url }}/${{ github.repository }}/
L_AUTHORS=${{ github.server_url }}/${{ github.repository }}/graphs/contributors
L_DESCR=A minimal (perl) Docker image for FHEM house automation system, based on Debian Perl ${{ matrix.dockerfile }}.