Skip to content

Update_Apps

Update_Apps #895

Workflow file for this run

name: Update_Apps
# Controls when the workflow will run
on:
# # run at 00:00 UTC every Wednesday
# schedule:
# - cron: "0 0 * * 3"
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
get-latest-app-versions:
# The type of runner that the job will run on
runs-on: ubuntu-latest
outputs:
UPDATED_APPS: ${{ steps.updated.outputs.UPDATED_APPS }}
FAILED_APPS: ${{ steps.failed.outputs.FAILED_APPS }}
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v3
# Runs a set of commands using the runners shell
- name: Run app update scripts
run: |
# print user info
echo $USER $USERNAME $(id) $(whoami)
#source pi-apps functions
#export all functions and variables
set -a
#make DIRECTORY equal to GITHUB_WORKSPACE, for subscripts and api functions
DIRECTORY=$GITHUB_WORKSPACE
source $GITHUB_WORKSPACE/api
#add special functions
get_release() {
curl -s --header "Authorization: token ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" "https://api.github.com/repos/$1/releases/latest" | jq -r '.tag_name' | sed s/^v//g
}
get_release_raw() {
curl -s --header "Authorization: token ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" "https://api.github.com/repos/$1/releases/latest" | jq -r '.tag_name'
}
get_prerelease() {
curl -s --header "Authorization: token ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" "https://api.github.com/repos/$1/releases" | jq -r 'map(select(.prerelease)) | first | .tag_name' | sed s/^v//g
}
get_prerelease_raw() {
curl -s --header "Authorization: token ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" "https://api.github.com/repos/$1/releases" | jq -r 'map(select(.prerelease)) | first | .tag_name'
}
function validate_url(){
if command wget --timeout=5 -q --spider "$1"; then
return 0
else
return 1
fi
}
#stop exporting functions
set +a
#make sure all update scripts are executable
chmod +x $GITHUB_WORKSPACE/.github/workflows/updates/*.sh
cd $GITHUB_WORKSPACE
apps=( .github/workflows/updates/*.sh )
for app_directory in "${apps[@]}"; do
echo
#make sure we are still in the main workspace (incase an update script left off elsewhere)
cd $GITHUB_WORKSPACE
export app_name="$(echo ${app_directory%.*} | sed 's:.*/::')"
echo "$app_name"
status "Checking $app_name for updates"
# move to app folder
cd "$GITHUB_WORKSPACE/apps/$app_name"
# run app update script
"$GITHUB_WORKSPACE/$app_directory"
done
cd
- name: Output updated apps
id: updated
run: |
if test -f /tmp/updated_apps; then
sort -u /tmp/updated_apps > /tmp/updated_apps_sorted
echo "UPDATED_APPS<<EOF" >> $GITHUB_OUTPUT
cat /tmp/updated_apps_sorted >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
fi
- name: Output failed apps
id: failed
run: |
if test -f /tmp/failed_apps; then
echo "FAILED_APPS<<EOF" >> $GITHUB_OUTPUT
cat /tmp/failed_apps | sed '0~1 a\\' >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
fi
- name: Tar GITHUB_WORKSPACE
run: |
cd ${{ runner.temp }}
tar -C $GITHUB_WORKSPACE -cvf GITHUB_WORKSPACE.tar .
- name: Upload GITHUB_WORKSPACE Artifact
uses: actions/upload-artifact@v3
with:
name: GITHUB_WORKSPACE
path: ${{ runner.temp }}/GITHUB_WORKSPACE.tar
test-updated-apps:
runs-on: ubuntu-latest
needs: get-latest-app-versions
strategy:
matrix:
include:
- os: buster
arch: armhf
image: https://downloads.raspberrypi.org/raspios_oldstable_armhf/images/raspios_oldstable_armhf-2023-05-03/2023-05-03-raspios-buster-armhf.img.xz
cache: yes
- os: buster
arch: arm64
image: https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2021-05-28/2021-05-07-raspios-buster-arm64.zip
cache: yes
- os: bullseye
arch: armhf
image: https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf.img.xz
cache: yes
- os: bullseye
arch: arm64
image: https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64.img.xz
cache: yes
- os: bookworm
arch: arm64
image: RPIOS_BOOKWORM_URL
cache: no
outputs:
FAILED_UPDATE_APPS_buster_armhf: ${{ steps.updated.outputs.FAILED_UPDATE_APPS_buster_armhf || '' }}
FAILED_UPDATE_APPS_buster_arm64: ${{ steps.updated.outputs.FAILED_UPDATE_APPS_buster_arm64 || '' }}
FAILED_UPDATE_APPS_bullseye_armhf: ${{ steps.updated.outputs.FAILED_UPDATE_APPS_bullseye_armhf || '' }}
FAILED_UPDATE_APPS_bullseye_arm64: ${{ steps.updated.outputs.FAILED_UPDATE_APPS_bullseye_arm64 || '' }}
FAILED_UPDATE_APPS_bookworm_arm64: ${{ steps.updated.outputs.FAILED_UPDATE_APPS_bookworm_arm64 || '' }}
UPDATED_APPS_buster_armhf: ${{ steps.updated.outputs.UPDATED_APPS_buster_armhf || '' }}
UPDATED_APPS_buster_arm64: ${{ steps.updated.outputs.UPDATED_APPS_buster_arm64 || '' }}
UPDATED_APPS_bullseye_armhf: ${{ steps.updated.outputs.UPDATED_APPS_bullseye_armhf || '' }}
UPDATED_APPS_bullseye_arm64: ${{ steps.updated.outputs.UPDATED_APPS_bullseye_arm64 || '' }}
UPDATED_APPS_bookworm_arm64: ${{ steps.updated.outputs.UPDATED_APPS_bookworm_arm64 || '' }}
steps:
# restore GITHUB_WORKSPACE
- uses: actions/download-artifact@v3
with:
name: GITHUB_WORKSPACE
path: ${{ runner.temp }}
- name: Extract GITHUB_WORKSPACE
run: |
cd ${{ runner.temp }}
tar xf GITHUB_WORKSPACE.tar -C $GITHUB_WORKSPACE
cd $GITHUB_WORKSPACE
- name: Replace secret reference with contents
if: ${{ matrix.image == 'RPIOS_BOOKWORM_URL' }}
run: |
image_url=${{ secrets[matrix.image] }}
echo "::add-mask::$image_url"
echo "image_url=$image_url" >> "$GITHUB_ENV"
- name: Replace non-secret reference with contents
if: ${{ matrix.image != 'RPIOS_BOOKWORM_URL' }}
run: |
image_url=${{ matrix.image }}
echo "image_url=$image_url" >> "$GITHUB_ENV"
- name: Write UPDATED_APPS and FAILED_APPS from OUTPUT of get-latest-app-versions to ENV
run: |
echo "UPDATED_APPS<<EOF" >> $GITHUB_ENV
echo "${{needs.get-latest-app-versions.outputs.UPDATED_APPS}}" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
echo "FAILED_APPS<<EOF" >> $GITHUB_ENV
echo "${{needs.get-latest-app-versions.outputs.FAILED_APPS}}" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Test installing updated apps on ${{ matrix.os }} - ${{ matrix.arch }}
uses: theofficialgman/arm-runner-action@v11
with:
base_image: ${{ env.image_url }}
# bind mount the directory so any changes propogate to outside the chroot
bind_mount_repository: yes
# give the image more space
image_additional_mb: 5000
# disable image caching to not leak the URL on some systems
enable_image_caching: ${{ matrix.cache }}
# set CPUs to use
cpu: cortex-a7:cortex-a72
# use custom /proc/cpuinfo
cpu_info: cpuinfo/raspberrypi_4b
# user runner name as default path
copy_repository_path: /home/runner/pi-apps
# export github env back to outside the chroot
export_github_env: yes
import_github_env: true
# set shell to bash
shell: /bin/bash
commands: |
sudo chown runner:docker /home/runner
# print user info
echo $USER $USERNAME $(id) $(whoami)
sudo bash -c 'echo $USER $USERNAME $(id) $(whoami)'
# create standard directories
mkdir -p $HOME/.local/share/applications $HOME/.local/bin
sudo mkdir -p /usr/local/bin /usr/local/share/applications
# install pi-apps dependencies
sudo apt update
sudo apt install -y yad curl wget aria2 lsb-release software-properties-common apt-utils imagemagick bc librsvg2-bin locales shellcheck git wmctrl xdotool x11-utils rsync
# runonce-entries is run in the build tester, runonce requires that all api functions be available to subprocess (like is done in the gui script)
#for the will_reinstall() and list_intersect() functions
set -a #make all functions in the api available to subprocesses
#make DIRECTORY equal to GITHUB_WORKSPACE, for subscripts and api functions
DIRECTORY=$(pwd)
source "${DIRECTORY}/api" || error "failed to source ${DIRECTORY}/api"
#Run runonce entries
"${DIRECTORY}/etc/runonce-entries"
set +a #stop exporting functions
cd ${DIRECTORY}
# upgrade cmake to 3.20+ from theofficialgman ppa to fix QEMU only issue https://gitlab.kitware.com/cmake/cmake/-/issues/20568
debian_ppa_installer "theofficialgman/cmake-bionic" "bionic" "0ACACB5D1E74E484" || exit 1
# store apps changed from last commit to working directory in varaible
mapfile -t changed_apps < <(git diff --name-only | grep ^apps/ | awk -F '/' '{print $2}' | sort -u)
# clean out any app status files
rm -rf ./data/status
# attempt to install updated apps using manage script loop
# if any app fails, add it to the FAILED_INSTALL_APPS or FAILED_UNINSTALL_APPS variable
for app in "${changed_apps[@]}"; do
# only attempt install/uninstall if updated app is supported on this architecture
scriptname="$(script_name_cpu "$app")" #will be install, install-32, install-64, or package
if [ -z "$scriptname" ];then
continue
fi
# skip checking DDNet (due to Rust) if on arm32 under QEMU: https://github.com/rust-lang/cargo/issues/8719
# skip checking Microsoft PowerShell due to QEMU instability with .NET: https://github.com/Botspot/pi-apps/pull/2252#issuecomment-1403043945
# skip WPS Office on 32bit as it requires "64bit" kernel to be detected. QEMU reports an armv7 kernel. WPS Office is still tested on arm64 (which will verify if the deb works and installs correctly)
skiplist=( "DDNet" "Microsoft PowerShell" "WPS Office" )
if [[ ! " ${skiplist[*]} " =~ " ${app} " ]]; then
./manage install "$app" || { FAILED_INSTALL_APPS+="$app"$'\n'; UPDATED_APPS=$(echo "$UPDATED_APPS" | sed "/$app/d"); }
./manage uninstall "$app" || { FAILED_UNINSTALL_APPS+="$app"$'\n'; UPDATED_APPS=$(echo "$UPDATED_APPS" | sed "/$app/d"); }
fi
done
if [ ! -z "$FAILED_INSTALL_APPS" ] || [ ! -z "$FAILED_UNINSTALL_APPS" ]; then
echo "FAILED_UPDATE_APPS<<EOF" >> $GITHUB_ENV
echo "$FAILED_INSTALL_APPS$FAILED_UNINSTALL_APPS" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
echo "UPDATED_APPS<<EOF" >> $GITHUB_ENV
echo "$UPDATED_APPS" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
fi
- name: Write FAILED_APPS to OUTPUT
id: failed
run: |
echo "FAILED_UPDATE_APPS_${{ matrix.os }}_${{ matrix.arch }}<<EOF" >> $GITHUB_OUTPUT
echo "${{env.FAILED_UPDATE_APPS}}" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Write UPDATED_APPS to OUTPUT
id: updated
run: |
echo "UPDATED_APPS_${{ matrix.os }}_${{ matrix.arch }}<<EOF" >> $GITHUB_OUTPUT
echo "${{env.UPDATED_APPS}}" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
create-pr:
needs: test-updated-apps
runs-on: ubuntu-latest
steps:
# restore GITHUB_WORKSPACE
- uses: actions/download-artifact@v3
with:
name: GITHUB_WORKSPACE
path: GITHUB_WORKSPACE.tar
- name: Extract GITHUB_WORKSPACE
run: |
tar xf GITHUB_WORKSPACE.tar -C $GITHUB_WORKSPACE
- name: Revert failed apps
run: |
ALL_FAILED_APPS="${{needs.get-latest-app-versions.outputs.FAILED_APPS}}"$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_buster_armhf}}""$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_buster_arm64}}""$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bullseye_armhf}}""$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bullseye_arm64}}""$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bookworm_arm64}}"
ALL_FAILED_APPS="$(echo "$ALL_FAILED_APPS" | sort -u | awk NF)"
IFS=$'\n'
for app in $ALL_FAILED_APPS; do
git checkout -- "apps/$app"
# echo '> ![badge-error][badge-error]'" Failed to install $app, reverting to previous version."
done
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
commit-message: |
Update App Versions, run by GitHub Actions - Apps updated:
${{ env.UPDATED_APPS }}
branch: "auto-app-updates-NOT-FOR-USERS"
title: "[AUTO] Update App Versions"
body: |
[badge-error]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/error.svg?raw=true 'Error'
[badge-warning]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/warning.svg?raw=true 'Warning'
[badge-issue]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/issue.svg?raw=true 'Issue'
[badge-check]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/check.svg?raw=true 'Check'
[badge-info]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/info.svg?raw=true 'Info'
Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action.
Workflow run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
Apps updated:
```
${{ env.UPDATED_APPS }}
```
${{ env.FAILED_APPS }}
${{ env.FAILED_UPDATE_APPS_ARM32 }}
${{ env.FAILED_UPDATE_APPS_ARM64 }}