Skip to content

Commit

Permalink
Add auto-update workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
jacklul committed May 7, 2024
1 parent d665732 commit 6df5a48
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 7 deletions.
11 changes: 4 additions & 7 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@ on:
create:
tags:
- '^\d{4}\.\d{2}\.\d{2}-\d+$'
#schedule:
# - cron: '0 0 * * 1' # @TODO would probably be better to have a separate workflow for automatic updates when possible
workflow_dispatch:

env:
REF_CORE: development-v6 # commit hash or tag
REF_WEB: development-v6 # commit hash or tag
REF_FTL: development-v6 # commit hash or tag
REF_CORE: development-v6
REF_WEB: development-v6
REF_FTL: development-v6
# @TODO when v6 is released these should be set ref hashes

jobs:
set-version:
Expand Down Expand Up @@ -390,8 +389,6 @@ jobs:
if: ${{ startsWith(github.ref, 'refs/tags/') }}
with:
files: ./artifacts/*/*.ipk
draft: true
# @TODO Draft probably not needed anymore after v6 releases

- name: Collect new packages
run: |
Expand Down
139 changes: 139 additions & 0 deletions .github/workflows/update.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
name: Auto Update

on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:

env:
REF_CORE: development-v6
REF_WEB: development-v6
REF_FTL: development-v6
# @TODO when v6 is released these should be set to master

jobs:
check:
concurrency: check
runs-on: ubuntu-latest
continue-on-error: true

outputs:
CORE_HASH: ${{ steps.new-hashes.outputs.CORE_HASH }}
WEB_HASH: ${{ steps.new-hashes.outputs.WEB_HASH }}
FTL_HASH: ${{ steps.new-hashes.outputs.FTL_HASH }}
STATUS: ${{ steps.status.outputs.RESULT }}

steps:
- name: Checkout own repository
uses: actions/checkout@v4

- name: Checkout pi-hole/pi-hole repository
uses: actions/checkout@v4
with:
repository: pi-hole/pi-hole
ref: ${{ env.REF_CORE }}
path: ./dev/core

- name: Checkout pi-hole/web repository
uses: actions/checkout@v4
with:
repository: pi-hole/web
ref: ${{ env.REF_WEB }}
path: ./dev/web

- name: Checkout pi-hole/FTL repository
uses: actions/checkout@v4
with:
repository: pi-hole/FTL
ref: ${{ env.REF_FTL }}
path: ./dev/FTL

- name: Set old hashes
id: old-hashes
run: |
echo "CORE_HASH=$(sed -n "s/^ REF_CORE: \([[:alnum:]]*\).*$/\1/p" ./.github/workflows/build.yml)" >> $GITHUB_OUTPUT
echo "WEB_HASH=$(sed -n "s/^ REF_WEB: \([[:alnum:]]*\).*$/\1/p" ./.github/workflows/build.yml)" >> $GITHUB_OUTPUT
echo "FTL_HASH=$(sed -n "s/^ REF_FTL: \([[:alnum:]]*\).*$/\1/p" ./.github/workflows/build.yml)" >> $GITHUB_OUTPUT
- name: Set new hashes
id: new-hashes
run: |
echo "CORE_HASH=$(git -C "./dev/core" rev-parse HEAD)" >> $GITHUB_OUTPUT
echo "WEB_HASH=$(git -C "./dev/web" rev-parse HEAD)" >> $GITHUB_OUTPUT
echo "FTL_HASH=$(git -C "./dev/FTL" rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Old hashes are not empty
if: ${{ steps.old-hashes.outputs.CORE_HASH == '' || steps.old-hashes.outputs.WEB_HASH == '' || steps.old-hashes.outputs.FTL_HASH == '' }}
run: exit 1

- name: At least one hash is different
if: ${{ steps.old-hashes.outputs.CORE_HASH == steps.new-hashes.outputs.CORE_HASH && steps.old-hashes.outputs.WEB_HASH == steps.new-hashes.outputs.WEB_HASH && steps.old-hashes.outputs.FTL_HASH == steps.new-hashes.outputs.FTL_HASH}}
run: exit 1

- name: Apply patches (core)
id: patch-core
uses: ./.github/actions/patch
with:
patches_prefix: core
git_path: ./dev/core

- name: Apply patches (web)
id: patch-web
uses: ./.github/actions/patch
with:
patches_prefix: web
git_path: ./dev/web

- name: Apply patches (FTL)
id: patch-FTL
uses: ./.github/actions/patch
with:
patches_prefix: FTL
git_path: ./dev/FTL

- name: Set status
id: status
run: echo "RESULT=true" >> $GITHUB_OUTPUT

update:
concurrency: update
needs: [check]
if: ${{ needs.check.outputs.STATUS == 'true' }}
runs-on: ubuntu-latest

permissions:
contents: write

steps:
- name: Checkout own repository
uses: actions/checkout@v4

- name: Replace refs in build workflow
run: |
sed 's/ REF_CORE:.*$/ REF_CORE: ${{ needs.check.outputs.CORE_HASH }}/' -i ./.github/workflows/build.yml
sed 's/ REF_WEB:.*$/ REF_WEB: ${{ needs.check.outputs.WEB_HASH }}/' -i ./.github/workflows/build.yml
sed 's/ REF_FTL:.*$/ REF_FTL: ${{ needs.check.outputs.FTL_HASH }}/' -i ./.github/workflows/build.yml
- name: Is repository modified?
id: modified
run: |
echo "RESULT=$([ "git diff" != "" ] && echo yes || echo no)" >> $GITHUB_OUTPUT
- name: Create tag
if: ${{ steps.modified.outputs.RESULT == 'yes' }}
id: tag
run: echo "RESULT=$(bash ./scripts/tag.sh)" >> $GITHUB_OUTPUT

- name: Print tag and changes
run: |
echo "New tag: ${{ steps.tag.outputs.RESULT }}"
git diff
- name: Commit and Push changes
if: ${{ steps.tag.outputs.RESULT != '' && github.event_name == 'schedule' }}
uses: uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'Automatic update to ${{ steps.tag.outputs.RESULT }}'
file_pattern: ./.github/workflow/build.yml
tagging_message: ${{ steps.tag.outputs.RESULT }}
push_options: --dry-run
18 changes: 18 additions & 0 deletions scripts/tag.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash
# Made by Jack'lul <jacklul.github.io>

REVISION=0
TAG=""
LIMIT=100

while [ "$TAG" = "" ] || git tag | grep -q "$TAG"; do
REVISION=$((REVISION+1))
TAG=$(date +%Y.%m.%d)-$REVISION

LIMIT=$((LIMIT-1))
if [ $LIMIT -le 0 ]; then
exit 1
fi
done

echo "$TAG"

0 comments on commit 6df5a48

Please sign in to comment.