Merge pull request #1329 from oSoWoSo/main #147
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: "Test random 💯" | |
env: | |
TERM: xterm | |
on: | |
push: | |
branches: main | |
paths: | |
- 'programs/x86_64/**' | |
- .github/workflows/test-apps.yml | |
#pull_request: | |
# branches: main | |
# paths: 'programs/x86_64/**' | |
workflow_dispatch: | |
inputs: | |
reset_stats: | |
description: "RESET stats" | |
required: true | |
default: "false" | |
type: boolean | |
schedule: | |
- cron: '0 23 * * *' | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: false | |
permissions: | |
actions: write | |
contents: write | |
jobs: | |
update-testing-branch: | |
name: "prepare 💤" | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: "Check out repository" | |
uses: actions/checkout@v4 | |
- name: "Prevent merging on PR" | |
run: | | |
if [[ $GITHUB_REF == refs/pull/* ]]; then | |
echo "This is a Pull Request. No merging." | |
exit 0 | |
fi | |
- name: "Git Config" | |
run: | | |
git config user.name "github-actions[bot]" | |
git config user.email "noreply@github.com" | |
- name: "Update testing branch" | |
run: | | |
git fetch origin main | |
git fetch origin testing || echo "Branch 'testing' does not exist." | |
if ! git ls-remote --exit-code --heads origin testing; then | |
echo "Creating remote 'testing' branch from 'main'..." | |
git push origin main:testing | |
else | |
if [[ "${{ github.event.inputs.reset_stats }}" != "true" ]]; then | |
echo "Resetting remote 'testing' branch to 'main', preserving test files..." | |
git fetch origin testing | |
git checkout origin/testing | |
mkdir -p backup | |
cp -r tested.list failed.list logs backup/ 2>/dev/null || true | |
git reset --hard origin/main | |
mv backup/tested.list backup/failed.list backup/logs . 2>/dev/null || true | |
rm -rf backup | |
git add . | |
git commit -m "update results" | |
else | |
echo "Resetting remote 'testing' branch to 'main', Resetting stats" | |
echo "Resetting stats" >> $GITHUB_STEP_SUMMARY | |
git fetch origin testing | |
git checkout origin/testing | |
git reset --hard origin/main | |
fi | |
git push --force origin HEAD:testing | |
fi | |
show-stats: | |
name: "stats 📝" | |
runs-on: ubuntu-22.04 | |
needs: update-testing-branch | |
steps: | |
- name: "Check out main branch (for programs count) 🏃" | |
uses: actions/checkout@v4 | |
with: | |
ref: main # Work on main branch | |
- name: "Count programs 📊" | |
run: | | |
x64Count=$(find programs/x86_64/ -type f | wc -l) | |
i68Count=$(find programs/i686/ -type f | wc -l) | |
a64Count=$(find programs/aarch64/ -type f | wc -l) | |
echo "x64Count=$x64Count" >> $GITHUB_ENV | |
echo "i68Count=$i68Count" >> $GITHUB_ENV | |
echo "a64Count=$a64Count" >> $GITHUB_ENV | |
- name: "Check out testing branch (for tested & failed) 🏃" | |
uses: actions/checkout@v4 | |
with: | |
ref: testing # Work on testing branch | |
- name: "Count tested & failed 📊" | |
run: | | |
tested=$(wc -l < tested.list 2>/dev/null || echo 0) | |
failed=$(wc -l < failed.list 2>/dev/null || echo 0) | |
echo "x86_64: $x64Count" | |
echo "i686: $i68Count" | |
echo "aarch64: $a64Count" | |
echo "🏁 Tested: $tested" | |
echo "❌ Failed: $failed" | |
echo "### 🎬 apps" >> $GITHUB_STEP_SUMMARY | |
echo "$x64Count x86_64" >> $GITHUB_STEP_SUMMARY | |
echo "$i68Count i686" >> $GITHUB_STEP_SUMMARY | |
echo "$a64Count aarch64" >> $GITHUB_STEP_SUMMARY | |
echo "### 🔨 tests" >> $GITHUB_STEP_SUMMARY | |
echo " 🏁 $tested" >> $GITHUB_STEP_SUMMARY | |
echo " ❌ $failed" >> $GITHUB_STEP_SUMMARY | |
generate-matrix: | |
name: "matrix 🌀" | |
needs: update-testing-branch | |
runs-on: ubuntu-22.04 | |
outputs: | |
skip: ${{ steps.set-matrix.outputs.skip }} | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
count: ${{ steps.am-install.outputs.count }} | |
steps: | |
- name: "Check out repository 🏃" | |
uses: actions/checkout@v4 | |
with: | |
ref: testing | |
- name: "Generate Matrix 🏆" | |
id: set-matrix | |
run: | | |
mkdir -p results | |
find programs/x86_64/ -maxdepth 1 -type f -printf "%f\n" | sort > all.list | |
if [[ -f tested.list ]]; then | |
if diff -q all.list tested.list; then | |
echo "Everything tested" >> $GITHUB_STEP_SUMMARY | |
echo "skip=true" >> $GITHUB_OUTPUT | |
exit 0 | |
else | |
comm -23 all.list tested.list > totest_tmp.list | |
fi | |
else | |
echo "First run!" >> $GITHUB_STEP_SUMMARY | |
cp all.list totest_tmp.list | |
fi | |
if [[ -f failed.list ]]; then | |
comm -23 totest_tmp.list failed.list > totest.list | |
echo "### Excluding failed:" >> $GITHUB_STEP_SUMMARY | |
cat failed.list >> $GITHUB_STEP_SUMMARY | |
if [ ! -s totest.list ]; then | |
echo " 🏁 Nothing to test 🏁" >> $GITHUB_STEP_SUMMARY | |
echo "skip=true" >> $GITHUB_OUTPUT | |
exit 0 | |
fi | |
else | |
mv totest_tmp.list totest.list | |
fi | |
FILES=$(shuf -n 100 totest.list | sort || cat totest.list | sort) | |
MATRIX="{\"include\": [" | |
for file in $FILES; do | |
MATRIX+="{\"file\": \"$file\"}," | |
done | |
MATRIX="${MATRIX%,}]}" | |
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT | |
run-actions: | |
name: "🔨" | |
needs: generate-matrix | |
runs-on: ubuntu-22.04 | |
if: ${{ needs.generate-matrix.outputs.skip != 'true' }} | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} | |
env: | |
TIMEOUT: 23 | |
steps: | |
- name: "Check out repository 🏃" | |
uses: actions/checkout@v4 | |
with: | |
ref: testing | |
- name: "Install dependencies 📦️" | |
run: | | |
sudo apt-get -y update 2> /dev/null || apt-get -y update | |
sudo apt-get -y install wget curl torsocks zsync 2> /dev/null || apt-get -y install git wget curl torsocks zsync | |
- name: "Install AM 🎁" | |
run: | | |
mkdir -p results /usr/local/bin | |
chmod +x ./INSTALL | |
sudo ./INSTALL 2> /dev/null || ./INSTALL | |
- name: "test ${{ matrix.file }} 🚧" | |
run: | | |
set -uo pipefail | |
mkdir -p results | |
script_content=$(curl -Ls https://raw.githubusercontent.com/ivan-hc/AM/main/programs/x86_64/"${{ matrix.file }}") | |
pure_arg=$(echo "${{ matrix.file }}" | sed 's/\.appimage//g; s/\^debian-testing-//g; s/\-appimage$//g' | sed 's:.*/::') | |
if timeout "$TIMEOUT"m am -i "${{ matrix.file }}" --debug 2>&1 | tee -a results/log-"${{ matrix.file }}"; then | |
echo "" | |
echo " Structure of the directory in /opt" | |
echo "" | |
if test -d /opt/kdegames; then | |
ls /opt/kdegames | tee -a results/log-"${{ matrix.file }}" | |
elif test -d /opt/kdeutils; then | |
ls /opt/kdeutils | tee -a results/log-"${{ matrix.file }}" | |
elif test -d /opt/platform-tools; then | |
ls /opt/platform-tools | tee -a results/log-"${{ matrix.file }}" | |
elif test -d /opt/"$pure_arg"; then | |
ls /opt/"$pure_arg" | tee -a results/log-"${{ matrix.file }}" | |
elif [ "$pure_arg" = avidemux ]; then | |
echo /opt/avidemux | tee -a results/log-"${{ matrix.file }}" | |
elif [[ "$pure_arg" =~ (bat-extras|code|deadbeef*|libfuse2|libreoffice|microsoft-edge*|mpv|node|npm|swift|wine) ]]; then | |
echo "App not installed, this is a Known error related to GitHub Actions" | tee -a results/log-"${{ matrix.file }}" | |
elif test -d /opt/"$pure_arg"*; then | |
ls /opt/"$pure_arg"* | tee -a results/log-"${{ matrix.file }}" | |
elif echo "$script_content" | grep -q "spooky"; then | |
echo "App not installed because marked as \"spooky\", require to be tested manually" | tee -a results/log-"${{ matrix.file }}" | |
else | |
ls /opt/"${{ matrix.file }}" | tee -a results/log-"${{ matrix.file }}" | |
fi | |
echo "" | |
echo "-------------------------------------------------------------" | |
echo "" | |
echo " Command in \$PATH" | |
echo "" | |
command -v "$pure_arg" | tee -a results/log-"${{ matrix.file }}" || ls /usr/local/bin | tee -a results/log-"${{ matrix.file }}" | |
echo "" | |
echo "-------------------------------------------------------------" | |
echo "" | |
echo " Launchers in /usr/local/share/applications" | tee -a results/log-"${{ matrix.file }}" | |
echo "" | |
if test -f /usr/local/share/applications/*AM.desktop 2>/dev/null; then | |
ls /usr/local/share/applications | grep "AM.desktop$" | tee -a results/log-"${{ matrix.file }}" | |
else | |
ls /usr/local/share/applications | tee -a results/log-"${{ matrix.file }}" | |
fi | |
echo "" | |
echo "-------------------------------------------------------------" | |
am -R "${{ matrix.file }}" && echo "${{ matrix.file }}" >> results/ok-${{ matrix.file }} || echo "${{ matrix.file }}" >> results/log-${{ matrix.file }} | |
else | |
if [[ $? -eq 124 ]]; then | |
echo "### 💥 ${{ matrix.file }} timeout!" >> $GITHUB_STEP_SUMMARY | |
echo "Installation timeout in 23 minutes" >> results/log-"${{ matrix.file }}" | |
echo "${{ matrix.file }}" >> results/log-${{ matrix.file }} | |
else | |
echo "### 💀 ${{ matrix.file }}" >> $GITHUB_STEP_SUMMARY | |
echo "${{ matrix.file }}" >> results/log-${{ matrix.file }} | |
fi | |
exit 1 | |
fi | |
- name: "Rename Failed Results ☝️" | |
if: failure() | |
run: | | |
mv results/log-${{ matrix.file }} results/ko-${{ matrix.file }} | |
- name: "Upload KO Results ☝️" | |
if: failure() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ko-${{ matrix.file }} | |
path: results/ko-${{ matrix.file }} | |
- name: "Upload OK Results ⬆️" | |
if: success() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ok-${{ matrix.file }} | |
path: results/ok-${{ matrix.file }} | |
update-tested-list: | |
name: "results 📰" | |
needs: run-actions | |
runs-on: ubuntu-22.04 | |
if: always() | |
steps: | |
- name: "Check out repository 🏃" | |
uses: actions/checkout@v4 | |
with: | |
ref: testing | |
- name: "Download Test Results ⬇️" | |
if: success() | |
uses: actions/download-artifact@v4 | |
with: | |
path: results | |
merge-multiple: true | |
- run: ls -R results || echo "Nothing tested" | |
- name: "Git Config" | |
if: always() | |
run: | | |
git config user.name "github-actions[bot]" | |
git config user.email "noreply@github.com" | |
- name: "Aggregate and push results" | |
if: always() | |
run: | | |
ls -R results || echo "Nothing tested" | |
#git checkout -b testing | |
#git push --set-upstream origin testing | |
if compgen -G "results/ok-*" > /dev/null; then | |
for file in results/ok-*; do | |
cat "$file" >> aggregated.list | |
done | |
cat aggregated.list >> tested.list | |
sort -u tested.list -o tested.list | |
git add tested.list | |
else | |
echo "Nothing tested successfully?" | |
fi | |
if compgen -G "results/ko-*" > /dev/null; then | |
for file in results/ko-*; do | |
echo "$file" | cut -d'-' -f2- >> fail.list | |
done | |
mkdir -p logs | |
cp results/ko-* logs/ | |
fail=$(wc -l < fail.list) | |
cat fail.list >> failed.list | |
sort -u failed.list -o failed.list | |
git add failed.list logs | |
else | |
echo "Nothing failed? Great!" | |
fi | |
LAST_COMMIT_MSG=$(git log -1 --pretty=%B) | |
if git diff --cached --quiet; then | |
echo "No changes to commit?" | |
else | |
if [[ $GITHUB_REF == refs/pull/* ]]; then | |
echo "This is Pull Request. No saving results." | |
elif [[ "${{ github.event.inputs.reset_stats }}" == "true" ]]; then | |
echo "stats resetted" | |
git commit -m "update results" | |
git push origin testing | |
elif [[ "$LAST_COMMIT_MSG" == "update results" ]]; then | |
echo "Last commit is 'update results'." | |
git commit --amend -m "update results" | |
git push --force origin testing | |
else | |
git commit -m "update results" | |
git push --force origin testing | |
fi | |
fi | |
- name: "Show Results 🏁" | |
if: always() | |
run: | | |
tested=$(wc -l < tested.list 2>/dev/null || echo 0) | |
failed=$(wc -l < failed.list 2>/dev/null || echo 0) | |
fail=$(wc -l < fail.list 2>/dev/null || echo "0") | |
count=$(find programs/x86_64/ -type f | wc -l) | |
remaining=$((count - tested - failed - fail)) | |
if (( remaining < 0 )); then | |
remaining=0 | |
fi | |
echo "### 🏁 $tested tested" >> $GITHUB_STEP_SUMMARY | |
echo "## 🛅 $remaining to test" >> $GITHUB_STEP_SUMMARY | |
echo "😱 $failed fails listed" >> $GITHUB_STEP_SUMMARY | |
echo ":x: $fail failed now" >> $GITHUB_STEP_SUMMARY | |
if [[ -f fail.list ]]; then | |
echo "💀" >> $GITHUB_STEP_SUMMARY | |
cat fail.list >> $GITHUB_STEP_SUMMARY | |
fi | |
delete-all-artifacts: | |
name: "cleanup 🧹" | |
runs-on: ubuntu-22.04 | |
needs: update-tested-list | |
if: always() | |
steps: | |
- name: "Check out repository 🏃" | |
uses: actions/checkout@v4 | |
- name: "Delete Artifacts 🙈" | |
env: | |
REPO_NAME: ${{ github.repository }} | |
RUN_ID: ${{ github.run_id }} | |
TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
echo "Fetching and deleting all artifacts for run ID: $RUN_ID" | |
PAGE=1 | |
DELETED=0 | |
while true; do | |
RESPONSE=$(curl -s -H "Authorization: token $TOKEN" \ | |
"https://api.github.com/repos/$REPO_NAME/actions/runs/$RUN_ID/artifacts?per_page=100&page=$PAGE") | |
ARTIFACT_IDS=$(echo "$RESPONSE" | jq -r '.artifacts[].id') | |
if [[ -z "$ARTIFACT_IDS" ]]; then | |
echo "No more artifacts to delete. Total deleted: $DELETED" | |
break | |
fi | |
for ARTIFACT_ID in $ARTIFACT_IDS; do | |
echo "Deleting artifact with ID: $ARTIFACT_ID" | |
curl -X DELETE -s -H "Authorization: token $TOKEN" \ | |
"https://api.github.com/repos/$REPO_NAME/actions/artifacts/$ARTIFACT_ID" | |
((DELETED+=1)) | |
done | |
((PAGE+=1)) | |
done | |
echo "Successfully deleted $DELETED artifacts." | |
already-tested: | |
name: "all 🏁" | |
runs-on: ubuntu-22.04 | |
needs: generate-matrix | |
if: ${{ needs.generate-matrix.outputs.skip == 'true' }} | |
steps: | |
- name: "Mark as Successful" | |
run: echo "All apps already tested..." >> $GITHUB_STEP_SUMMARY |