Skip to content

Check Duplicati Updates #180

Check Duplicati Updates

Check Duplicati Updates #180

name: Check Duplicati Updates
on:
schedule:
- cron: "0 6 * * *"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
check:
runs-on: ubuntu-latest
name: Check for new Duplicati canary releases
steps:
- name: Check out repository
uses: actions/checkout@v6.0.2
- name: Check for updates
id: check
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
BUILD_YAML="duplicati/build.yaml"
CURRENT_VERSION=$(grep 'DUPLICATI_VERSION:' "$BUILD_YAML" | sed 's/.*: *"\(.*\)"/\1/')
CURRENT_DATE=$(grep 'DUPLICATI_DATE:' "$BUILD_YAML" | sed 's/.*: *"\(.*\)"/\1/')
CURRENT_CHANNEL=$(grep 'DUPLICATI_CHANNEL:' "$BUILD_YAML" | sed 's/.*: *"\(.*\)"/\1/')
echo "Current: ${CURRENT_VERSION} (${CURRENT_CHANNEL}, ${CURRENT_DATE})"
LATEST=$(curl -sSL "https://api.github.com/repos/duplicati/duplicati/releases?per_page=20" | \
jq -r --arg channel "$CURRENT_CHANNEL" \
'[.[] | select(.tag_name | contains($channel))][0].tag_name // empty')
if [[ -z "$LATEST" ]]; then
echo "No ${CURRENT_CHANNEL} releases found"
echo "update_available=false" >> $GITHUB_OUTPUT
exit 0
fi
LATEST_VERSION=$(echo "$LATEST" | sed "s/^v\(.*\)_${CURRENT_CHANNEL}_.*$/\1/")
LATEST_DATE=$(echo "$LATEST" | sed "s/^v.*_${CURRENT_CHANNEL}_\(.*\)$/\1/")
echo "Latest: ${LATEST_VERSION} (${CURRENT_CHANNEL}, ${LATEST_DATE})"
if [[ "$CURRENT_VERSION" == "$LATEST_VERSION" ]] && [[ "$CURRENT_DATE" == "$LATEST_DATE" ]]; then
echo "Already up to date"
echo "update_available=false" >> $GITHUB_OUTPUT
else
echo "Update available!"
echo "update_available=true" >> $GITHUB_OUTPUT
echo "new_version=${LATEST_VERSION}" >> $GITHUB_OUTPUT
echo "new_date=${LATEST_DATE}" >> $GITHUB_OUTPUT
echo "channel=${CURRENT_CHANNEL}" >> $GITHUB_OUTPUT
fi
- name: Create update PR
if: steps.check.outputs.update_available == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NEW_VERSION: ${{ steps.check.outputs.new_version }}
NEW_DATE: ${{ steps.check.outputs.new_date }}
CHANNEL: ${{ steps.check.outputs.channel }}
run: |
BRANCH="update-duplicati-${NEW_VERSION}"
if git ls-remote --heads origin "$BRANCH" | grep -q "$BRANCH"; then
echo "Branch ${BRANCH} already exists, skipping"
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git checkout -b "$BRANCH"
BUILD_YAML="duplicati/build.yaml"
CONFIG_YAML="duplicati/config.yaml"
CHANGELOG="duplicati/CHANGELOG.md"
sed -i "s/DUPLICATI_VERSION: *\".*\"/DUPLICATI_VERSION: \"${NEW_VERSION}\"/" "$BUILD_YAML"
sed -i "s/DUPLICATI_DATE: *\".*\"/DUPLICATI_DATE: \"${NEW_DATE}\"/" "$BUILD_YAML"
CURRENT_ADDON_VERSION=$(grep '^version:' "$CONFIG_YAML" | sed 's/version: *"\(.*\)"/\1/')
NEW_ADDON_VERSION=$(echo "$CURRENT_ADDON_VERSION" | awk -F. '{printf "%d.%d.%d", $1, $2, $3+1}')
sed -i "s/^version: *\".*\"/version: \"${NEW_ADDON_VERSION}\"/" "$CONFIG_YAML"
if [[ -f "$CHANGELOG" ]]; then
sed -i "/^<!-- .* -->/a\\
\\
## ${NEW_ADDON_VERSION}\\
\\
- ⬆️ Update Duplicati to v${NEW_VERSION} (${NEW_DATE})" "$CHANGELOG"
fi
echo "Updated: addon v${NEW_ADDON_VERSION}, Duplicati v${NEW_VERSION}"
git add -A
git commit -m "⬆️ build(deps): Update Duplicati to v${NEW_VERSION} (${CHANNEL})"
git push origin "$BRANCH"
gh pr create \
--title "⬆️ Update Duplicati to v${NEW_VERSION}" \
--body "$(cat <<EOF
## Summary
- Update Duplicati to **v${NEW_VERSION}** (${CHANNEL}, ${NEW_DATE})
- Auto-generated by the check-updates workflow
## Test plan
- [ ] CI build passes for both amd64 and aarch64
- [ ] Lint passes
- [ ] Container startup test passes
🤖 Generated automatically
EOF
)" \
--base main \
--head "$BRANCH"