mirror of
https://github.com/community-scripts/ProxmoxVED.git
synced 2026-02-25 05:57:26 +00:00
cleanup
This commit is contained in:
122
.github/workflows/bak/auto-update-app-headers.yml.bak
generated
vendored
Normal file
122
.github/workflows/bak/auto-update-app-headers.yml.bak
generated
vendored
Normal file
@@ -0,0 +1,122 @@
|
||||
name: Auto Update .app-files
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- "ct/**.sh"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-app-files:
|
||||
if: github.repository == 'community-scripts/ProxmoxVED'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
|
||||
- name: Generate a token for PR approval and merge
|
||||
id: generate-token-merge
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
# Step 1: Checkout repository
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Step 2: Disable file mode changes detection
|
||||
- name: Disable file mode changes
|
||||
run: git config core.fileMode false
|
||||
|
||||
# Step 3: Set up Git user for committing changes
|
||||
- name: Set up Git
|
||||
run: |
|
||||
git config --global user.name "GitHub Actions"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
# Step 4: Install figlet
|
||||
- name: Install figlet
|
||||
run: sudo apt-get install -y figlet
|
||||
|
||||
# Step 5: Run the updated generate-app-files.sh script
|
||||
- name: Run generate-app-files.sh
|
||||
run: |
|
||||
chmod +x .github/workflows/scripts/generate-app-headers.sh
|
||||
.github/workflows/scripts/generate-app-headers.sh
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Step 6: Check if there are any changes
|
||||
- name: Check if there are any changes
|
||||
run: |
|
||||
echo "Checking for changes..."
|
||||
git add -A # Untracked Dateien aufnehmen
|
||||
git status
|
||||
if git diff --cached --quiet; then
|
||||
echo "No changes detected."
|
||||
echo "changed=false" >> "$GITHUB_ENV"
|
||||
else
|
||||
echo "Changes detected:"
|
||||
git diff --stat --cached
|
||||
echo "changed=true" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
# Step 7: Commit and create PR if changes exist
|
||||
- name: Commit and create PR if changes exist
|
||||
if: env.changed == 'true'
|
||||
run: |
|
||||
git commit -m "Update .app files"
|
||||
git checkout -b pr-update-app-files
|
||||
git push origin pr-update-app-files --force
|
||||
gh pr create --title "[core] update .app files" \
|
||||
--body "This PR is auto-generated by a GitHub Action to update the .app files." \
|
||||
--head pr-update-app-files \
|
||||
--base main \
|
||||
--label "automated pr"
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
|
||||
- name: Approve pull request
|
||||
if: env.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number')
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
gh pr review $PR_NUMBER --approve
|
||||
fi
|
||||
|
||||
- name: Approve pull request and merge
|
||||
if: env.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
|
||||
run: |
|
||||
git config --global user.name "github-actions-automege[bot]"
|
||||
git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
|
||||
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[0].number')
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
gh pr review "$PR_NUMBER" --approve
|
||||
gh pr merge "$PR_NUMBER" --squash --admin
|
||||
fi
|
||||
|
||||
# Step 8: Output success message when no changes
|
||||
- name: No changes detected
|
||||
if: env.changed == 'false'
|
||||
run: echo "No changes to commit. Workflow completed successfully."
|
||||
72
.github/workflows/bak/get-versions-from-gh.yaml
generated
vendored
Normal file
72
.github/workflows/bak/get-versions-from-gh.yaml
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
name: Crawl Versions from github
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Runs at 12:00 AM and 12:00 PM UTC
|
||||
- cron: "0 0,12 * * *"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
crawl-versions:
|
||||
if: github.repository == 'community-scripts/ProxmoxVED'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: community-scripts/ProxmoxVED
|
||||
ref: main
|
||||
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Crawl from Github API
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
ls
|
||||
|
||||
chmod +x .github/workflows/scripts/get-gh-release.sh
|
||||
.github/workflows/scripts/get-gh-release.sh
|
||||
|
||||
- name: Commit JSON
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
run: |
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git config --global user.name "GitHub Actions[bot]"
|
||||
git checkout -b update_versions || git checkout update_versions
|
||||
git add frontend/public/json/versions.json
|
||||
if git diff --cached --quiet; then
|
||||
echo "No changes detected."
|
||||
echo "changed=false" >> "$GITHUB_ENV"
|
||||
exit 0
|
||||
else
|
||||
echo "Changes detected:"
|
||||
git diff --stat --cached
|
||||
echo "changed=true" >> "$GITHUB_ENV"
|
||||
fi
|
||||
git commit -m "Update versions.json"
|
||||
git push origin update_versions --force
|
||||
gh pr create --title "[AUTOMATIC PR]Update versions.json" --body "Update versions.json, crawled from newreleases.io" --base main --head update_versions
|
||||
|
||||
- name: Approve pull request
|
||||
if: env.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
PR_NUMBER=$(gh pr list --head "update_versions" --json number --jq '.[].number')
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
gh pr review $PR_NUMBER --approve
|
||||
fi
|
||||
132
.github/workflows/bak/get-versions-from-newreleases.yaml
generated
vendored
Normal file
132
.github/workflows/bak/get-versions-from-newreleases.yaml
generated
vendored
Normal file
@@ -0,0 +1,132 @@
|
||||
name: Crawl Versions from newreleases.io
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Runs at 12:00 AM and 12:00 PM UTC
|
||||
- cron: "0 0,12 * * *"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
crawl-versions:
|
||||
if: github.repository == 'community-scripts/ProxmoxVED'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: community-scripts/ProxmoxVED
|
||||
ref: main
|
||||
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Generate a token for PR approval and merge
|
||||
id: generate-token-merge
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
|
||||
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Crawl from newreleases.io
|
||||
env:
|
||||
token: ${{ secrets.NEWRELEASES_TOKEN }}
|
||||
run: |
|
||||
page=1
|
||||
projects_file="project_json"
|
||||
output_file="frontend/public/json/versions.json"
|
||||
|
||||
echo "[]" > $output_file
|
||||
|
||||
while true; do
|
||||
|
||||
echo "Start loop on page: $page"
|
||||
|
||||
projects=$(curl -s -H "X-Key: $token" "https://api.newreleases.io/v1/projects?page=$page")
|
||||
total_pages=$(echo "$projects" | jq -r '.total_pages')
|
||||
|
||||
if [ -z "$total_pages" ] || [ "$total_pages" -eq 0 ]; then
|
||||
echo "No pages available. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
if [ $page == $total_pages ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
if [ -z "$projects" ] || ! echo "$projects" | jq -e '.projects' > /dev/null; then
|
||||
echo "No more projects or invalid response. Exiting."
|
||||
break
|
||||
fi
|
||||
|
||||
echo "$projects" > "$projects_file"
|
||||
|
||||
jq -r '.projects[] | "\(.id) \(.name)"' "$projects_file" | while read -r id name; do
|
||||
echo "Ensuring $name has exclude_prereleases=true"
|
||||
curl -s -X POST -H "X-Key: $token" -H "Content-Type: application/json" \
|
||||
-d '{"exclude_prereleases": true}' \
|
||||
"https://api.newreleases.io/v1/projects/$id" > /dev/null
|
||||
version=$(curl -s -H "X-Key: $token" "https://api.newreleases.io/v1/projects/$id/latest-release")
|
||||
version_data=$(echo "$version" | jq -r '.version // empty')
|
||||
date=$(echo "$version" | jq -r '.date // empty')
|
||||
if [ -n "$version_data" ]; then
|
||||
jq --arg name "$name" --arg version "$version_data" --arg date "$date" \
|
||||
'. += [{"name": $name, "version": $version, "date": $date}]' "$output_file" > "$output_file.tmp" && mv "$output_file.tmp" "$output_file"
|
||||
fi
|
||||
done
|
||||
((page++))
|
||||
done
|
||||
|
||||
- name: Commit JSON
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
run: |
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git config --global user.name "GitHub Actions[bot]"
|
||||
git checkout -b update_versions || git checkout update_versions
|
||||
git add frontend/public/json/versions.json
|
||||
if git diff --cached --quiet; then
|
||||
echo "No changes detected."
|
||||
echo "changed=false" >> "$GITHUB_ENV"
|
||||
exit 0
|
||||
else
|
||||
echo "Changes detected:"
|
||||
git diff --stat --cached
|
||||
echo "changed=true" >> "$GITHUB_ENV"
|
||||
fi
|
||||
git commit -m "Update versions.json"
|
||||
git push origin update_versions --force
|
||||
gh pr create --title "[AUTOMATIC PR]Update versions.json" --body "Update versions.json, crawled from newreleases.io" --base main --head update_versions
|
||||
- name: Approve pull request
|
||||
if: env.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
PR_NUMBER=$(gh pr list --head "update_versions" --json number --jq '.[].number')
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
gh pr review $PR_NUMBER --approve
|
||||
fi
|
||||
|
||||
- name: Approve pull request and merge
|
||||
if: env.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
|
||||
run: |
|
||||
git config --global user.name "github-actions-automege[bot]"
|
||||
git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
|
||||
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[0].number')
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
gh pr review "$PR_NUMBER" --approve
|
||||
gh pr merge "$PR_NUMBER" --squash --admin
|
||||
fi
|
||||
106
.github/workflows/bak/revision-bump.yml.bak
generated
vendored
Normal file
106
.github/workflows/bak/revision-bump.yml.bak
generated
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
name: Bump build.func Revision
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- "misc/**"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
bump-revision:
|
||||
if: github.repository == 'community-scripts/ProxmoxVED'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Generate token for PR
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Generate token for auto-merge
|
||||
id: generate-token-merge
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
|
||||
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Get changed files
|
||||
id: changes
|
||||
run: |
|
||||
git diff --name-only HEAD^ HEAD > changed_files.txt
|
||||
echo "Changed files:"
|
||||
cat changed_files.txt
|
||||
|
||||
- name: Skip if only build.func changed
|
||||
id: skipcheck
|
||||
run: |
|
||||
if grep -q "^misc/build.func$" changed_files.txt && [ $(wc -l < changed_files.txt) -eq 1 ]; then
|
||||
echo "skip=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "skip=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Disable file mode changes
|
||||
run: git config core.fileMode false
|
||||
|
||||
- name: Bump build.func revision
|
||||
if: env.skip == 'false'
|
||||
run: |
|
||||
REV_FILE=".build-revision"
|
||||
if [ ! -f "$REV_FILE" ]; then echo 0 > "$REV_FILE"; fi
|
||||
REV_NUM=$(($(cat $REV_FILE) + 1))
|
||||
echo $REV_NUM > $REV_FILE
|
||||
SHORT_SHA=$(git rev-parse --short HEAD)
|
||||
REV_STR="Revision: r${REV_NUM} (git-${SHORT_SHA})"
|
||||
|
||||
echo "Updating build.func with $REV_STR"
|
||||
sed -i "s/^# Revision:.*/# $REV_STR/" misc/build.func
|
||||
echo "REV_STR=$REV_STR" >> $GITHUB_ENV
|
||||
|
||||
git config --global user.name "GitHub Actions"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git add misc/build.func .build-revision
|
||||
git commit -m "chore: bump build.func to $REV_STR"
|
||||
|
||||
- name: Create PR
|
||||
if: env.skip == 'false'
|
||||
run: |
|
||||
BRANCH_NAME="pr-build-revision-$(date +'%Y%m%d%H%M%S')"
|
||||
git checkout -b $BRANCH_NAME
|
||||
git push origin $BRANCH_NAME
|
||||
|
||||
gh pr create --title "[core] bump build.func to $REV_STR" \
|
||||
--body "This PR bumps build.func revision because files in misc/ changed." \
|
||||
--head $BRANCH_NAME \
|
||||
--base main \
|
||||
--label "automated pr"
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
|
||||
- name: Approve PR and merge
|
||||
if: env.skip == 'false'
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
|
||||
run: |
|
||||
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
gh pr review $PR_NUMBER --approve
|
||||
gh pr merge $PR_NUMBER --squash --admin
|
||||
fi
|
||||
|
||||
- name: Skip log
|
||||
if: env.skip == 'true'
|
||||
run: echo "Only build.func changed – nothing to do."
|
||||
177
.github/workflows/bak/script-test.yaml
generated
vendored
Normal file
177
.github/workflows/bak/script-test.yaml
generated
vendored
Normal file
@@ -0,0 +1,177 @@
|
||||
name: Run Scripts on PVE Node for testing
|
||||
permissions:
|
||||
pull-requests: write
|
||||
on:
|
||||
pull_request_target:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- "install/**.sh"
|
||||
- "ct/**.sh"
|
||||
|
||||
jobs:
|
||||
run-install-script:
|
||||
if: github.repository == 'community-scripts/ProxmoxVED'
|
||||
runs-on: pvenode
|
||||
steps:
|
||||
- name: Checkout PR branch
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Add Git safe directory
|
||||
run: |
|
||||
git config --global --add safe.directory /__w/ProxmoxVE/ProxmoxVE
|
||||
|
||||
- name: Set up GH_TOKEN
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
echo "GH_TOKEN=${GH_TOKEN}" >> $GITHUB_ENV
|
||||
|
||||
- name: Get Changed Files
|
||||
run: |
|
||||
CHANGED_FILES=$(gh pr diff ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --name-only)
|
||||
CHANGED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')
|
||||
echo "Changed files: $CHANGED_FILES"
|
||||
echo "SCRIPT=$CHANGED_FILES" >> $GITHUB_ENV
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Get scripts
|
||||
id: check-install-script
|
||||
run: |
|
||||
ALL_FILES=()
|
||||
ADDED_FILES=()
|
||||
for FILE in ${{ env.SCRIPT }}; do
|
||||
if [[ $FILE =~ ^install/.*-install\.sh$ ]] || [[ $FILE =~ ^ct/.*\.sh$ ]]; then
|
||||
STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
|
||||
if [[ ! " ${ADDED_FILES[@]} " =~ " $STRIPPED_NAME " ]]; then
|
||||
ALL_FILES+=("$FILE")
|
||||
ADDED_FILES+=("$STRIPPED_NAME") # Mark this base file as added (without the path)
|
||||
fi
|
||||
fi
|
||||
done
|
||||
ALL_FILES=$(echo "${ALL_FILES[@]}" | xargs)
|
||||
echo "$ALL_FILES"
|
||||
echo "ALL_FILES=$ALL_FILES" >> $GITHUB_ENV
|
||||
|
||||
- name: Run scripts
|
||||
id: run-install
|
||||
continue-on-error: true
|
||||
run: |
|
||||
set +e
|
||||
#run for each files in /ct
|
||||
for FILE in ${{ env.ALL_FILES }}; do
|
||||
STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
|
||||
echo "Running Test for: $STRIPPED_NAME"
|
||||
if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "$FILE"; then
|
||||
echo "The script contains an interactive prompt. Skipping execution."
|
||||
continue
|
||||
fi
|
||||
if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
|
||||
CT_SCRIPT="ct/$STRIPPED_NAME.sh"
|
||||
if [[ ! -f $CT_SCRIPT ]]; then
|
||||
echo "No CT script found for $STRIPPED_NAME"
|
||||
ERROR_MSG="No CT script found for $FILE"
|
||||
echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
|
||||
continue
|
||||
fi
|
||||
if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "install/$STRIPPED_NAME-install.sh"; then
|
||||
echo "The script contains an interactive prompt. Skipping execution."
|
||||
continue
|
||||
fi
|
||||
echo "Found CT script for $STRIPPED_NAME"
|
||||
chmod +x "$CT_SCRIPT"
|
||||
RUNNING_FILE=$CT_SCRIPT
|
||||
elif [[ $FILE =~ ^ct/.*\.sh$ ]]; then
|
||||
INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
|
||||
if [[ ! -f $INSTALL_SCRIPT ]]; then
|
||||
echo "No install script found for $STRIPPED_NAME"
|
||||
ERROR_MSG="No install script found for $FILE"
|
||||
echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
|
||||
continue
|
||||
fi
|
||||
echo "Found install script for $STRIPPED_NAME"
|
||||
chmod +x "$INSTALL_SCRIPT"
|
||||
RUNNING_FILE=$FILE
|
||||
if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "ct/$STRIPPED_NAME.sh"; then
|
||||
echo "The script contains an interactive prompt. Skipping execution."
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
git remote add community-scripts https://github.com/community-scripts/ProxmoxVE.git
|
||||
git fetch community-scripts
|
||||
rm -f .github/workflows/scripts/app-test/pr-build.func || true
|
||||
rm -f .github/workflows/scripts/app-test/pr-install.func || true
|
||||
rm -f .github/workflows/scripts/app-test/pr-alpine-install.func || true
|
||||
rm -f .github/workflows/scripts/app-test/pr-create-lxc.sh || true
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-build.func
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-install.func
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-alpine-install.func
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-create-lxc.sh
|
||||
chmod +x $RUNNING_FILE
|
||||
chmod +x .github/workflows/scripts/app-test/pr-create-lxc.sh
|
||||
chmod +x .github/workflows/scripts/app-test/pr-install.func
|
||||
chmod +x .github/workflows/scripts/app-test/pr-alpine-install.func
|
||||
chmod +x .github/workflows/scripts/app-test/pr-build.func
|
||||
sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
|
||||
echo "Executing $RUNNING_FILE"
|
||||
export TERM=xterm-256color
|
||||
./$RUNNING_FILE
|
||||
ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
|
||||
echo "Finished running $FILE"
|
||||
if [ -n "$ERROR_MSG" ]; then
|
||||
echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
|
||||
echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
|
||||
fi
|
||||
done
|
||||
set -e # Restore exit-on-error
|
||||
|
||||
- name: Cleanup PVE Node
|
||||
run: |
|
||||
containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}' | awk '{print $1}')
|
||||
|
||||
for container_id in $containers; do
|
||||
status=$(pct status $container_id | awk '{print $2}')
|
||||
if [[ $status == "running" ]]; then
|
||||
pct stop $container_id
|
||||
pct destroy $container_id
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Post error comments
|
||||
run: |
|
||||
ERROR="false"
|
||||
SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line 255:"
|
||||
|
||||
# Get all existing comments on the PR
|
||||
#EXISTING_COMMENTS=$(gh pr view ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --json comments --jq '.comments[].body')
|
||||
EXISTING_COMMENTS="NONE"
|
||||
for FILE in ${{ env.ALL_FILES }}; do
|
||||
STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
|
||||
if [[ ! -f result_$STRIPPED_NAME.log ]]; then
|
||||
continue
|
||||
fi
|
||||
ERROR_MSG=$(cat result_$STRIPPED_NAME.log)
|
||||
|
||||
if [ -n "$ERROR_MSG" ]; then
|
||||
CLEANED_ERROR_MSG=$(echo "$ERROR_MSG" | sed "s|$SEARCH_LINE.*||")
|
||||
COMMENT_BODY=":warning: The script _**$FILE**_ failed with the following message: <br> <div><strong>${CLEANED_ERROR_MSG}</strong></div>"
|
||||
|
||||
# Check if the comment already exists
|
||||
if echo "$EXISTING_COMMENTS" | grep -qF "$COMMENT_BODY"; then
|
||||
echo "Skipping duplicate comment for $FILE"
|
||||
else
|
||||
echo "Posting error message for $FILE"
|
||||
gh pr comment ${{ github.event.pull_request.number }} \
|
||||
--repo ${{ github.repository }} \
|
||||
--body "$COMMENT_BODY"
|
||||
ERROR="true"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo "ERROR=$ERROR" >> $GITHUB_ENV
|
||||
505
.github/workflows/bak/update-versions-github.yml
generated
vendored
Normal file
505
.github/workflows/bak/update-versions-github.yml
generated
vendored
Normal file
@@ -0,0 +1,505 @@
|
||||
name: Update Versions from GitHub
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Runs at 06:00 and 18:00 UTC
|
||||
- cron: "0 6,18 * * *"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
env:
|
||||
SOURCES_FILE: frontend/public/json/version-sources.json
|
||||
VERSIONS_FILE: frontend/public/json/versions.json
|
||||
|
||||
jobs:
|
||||
update-versions:
|
||||
if: github.repository == 'community-scripts/ProxmoxVE'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
|
||||
- name: Extract version sources from install scripts
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "========================================="
|
||||
echo " Extracting version sources from scripts"
|
||||
echo "========================================="
|
||||
|
||||
# Initialize sources array
|
||||
sources_json="[]"
|
||||
|
||||
# Function to add a source entry
|
||||
add_source() {
|
||||
local slug="$1"
|
||||
local type="$2"
|
||||
local source="$3"
|
||||
local script="$4"
|
||||
|
||||
# Check if slug already exists (avoid duplicates)
|
||||
if echo "$sources_json" | jq -e ".[] | select(.slug == \"$slug\")" > /dev/null 2>&1; then
|
||||
return
|
||||
fi
|
||||
|
||||
sources_json=$(echo "$sources_json" | jq \
|
||||
--arg slug "$slug" \
|
||||
--arg type "$type" \
|
||||
--arg source "$source" \
|
||||
--arg script "$script" \
|
||||
'. += [{"slug": $slug, "type": $type, "source": $source, "script": $script, "version": null, "date": null}]')
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo "=== Method 1: fetch_and_deploy_gh_release calls ==="
|
||||
count=0
|
||||
for script in install/*-install.sh; do
|
||||
[[ ! -f "$script" ]] && continue
|
||||
slug=$(basename "$script" | sed 's/-install\.sh$//')
|
||||
|
||||
# Extract repo from fetch_and_deploy_gh_release "app" "owner/repo"
|
||||
while IFS= read -r line; do
|
||||
if [[ "$line" =~ fetch_and_deploy_gh_release[[:space:]]+\"[^\"]*\"[[:space:]]+\"([^\"]+)\" ]]; then
|
||||
repo="${BASH_REMATCH[1]}"
|
||||
add_source "$slug" "github" "$repo" "$script"
|
||||
((count++))
|
||||
break # Only first match per script
|
||||
fi
|
||||
done < <(grep 'fetch_and_deploy_gh_release' "$script" 2>/dev/null || true)
|
||||
done
|
||||
echo "Found $count scripts with fetch_and_deploy_gh_release"
|
||||
|
||||
echo ""
|
||||
echo "=== Method 2: GitHub URLs in scripts (fallback) ==="
|
||||
count=0
|
||||
for script in install/*-install.sh; do
|
||||
[[ ! -f "$script" ]] && continue
|
||||
slug=$(basename "$script" | sed 's/-install\.sh$//')
|
||||
|
||||
# Skip if already found
|
||||
if echo "$sources_json" | jq -e ".[] | select(.slug == \"$slug\")" > /dev/null 2>&1; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Look for github.com/owner/repo patterns
|
||||
repo=$(grep -oE 'github\.com/([a-zA-Z0-9_-]+/[a-zA-Z0-9_.-]+)' "$script" 2>/dev/null \
|
||||
| sed 's|github\.com/||' \
|
||||
| sed 's/\.git$//' \
|
||||
| grep -v 'community-scripts/ProxmoxVE' \
|
||||
| grep -v '^repos/' \
|
||||
| head -1 || true)
|
||||
|
||||
if [[ -n "$repo" && "$repo" =~ ^[a-zA-Z0-9_-]+/[a-zA-Z0-9_.-]+$ ]]; then
|
||||
add_source "$slug" "github" "$repo" "$script"
|
||||
((count++))
|
||||
fi
|
||||
done
|
||||
echo "Found $count additional scripts with GitHub URLs"
|
||||
|
||||
echo ""
|
||||
echo "=== Method 3: npm packages ==="
|
||||
# Detect npm install --global <package>
|
||||
for script in install/*-install.sh; do
|
||||
[[ ! -f "$script" ]] && continue
|
||||
slug=$(basename "$script" | sed 's/-install\.sh$//')
|
||||
|
||||
# Skip if already found
|
||||
if echo "$sources_json" | jq -e ".[] | select(.slug == \"$slug\")" > /dev/null 2>&1; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Look for npm install --global <package>
|
||||
pkg=$(grep -oE 'npm install[^|;]*--global[^|;]*' "$script" 2>/dev/null \
|
||||
| grep -oE '\s[a-z][a-z0-9_-]+(@[^\s]+)?$' \
|
||||
| tr -d ' ' \
|
||||
| sed 's/@.*//' \
|
||||
| tail -1 || true)
|
||||
|
||||
if [[ -n "$pkg" ]]; then
|
||||
add_source "$slug" "npm" "$pkg" "$script"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== Method 4: Docker images ==="
|
||||
# Known Docker-based apps (from docker pull or docker run)
|
||||
declare -A docker_mappings=(
|
||||
["homeassistant"]="homeassistant/home-assistant"
|
||||
["portainer"]="portainer/portainer-ce"
|
||||
["dockge"]="louislam/dockge"
|
||||
["immich"]="ghcr.io/immich-app/immich-server"
|
||||
["audiobookshelf"]="ghcr.io/advplyr/audiobookshelf"
|
||||
["podman-homeassistant"]="homeassistant/home-assistant"
|
||||
)
|
||||
|
||||
for slug in "${!docker_mappings[@]}"; do
|
||||
image="${docker_mappings[$slug]}"
|
||||
if ! echo "$sources_json" | jq -e ".[] | select(.slug == \"$slug\")" > /dev/null 2>&1; then
|
||||
add_source "$slug" "docker" "$image" "install/${slug}-install.sh"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== Method 5: Manual GitHub mappings (apt-based apps) ==="
|
||||
# Apps that install via apt but have GitHub releases for version tracking
|
||||
declare -A manual_github_mappings=(
|
||||
["actualbudget"]="actualbudget/actual"
|
||||
["apache-cassandra"]="apache/cassandra"
|
||||
["apache-couchdb"]="apache/couchdb"
|
||||
["apache-guacamole"]="apache/guacamole-server"
|
||||
["apache-tomcat"]="apache/tomcat"
|
||||
["archivebox"]="ArchiveBox/ArchiveBox"
|
||||
["aria2"]="aria2/aria2"
|
||||
["asterisk"]="asterisk/asterisk"
|
||||
["casaos"]="IceWhaleTech/CasaOS"
|
||||
["checkmk"]="Checkmk/checkmk"
|
||||
["cloudflared"]="cloudflare/cloudflared"
|
||||
["coolify"]="coollabsio/coolify"
|
||||
["crafty-controller"]="crafty-controller/crafty-4"
|
||||
["cross-seed"]="cross-seed/cross-seed"
|
||||
["deconz"]="dresden-elektronik/deconz-rest-plugin"
|
||||
["deluge"]="deluge-torrent/deluge"
|
||||
["dokploy"]="Dokploy/dokploy"
|
||||
["emqx"]="emqx/emqx"
|
||||
["esphome"]="esphome/esphome"
|
||||
["flowiseai"]="FlowiseAI/Flowise"
|
||||
["forgejo"]="forgejo/forgejo"
|
||||
["garage"]="deuxfleurs-org/garage"
|
||||
["ghost"]="TryGhost/Ghost"
|
||||
["grafana"]="grafana/grafana"
|
||||
["graylog"]="Graylog2/graylog2-server"
|
||||
["homebridge"]="homebridge/homebridge"
|
||||
["hyperhdr"]="awawa-dev/HyperHDR"
|
||||
["hyperion"]="hyperion-project/hyperion.ng"
|
||||
["influxdb"]="influxdata/influxdb"
|
||||
["iobroker"]="ioBroker/ioBroker"
|
||||
["jenkins"]="jenkinsci/jenkins"
|
||||
["komodo"]="moghingold/komodo"
|
||||
["lazylibrarian"]="lazylibrarian/LazyLibrarian"
|
||||
["limesurvey"]="LimeSurvey/LimeSurvey"
|
||||
["mariadb"]="MariaDB/server"
|
||||
["mattermost"]="mattermost/mattermost"
|
||||
["meshcentral"]="Ylianst/MeshCentral"
|
||||
["metabase"]="metabase/metabase"
|
||||
["mongodb"]="mongodb/mongo"
|
||||
["mysql"]="mysql/mysql-server"
|
||||
["neo4j"]="neo4j/neo4j"
|
||||
["node-red"]="node-red/node-red"
|
||||
["ntfy"]="binwiederhier/ntfy"
|
||||
["nzbget"]="nzbgetcom/nzbget"
|
||||
["octoprint"]="OctoPrint/OctoPrint"
|
||||
["onedev"]="theonedev/onedev"
|
||||
["onlyoffice"]="ONLYOFFICE/DocumentServer"
|
||||
["openhab"]="openhab/openhab-distro"
|
||||
["openobserve"]="openobserve/openobserve"
|
||||
["openwebui"]="open-webui/open-webui"
|
||||
["passbolt"]="passbolt/passbolt_api"
|
||||
["pihole"]="pi-hole/pi-hole"
|
||||
["postgresql"]="postgres/postgres"
|
||||
["rabbitmq"]="rabbitmq/rabbitmq-server"
|
||||
["readarr"]="Readarr/Readarr"
|
||||
["redis"]="redis/redis"
|
||||
["runtipi"]="runtipi/runtipi"
|
||||
["sftpgo"]="drakkan/sftpgo"
|
||||
["shinobi"]="ShinobiCCTV/Shinobi"
|
||||
["sonarqube"]="SonarSource/sonarqube"
|
||||
["sonarr"]="Sonarr/Sonarr"
|
||||
["syncthing"]="syncthing/syncthing"
|
||||
["tdarr"]="HaveAGitGat/Tdarr"
|
||||
["technitiumdns"]="TechnitiumSoftware/DnsServer"
|
||||
["transmission"]="transmission/transmission"
|
||||
["typesense"]="typesense/typesense"
|
||||
["unmanic"]="Unmanic/unmanic"
|
||||
["valkey"]="valkey-io/valkey"
|
||||
["verdaccio"]="verdaccio/verdaccio"
|
||||
["vikunja"]="go-vikunja/vikunja"
|
||||
["wazuh"]="wazuh/wazuh"
|
||||
["wordpress"]="WordPress/WordPress"
|
||||
["zabbix"]="zabbix/zabbix"
|
||||
["zammad"]="zammad/zammad"
|
||||
["zerotier-one"]="zerotier/ZeroTierOne"
|
||||
# Apps without known GitHub repos (use "-" as placeholder)
|
||||
["agentdvr"]="-"
|
||||
["apt-cacher-ng"]="-"
|
||||
["channels"]="-"
|
||||
["daemonsync"]="-"
|
||||
["dotnetaspwebapi"]="-"
|
||||
["fhem"]="-"
|
||||
["fileflows"]="-"
|
||||
["fumadocs"]="-"
|
||||
["infisical"]="-"
|
||||
["itsm-ng"]="-"
|
||||
["jupyternotebook"]="-"
|
||||
["kasm"]="-"
|
||||
["lyrionmusicserver"]="-"
|
||||
["minarca"]="-"
|
||||
["mqtt"]="-"
|
||||
["nextcloudpi"]="-"
|
||||
["nextpvr"]="-"
|
||||
["notifiarr"]="-"
|
||||
["nxwitness"]="-"
|
||||
["omada"]="-"
|
||||
["omv"]="-"
|
||||
["plex"]="-"
|
||||
["podman"]="-"
|
||||
["readeck"]="-"
|
||||
["resiliosync"]="-"
|
||||
["smokeping"]="-"
|
||||
["splunk-enterprise"]="-"
|
||||
["sqlserver2022"]="-"
|
||||
["swizzin"]="-"
|
||||
["teamspeak-server"]="-"
|
||||
["twingate-connector"]="-"
|
||||
["unifi"]="-"
|
||||
["urbackupserver"]="-"
|
||||
["yunohost"]="-"
|
||||
)
|
||||
|
||||
for slug in "${!manual_github_mappings[@]}"; do
|
||||
repo="${manual_github_mappings[$slug]}"
|
||||
if ! echo "$sources_json" | jq -e ".[] | select(.slug == \"$slug\")" > /dev/null 2>&1; then
|
||||
# Skip placeholder entries in extraction, they get added in Method 8
|
||||
[[ "$repo" == "-" ]] && continue
|
||||
add_source "$slug" "github" "$repo" "install/${slug}-install.sh"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== Method 6: Proxmox LXC templates ==="
|
||||
# Base OS versions from Proxmox template index
|
||||
declare -A pveam_mappings=(
|
||||
["debian"]="pveam:debian"
|
||||
["ubuntu"]="pveam:ubuntu"
|
||||
["alpine"]="pveam:alpine"
|
||||
)
|
||||
|
||||
for slug in "${!pveam_mappings[@]}"; do
|
||||
template="${pveam_mappings[$slug]}"
|
||||
if ! echo "$sources_json" | jq -e ".[] | select(.slug == \"$slug\")" > /dev/null 2>&1; then
|
||||
add_source "$slug" "pveam" "$template" "ct/${slug}.sh"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== Method 7: Special sources ==="
|
||||
# Home Assistant OS VM
|
||||
if ! echo "$sources_json" | jq -e ".[] | select(.slug == \"haos-vm\")" > /dev/null 2>&1; then
|
||||
add_source "haos-vm" "github" "home-assistant/operating-system" "vm/haos-vm.sh"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== Method 8: Unknown/Manual apps ==="
|
||||
# Apps without known version sources - add with type "manual" for manual updates
|
||||
unknown_apps=(
|
||||
"agentdvr" "apt-cacher-ng" "channels" "daemonsync" "dotnetaspwebapi"
|
||||
"fhem" "fileflows" "fumadocs" "infisical" "itsm-ng" "jupyternotebook"
|
||||
"kasm" "lyrionmusicserver" "minarca" "mqtt" "nextcloudpi" "nextpvr"
|
||||
"notifiarr" "nxwitness" "omada" "omv" "plex" "podman" "readeck"
|
||||
"resiliosync" "smokeping" "splunk-enterprise" "sqlserver2022" "swizzin"
|
||||
"teamspeak-server" "twingate-connector" "unifi" "urbackupserver" "yunohost"
|
||||
)
|
||||
|
||||
for slug in "${unknown_apps[@]}"; do
|
||||
if ! echo "$sources_json" | jq -e ".[] | select(.slug == \"$slug\")" > /dev/null 2>&1; then
|
||||
add_source "$slug" "manual" "-" "install/${slug}-install.sh"
|
||||
fi
|
||||
done
|
||||
|
||||
# Save sources file
|
||||
echo "$sources_json" | jq --arg date "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
||||
'{generated: $date, sources: (. | sort_by(.slug))}' > "$SOURCES_FILE"
|
||||
|
||||
total=$(echo "$sources_json" | jq 'length')
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo " Total sources extracted: $total"
|
||||
echo "========================================="
|
||||
|
||||
- name: Fetch versions for all sources
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "========================================="
|
||||
echo " Fetching versions from sources"
|
||||
echo "========================================="
|
||||
|
||||
success=0
|
||||
failed=0
|
||||
manual=0
|
||||
total=$(jq '.sources | length' "$SOURCES_FILE")
|
||||
|
||||
# Process each source
|
||||
for i in $(seq 0 $((total - 1))); do
|
||||
entry=$(jq -r ".sources[$i]" "$SOURCES_FILE")
|
||||
slug=$(echo "$entry" | jq -r '.slug')
|
||||
type=$(echo "$entry" | jq -r '.type')
|
||||
source=$(echo "$entry" | jq -r '.source')
|
||||
|
||||
echo -n "[$((i+1))/$total] $slug ($type: $source) ... "
|
||||
|
||||
version=""
|
||||
date=""
|
||||
|
||||
case "$type" in
|
||||
github)
|
||||
# Try releases first
|
||||
response=$(gh api "repos/${source}/releases/latest" 2>/dev/null || echo '{"message": "Not Found"}')
|
||||
|
||||
if echo "$response" | jq -e '.tag_name' > /dev/null 2>&1; then
|
||||
version=$(echo "$response" | jq -r '.tag_name')
|
||||
date=$(echo "$response" | jq -r '.published_at // empty')
|
||||
else
|
||||
# Fallback to tags
|
||||
version=$(gh api "repos/${source}/tags" --jq '.[0].name // empty' 2>/dev/null || echo "")
|
||||
fi
|
||||
;;
|
||||
|
||||
npm)
|
||||
response=$(curl -fsSL "https://registry.npmjs.org/${source}/latest" 2>/dev/null || echo '{}')
|
||||
version=$(echo "$response" | jq -r '.version // empty')
|
||||
;;
|
||||
|
||||
docker)
|
||||
if [[ "$source" == ghcr.io/* ]]; then
|
||||
# GitHub Container Registry
|
||||
ghcr_path="${source#ghcr.io/}"
|
||||
owner="${ghcr_path%%/*}"
|
||||
pkg="${ghcr_path##*/}"
|
||||
version=$(gh api "users/${owner}/packages/container/${pkg}/versions" --jq '.[0].metadata.container.tags[] | select(. != "latest")' 2>/dev/null | head -1 || echo "")
|
||||
else
|
||||
# Docker Hub
|
||||
version=$(curl -fsSL "https://hub.docker.com/v2/repositories/${source}/tags?page_size=10&ordering=last_updated" 2>/dev/null \
|
||||
| jq -r '.results[] | select(.name != "latest") | .name' | head -1 || echo "")
|
||||
fi
|
||||
;;
|
||||
|
||||
pveam)
|
||||
# Proxmox LXC template versions from download.proxmox.com
|
||||
os_name="${source#pveam:}"
|
||||
# Fetch the template index and get latest version
|
||||
version=$(curl -fsSL "http://download.proxmox.com/images/system/" 2>/dev/null \
|
||||
| grep -oE "${os_name}-[0-9]+\.[0-9]+-default_[0-9]+_amd64" \
|
||||
| sed "s/${os_name}-//" | sed 's/-default.*//' \
|
||||
| sort -V | tail -1 || echo "")
|
||||
;;
|
||||
|
||||
manual)
|
||||
# Manual entries - no automatic version fetching
|
||||
# These need to be updated manually or have their source type changed
|
||||
version="-"
|
||||
((manual++))
|
||||
echo -n "(manual) "
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -n "$version" && "$version" != "null" ]]; then
|
||||
# Update the source entry with version
|
||||
jq --arg idx "$i" --arg version "$version" --arg date "${date:-}" \
|
||||
'.sources[$idx | tonumber].version = $version | .sources[$idx | tonumber].date = $date' \
|
||||
"$SOURCES_FILE" > "${SOURCES_FILE}.tmp" && mv "${SOURCES_FILE}.tmp" "$SOURCES_FILE"
|
||||
echo "✓ $version"
|
||||
((success++))
|
||||
else
|
||||
echo "⚠ no version found"
|
||||
((failed++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo " SUMMARY"
|
||||
echo "========================================="
|
||||
echo "Success: $success (automated)"
|
||||
echo "Manual: $manual (placeholder)"
|
||||
echo "Failed: $failed"
|
||||
echo "Total: $total"
|
||||
echo "========================================="
|
||||
|
||||
- name: Generate versions.json for compatibility
|
||||
run: |
|
||||
# Convert version-sources.json to versions.json format for backward compatibility
|
||||
jq '[.sources[] | select(.version != null) | {name: .source, version: .version, date: .date}]' \
|
||||
"$SOURCES_FILE" > "$VERSIONS_FILE"
|
||||
|
||||
echo "Generated versions.json with $(jq length "$VERSIONS_FILE") entries"
|
||||
|
||||
- name: Check for changes
|
||||
id: check-changes
|
||||
run: |
|
||||
if git diff --quiet "$SOURCES_FILE" "$VERSIONS_FILE" 2>/dev/null; then
|
||||
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||||
echo "No changes detected"
|
||||
else
|
||||
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||||
echo "Changes detected:"
|
||||
git diff --stat "$SOURCES_FILE" "$VERSIONS_FILE" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
- name: Create Pull Request
|
||||
if: steps.check-changes.outputs.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
BRANCH_NAME="automated/update-versions-$(date +%Y%m%d)"
|
||||
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git config --global user.name "GitHub Actions[bot]"
|
||||
|
||||
# Check if branch exists and delete it
|
||||
git push origin --delete "$BRANCH_NAME" 2>/dev/null || true
|
||||
|
||||
git checkout -b "$BRANCH_NAME"
|
||||
git add "$SOURCES_FILE" "$VERSIONS_FILE"
|
||||
git commit -m "chore: update version-sources.json and versions.json
|
||||
|
||||
Sources: $(jq '.sources | length' "$SOURCES_FILE")
|
||||
With versions: $(jq '[.sources[] | select(.version != null)] | length' "$SOURCES_FILE")
|
||||
Generated: $(jq -r '.generated' "$SOURCES_FILE")"
|
||||
|
||||
git push origin "$BRANCH_NAME" --force
|
||||
|
||||
# Check if PR already exists
|
||||
existing_pr=$(gh pr list --head "$BRANCH_NAME" --state open --json number --jq '.[0].number // empty')
|
||||
|
||||
if [[ -n "$existing_pr" ]]; then
|
||||
echo "PR #$existing_pr already exists, updating..."
|
||||
else
|
||||
gh pr create \
|
||||
--title "[Automated] Update version-sources.json" \
|
||||
--body "This PR updates version information from multiple sources.
|
||||
|
||||
## Sources
|
||||
- **GitHub Releases**: Direct from \`fetch_and_deploy_gh_release\` calls
|
||||
- **GitHub URLs**: Extracted from install scripts
|
||||
- **npm Registry**: For Node.js based apps
|
||||
- **Docker Hub/GHCR**: For container-based apps
|
||||
|
||||
## Stats
|
||||
- Total sources: $(jq '.sources | length' "$SOURCES_FILE")
|
||||
- With versions: $(jq '[.sources[] | select(.version != null)] | length' "$SOURCES_FILE")
|
||||
|
||||
---
|
||||
*Automatically generated from install scripts*" \
|
||||
--base main \
|
||||
--head "$BRANCH_NAME" \
|
||||
--label "automated pr"
|
||||
fi
|
||||
|
||||
- name: Auto-approve PR
|
||||
if: steps.check-changes.outputs.changed == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
BRANCH_NAME="automated/update-versions-$(date +%Y%m%d)"
|
||||
pr_number=$(gh pr list --head "$BRANCH_NAME" --state open --json number --jq '.[0].number')
|
||||
if [[ -n "$pr_number" ]]; then
|
||||
gh pr review "$pr_number" --approve
|
||||
fi
|
||||
159
.github/workflows/bak/update_issue.yml
generated
vendored
Normal file
159
.github/workflows/bak/update_issue.yml
generated
vendored
Normal file
@@ -0,0 +1,159 @@
|
||||
name: Update Issue on PR Merge
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [closed]
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: read
|
||||
|
||||
jobs:
|
||||
update_issues:
|
||||
if: github.event.pull_request.merged == true && github.repository == 'community-scripts/ProxmoxVED'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Extract Script Names from Changed Files
|
||||
id: extract_scripts
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
CHANGED_FILES=$(gh pr diff ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --name-only)
|
||||
|
||||
SCRIPT_NAMES=()
|
||||
|
||||
while IFS= read -r FILE; do
|
||||
if [[ $FILE =~ ^ct/(.+)\.sh$ ]]; then
|
||||
SCRIPT_NAME="${BASH_REMATCH[1]}"
|
||||
if [[ ! " ${SCRIPT_NAMES[@]} " =~ " ${SCRIPT_NAME} " ]]; then
|
||||
SCRIPT_NAMES+=("$SCRIPT_NAME")
|
||||
fi
|
||||
elif [[ $FILE =~ ^install/(.+)-install\.sh$ ]]; then
|
||||
SCRIPT_NAME="${BASH_REMATCH[1]}"
|
||||
if [[ ! " ${SCRIPT_NAMES[@]} " =~ " ${SCRIPT_NAME} " ]]; then
|
||||
SCRIPT_NAMES+=("$SCRIPT_NAME")
|
||||
fi
|
||||
fi
|
||||
done <<< "$CHANGED_FILES"
|
||||
|
||||
if [ ${#SCRIPT_NAMES[@]} -eq 0 ]; then
|
||||
echo "No script files found in PR"
|
||||
echo "script_names=[]" >> $GITHUB_OUTPUT
|
||||
exit 0
|
||||
fi
|
||||
|
||||
JSON_NAMES=$(printf '%s\n' "${SCRIPT_NAMES[@]}" | jq -R . | jq -s -c .)
|
||||
echo "script_names=$JSON_NAMES" >> $GITHUB_OUTPUT
|
||||
echo "Found script names: ${SCRIPT_NAMES[*]}"
|
||||
|
||||
- name: Process Each Script
|
||||
if: steps.extract_scripts.outputs.script_names != '[]'
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||
SCRIPT_NAMES: ${{ steps.extract_scripts.outputs.script_names }}
|
||||
with:
|
||||
script: |
|
||||
const scriptNames = JSON.parse(process.env.SCRIPT_NAMES);
|
||||
const prAuthor = process.env.PR_AUTHOR;
|
||||
const message = `@${prAuthor} This PR got merged now and is in the testing phase, it will be migrated to ProxmoxVE when testing is completed`;
|
||||
const labelName = 'Ready For Testing';
|
||||
|
||||
for (const scriptName of scriptNames) {
|
||||
console.log(`Processing script: ${scriptName}`);
|
||||
|
||||
const { data: issues } = await github.rest.issues.listForRepo({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
state: 'open',
|
||||
per_page: 100
|
||||
});
|
||||
|
||||
const scriptNameLower = scriptName.toLowerCase();
|
||||
let existingIssue = issues.find(issue =>
|
||||
!issue.pull_request && issue.title.toLowerCase() === scriptNameLower
|
||||
);
|
||||
|
||||
if (!existingIssue) {
|
||||
const { data: searchResults } = await github.rest.search.issuesAndPullRequests({
|
||||
q: `repo:${context.repo.owner}/${context.repo.repo} is:issue is:open ${scriptName}`,
|
||||
per_page: 100
|
||||
});
|
||||
|
||||
existingIssue = searchResults.items.find(issue =>
|
||||
issue.title.toLowerCase() === scriptNameLower
|
||||
);
|
||||
}
|
||||
|
||||
if (existingIssue) {
|
||||
console.log(`Found existing issue #${existingIssue.number}: ${existingIssue.title}`);
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: existingIssue.number,
|
||||
body: message
|
||||
});
|
||||
|
||||
const { data: labels } = await github.rest.issues.listLabelsOnIssue({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: existingIssue.number
|
||||
});
|
||||
|
||||
const hasLabel = labels.some(label => label.name === labelName);
|
||||
|
||||
if (!hasLabel) {
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: existingIssue.number,
|
||||
labels: [labelName]
|
||||
});
|
||||
console.log(`Added "${labelName}" label to issue #${existingIssue.number}`);
|
||||
} else {
|
||||
console.log(`Issue #${existingIssue.number} already has "${labelName}" label`);
|
||||
}
|
||||
} else {
|
||||
console.log(`No existing issue found for "${scriptName}", creating new issue`);
|
||||
|
||||
const scriptType = 'CT (LXC Container)';
|
||||
|
||||
const formattedName = scriptName
|
||||
.split(/[-_]/)
|
||||
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
||||
.join(' ');
|
||||
|
||||
const issueBody = '# 🛠️ **New Script**\n' +
|
||||
'Created by Github Action Bot\n\n' +
|
||||
'### Name of the Script\n\n' +
|
||||
formattedName + '\n\n' +
|
||||
'### Script Type\n\n' +
|
||||
scriptType + '\n\n' +
|
||||
'### 📋 Script Details\n\n' +
|
||||
'This script has been merged and is ready for testing. ';
|
||||
|
||||
const { data: newIssue } = await github.rest.issues.create({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
title: scriptName,
|
||||
body: issueBody,
|
||||
labels: [labelName]
|
||||
});
|
||||
|
||||
console.log(`Created new issue #${newIssue.number}: ${newIssue.title}`);
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: newIssue.number,
|
||||
body: message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user