Skip to content

fix CI for PR's

fix CI for PR's #188

Workflow file for this run

name: Docker Image CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
Setup:
runs-on: ubuntu-latest
outputs:
build: ${{ steps.set-matrix.outputs.build }}
build_matrix: ${{ steps.set-matrix.outputs.build_matrix }}
push_matrix: ${{ steps.set-matrix.outputs.push_matrix }}
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup Matrix-Jobs
id: set-matrix
env:
GITHUB_EVENT_NAME: ${{ github.event_name }}
run: |
echo "Run triggered by: ${GITHUB_EVENT_NAME}"
CHANGED_FILES=$(git --no-pager diff HEAD HEAD~1 --name-only | grep -v -E '^\.' | cut -d'/' -f1 | uniq)
echo "Changed files:"
echo "$CHANGED_FILES"
if [ $(echo $CHANGED_FILES | wc -l | xargs) -gt 0 ]; then
BUILD="no"
for i in $(echo $CHANGED_FILES); do
echo "Checking $i"
if [[ -d $i ]]; then
BUILD="yes"
fi
done
echo "build=$BUILD" >> $GITHUB_OUTPUT
else
if [[ ${GITHUB_EVENT_NAME} == 'workflow_dispatch' ]]; then
echo "build=yes" >> $GITHUB_OUTPUT
else
echo "build=no" >> $GITHUB_OUTPUT
fi
fi
if ! [[ ${GITHUB_EVENT_NAME} == 'workflow_dispatch' ]]; then
git --no-pager diff HEAD HEAD~1 --name-only | grep -v -E '^\.' | grep -E '\/' | cut -d'/' -f1 | uniq | xargs echo -n | jq -Rsc 'split(" ") | { "addons": (.) }' > .github/resources/addons.json
else
ls -d */ | cut -d'/' -f1 | uniq | xargs echo -n | jq -Rsc 'split(" ") | { "addons": (.) }' > .github/resources/addons.json
fi
build_matrix=$(jq -sc '.[0] * .[1]' .github/resources/addons.json .github/resources/platforms.json)
echo "build_matrix=${build_matrix}" >> $GITHUB_OUTPUT
echo "push_matrix=$(cat .github/resources/addons.json)" >> $GITHUB_OUTPUT
Build:
runs-on: ubuntu-latest
needs: Setup
if: needs.Setup.outputs.build == 'yes'
strategy:
fail-fast: false
matrix:
${{ insert }}: ${{ fromJson(needs.Setup.outputs.build_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Login to Docker Hub
if: github.event_name == 'push'
uses: docker/login-action@v2
with:
username: ${{ vars.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_DEPLOY_KEY }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Install Perquisites
run: |
sudo snap install yq
curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec -v 5.22.36
inspec --chef-license=accept
- name: Build
env:
DOCKER_USER: ${{ vars.DOCKER_HUB_USERNAME }}
ADDON: ${{ matrix.addons }}
BUILD_NR: ${{ github.run_number }}
PLATFORM: ${{ matrix.platforms }}
working-directory: ./${{ matrix.addons }}
run: |
ARCH=$(echo "${PLATFORM}" | awk -F "/" '{print $2$3}')
VERSION=$(yq -r .version config.yaml)
echo ""
echo "============================================================="
echo "Building: ${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}-${BUILD_NR}"
echo "============================================================="
echo ""
docker buildx build \
--tag "${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}-${BUILD_NR}" \
--platform ${PLATFORM} \
--build-arg "VERSION=${VERSION}" \
--load \
-f Dockerfile .
- name: Test
env:
DOCKER_USER: ${{ vars.DOCKER_HUB_USERNAME }}
ADDON: ${{ matrix.addons }}
BUILD_NR: ${{ github.run_number }}
PLATFORM: ${{ matrix.platforms }}
working-directory: ./${{ matrix.addons }}
run: |
set -a
ARCH=$(echo "${PLATFORM}" | awk -F "/" '{print $2$3}')
VERSION=$(yq -r .version config.yaml)
echo ""
echo "============================================================="
echo "Testing: ${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}-${BUILD_NR}"
echo "============================================================="
echo ""
exec ./test/test.sh
echo ""
- name: Push Images
if: github.event_name == 'push'
env:
DOCKER_USER: ${{ vars.DOCKER_HUB_USERNAME }}
ADDON: ${{ matrix.addons }}
BUILD_NR: ${{ github.run_number }}
PLATFORM: ${{ matrix.platforms }}
working-directory: ./${{ matrix.addons }}
run: |
ARCH=$(echo "${PLATFORM}" | awk -F "/" '{print $2$3}')
VERSION=$(yq -r .version config.yaml)
echo ""
echo "============================================================="
echo "Pushing: ${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}-${BUILD_NR}"
echo "============================================================="
echo ""
docker tag "${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}-${BUILD_NR}" "${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}"
docker push "${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}-${BUILD_NR}"
docker push "${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}"
Shared-Manifest:
if: github.event_name == 'push'
runs-on: ubuntu-latest
needs:
- Build
- Setup
strategy:
fail-fast: false
matrix:
${{ insert }}: ${{ fromJson(needs.Setup.outputs.push_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ vars.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_DEPLOY_KEY }}
- name: Create and push shared manifest
env:
DOCKER_USER: ${{ vars.DOCKER_HUB_USERNAME }}
ADDON: ${{ matrix.addons }}
BUILD_NR: ${{ github.run_number }}
working-directory: ./${{ matrix.addons }}
run: |
VERSION=$(yq -r .version config.yaml)
echo ""
echo "============================================================="
echo "Pushing shared manifest: ${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}"
echo "============================================================="
echo ""
echo "#!/bin/bash" > push-shared-tags.sh
echo -n "docker manifest create ${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}" >> push-shared-tags.sh
while read -r PLATFORM; do
ARCH=$(echo "${PLATFORM}" | awk -F "/" '{print $2$3}')
echo -n " ${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}-${ARCH}-${BUILD_NR}" >> push-shared-tags.sh
done <<< "$(cat ../.github/resources/platforms.json | jq -r '.platforms | join("\n")')"
echo "" >> push-shared-tags.sh
echo "docker manifest push ${DOCKER_USER}/hass-addon-${ADDON}:${VERSION}" >> push-shared-tags.sh
echo "exit 0" >> push-shared-tags.sh
cat push-shared-tags.sh
chmod +x ./push-shared-tags.sh
./push-shared-tags.sh
Check-Build:
if: ${{ always() }}
runs-on: ubuntu-latest
needs:
- Build
- Shared-Manifest
steps:
- run: |
result="${{ needs.Build.result }}"
if [[ $result == "success" || $result == "skipped" ]]; then
exit 0
else
exit 1
fi