From 5b57ca657e02abb8088aa2353df6fe825e781379 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Thu, 23 Jan 2025 14:55:36 +0100 Subject: [PATCH] replace drone PR appimage setup with GitHub Actions Signed-off-by: Jyrki Gadinger --- .drone.yml | 22 ---- .github/workflows/linux-appimage.yml | 56 +++++++++- admin/linux/build-appimage.sh | 17 ++- admin/linux/upload-appimage.sh | 154 --------------------------- 4 files changed, 67 insertions(+), 182 deletions(-) delete mode 100755 admin/linux/upload-appimage.sh diff --git a/.drone.yml b/.drone.yml index d538bdc02845e..91f14af595e23 100644 --- a/.drone.yml +++ b/.drone.yml @@ -148,28 +148,6 @@ trigger: --- kind: pipeline -name: AppImage - -steps: -- name: build - image: ghcr.io/nextcloud/continuous-integration-client-appimage-qt6:client-appimage-6.7.3-1 - environment: - CI_UPLOAD_GIT_TOKEN: - from_secret: CI_UPLOAD_GIT_TOKEN - CI_UPLOAD_GIT_USERNAME: - from_secret: CI_UPLOAD_GIT_USERNAME - commands: - - BUILDNR=$DRONE_BUILD_NUMBER VERSION_SUFFIX=$DRONE_PULL_REQUEST BUILD_UPDATER=ON DESKTOP_CLIENT_ROOT=$DRONE_WORKSPACE EXECUTABLE_NAME=nextcloud QT_BASE_DIR=/opt/qt6.7.3 OPENSSL_ROOT_DIR=/usr/local/lib64 /bin/bash -c "./admin/linux/build-appimage.sh" - - BUILDNR=$DRONE_BUILD_NUMBER VERSION_SUFFIX=$DRONE_PULL_REQUEST DESKTOP_CLIENT_ROOT=$DRONE_WORKSPACE /bin/bash -c "./admin/linux/upload-appimage.sh" || echo "Upload failed, however this is an optional step." -trigger: - branch: - - master - - stable-* - event: - - pull_request - - push ---- -kind: pipeline name: Debian steps: diff --git a/.github/workflows/linux-appimage.yml b/.github/workflows/linux-appimage.yml index 5bcb172c425ee..08f3aed44a723 100644 --- a/.github/workflows/linux-appimage.yml +++ b/.github/workflows/linux-appimage.yml @@ -11,7 +11,61 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 1 + - name: Configure, compile and package + id: build-appimage + env: + PR_ID: ${{ github.event.number }} run: | BUILDNR=${GITHUB_RUN_ID} VERSION_SUFFIX=${GITHUB_HEAD_REF} BUILD_UPDATER=ON DESKTOP_CLIENT_ROOT=`pwd` EXECUTABLE_NAME=nextcloud QT_BASE_DIR=/opt/qt OPENSSL_ROOT_DIR=/usr/local/lib64 /bin/bash -c "./admin/linux/build-appimage.sh" - BUILDNR=${GITHUB_RUN_ID} VERSION_SUFFIX=${GITHUB_HEAD_REF} DESKTOP_CLIENT_ROOT=`pwd` /bin/bash -c "./admin/linux/upload-appimage.sh" || echo "Upload failed, however this is an optional step." + + - name: Upload AppImage artifact + id: upload-appimage + uses: actions/upload-artifact@v4 + with: + name: appimage-pr-${{ github.event.number }} + path: ${{ steps.build-appimage.outputs.APPIMAGE_NAME }} + overwrite: true + + - name: Comment AppImage + uses: actions/github-script@v7 + with: + script: | + const comment_identifier_string = ""; + + const comment_body = ` + ${comment_identifier_string} + + AppImage file: [${{ steps.build-appimage.outputs.APPIMAGE_NAME }}](${{ steps.upload-appimage.outputs.artifact-url }}) + + To test this change/fix you can simply download above AppImage file and test it. + + Please make sure to quit your existing Nextcloud app and backup your data. + `; + + console.log("fetching old comments") + const comments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + comments + .data + .filter(comment => comment.body?.includes(comment_identifier_string)) + .forEach(comment => { + console.log(`deleting previous AppImage comment with ID ${comment.id}`) + github.rest.issues.deleteComment( + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: comment.id, + ) + }); + + console.log("creating new comment") + github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: comment_body, + }); diff --git a/admin/linux/build-appimage.sh b/admin/linux/build-appimage.sh index 3619e3d829b36..61b1b6f67e3e0 100755 --- a/admin/linux/build-appimage.sh +++ b/admin/linux/build-appimage.sh @@ -12,7 +12,7 @@ export OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR:-/usr/lib/x86_64-linux-gnu} export VERSION_SUFFIX=${VERSION_SUFFIX:stable} # Set defaults -export SUFFIX=${DRONE_PULL_REQUEST:=master} +export SUFFIX=${PR_ID:=${DRONE_PULL_REQUEST:=master}} if [ $SUFFIX != "master" ]; then SUFFIX="PR-$SUFFIX" fi @@ -111,10 +111,17 @@ rm ./squashfs-root/usr/lib/libglib-2.0.so.0 LD_LIBRARY_PATH="$PWD/appimagetool-squashfs-root/usr/lib":$LD_LIBRARY_PATH PATH="$PWD/appimagetool-squashfs-root/usr/bin":$PATH appimagetool -n ./squashfs-root "${APPIMAGE}" #move AppImage -if [ ! -z "$DRONE_COMMIT" ] +export COMMIT=${GITHUB_SHA:=${DRONE_COMMIT}} +if [ ! -z "$COMMIT" ] then - mv *.AppImage ${EXECUTABLE_NAME}-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage + export APPIMAGE_NAME="${EXECUTABLE_NAME}-${SUFFIX}-${COMMIT}-x86_64.AppImage" else - mv *.AppImage ${EXECUTABLE_NAME}-${SUFFIX}-x86_64.AppImage + export APPIMAGE_NAME="${EXECUTABLE_NAME}-${SUFFIX}-x86_64.AppImage" +fi +mv *.AppImage ${DESKTOP_CLIENT_ROOT}/$APPIMAGE_NAME + +# tell GitHub Actions the name of our appimage +if [ ! -z "$GITHUB_OUTPUT" ]; then + echo "AppImage name: ${APPIMAGE_NAME}" + echo "APPIMAGE_NAME=${APPIMAGE_NAME}" >> "$GITHUB_OUTPUT" fi -mv *.AppImage ${DESKTOP_CLIENT_ROOT}/ diff --git a/admin/linux/upload-appimage.sh b/admin/linux/upload-appimage.sh deleted file mode 100755 index 87f2a6c6ab295..0000000000000 --- a/admin/linux/upload-appimage.sh +++ /dev/null @@ -1,154 +0,0 @@ -#! /bin/bash - -# Env -export BUILD=${DRONE_BUILD_NUMBER} -export PR=${DRONE_PULL_REQUEST} -export GIT_USERNAME=${CI_UPLOAD_GIT_USERNAME} -export GIT_TOKEN=${CI_UPLOAD_GIT_TOKEN} - -# Needed to get it working on drone -export SUFFIX=${DRONE_PULL_REQUEST:=master} -if [ $SUFFIX != "master" ]; then - SUFFIX="PR-$SUFFIX" -fi -export DESKTOP_CLIENT_ROOT=${DESKTOP_CLIENT_ROOT:-/home/user} -export APPNAME=${APPNAME:-nextcloud} - -# Defaults -export GIT_REPO=ci-builds -export API_BASE_URL=https://api.github.com/repos/$GIT_USERNAME/$GIT_REPO -export DESKTOP_API_BASE_URL=https://api.github.com/repos/nextcloud/desktop - -# PR / master -export TAG_NAME=${PR:=master} -export RELEASE_BODY=https://github.com/nextcloud/desktop - -if [ $TAG_NAME != "master" ]; then - TAG_NAME="PR-$TAG_NAME" - RELEASE_BODY="nextcloud/desktop#$PR" -fi - -cd ${DESKTOP_CLIENT_ROOT} -echo `pwd` -ls - -# AppImage -if [ ! -z "$DRONE_COMMIT" ] -then - export APPIMAGE=$(readlink -f ./${APPNAME}-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage) -else - export APPIMAGE=$(readlink -f ./Nextcloud*.AppImage) -fi - -export UPDATE=$(readlink -f ./Nextcloud*.AppImage.zsync) -export BASENAME=$(basename ${APPIMAGE}) - -if ! test -e $APPIMAGE ; then - exit 1 -fi - -echo "Found AppImage: $BASENAME" - -if [ $TAG_NAME != "master" ]; then - # Delete all old comments in desktop PR, starting with "AppImage file:" - oldComments=$(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $DESKTOP_API_BASE_URL/issues/$PR/comments | jq '.[] | (.id |tostring) + "|" + (.user.login | test("'${GIT_USERNAME}'") | tostring) + "|" + (.body | test("AppImage file:.*") | tostring)' | grep "true|true" | tr -d "\"" | cut -f1 -d"|") - - if [[ "$oldComments" != "" ]]; then - echo $oldComments | while read comment ; do - curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X DELETE $DESKTOP_API_BASE_URL/issues/comments/$comment - done - fi -fi - -# Helper functions -urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; } - -create_release() -{ - name=$TAG_NAME - body=$RELEASE_BODY - tagName=$TAG_NAME - echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X POST $API_BASE_URL/releases -d "{ \"tag_name\": \"$tagName\", \"target_commitish\": \"master\", \"name\": \"$name\", \"body\": \"$body\", \"draft\": false, \"prerelease\": true }") -} - -get_release() -{ - tagName=$TAG_NAME - echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $API_BASE_URL/releases/tags/$tagName) -} - -get_release_assets() -{ - releaseId=$1 - echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $API_BASE_URL/releases/$releaseId/assets) -} - -upload_release_asset() -{ - uploadUrl=$1 - echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $APPIMAGE) - echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $UPDATE) -} - -delete_release_asset() -{ - assetId=$1 - curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X DELETE $API_BASE_URL/releases/assets/$assetId -} - -# Try to get an already existing release -json=$(get_release) - -releaseId=$(echo $json | jq -r '.id') -uploadUrl=$(echo $json | jq -r '.upload_url') - -if [[ "$uploadUrl" == "null" ]]; then - # Try to create a release - json=$(create_release) - echo $json - - releaseId=$(echo $json | jq -r '.id') - uploadUrl=$(echo $json | jq -r '.upload_url') - - if [[ "$uploadUrl" == "null" ]]; then - echo "create_release failed: $json" - exit 2 - fi -fi - -# Prepare upload url -uploadUrl=$(echo "${uploadUrl/'{?name,label}'/?name=$BASENAME}") - -# Try to delete existing AppImage assets for this PR -assets=$(get_release_assets $releaseId) - -for data in $(echo $assets | jq -r '.[] | @uri'); do - json=$(urldecode "$data") - - assetId=$(echo $json | jq -r '.id') - name=$(echo $json | jq -r '.name') - - if [[ "$name" == *.AppImage ]]; then - echo "Deleting old asset: $name" - $(delete_release_asset $assetId) - fi -done - -# Upload release asset -echo "Uploading new asset: $BASENAME" - -json=$(upload_release_asset "$uploadUrl") -browserDownloadUrl=$(echo $json | jq -r '.browser_download_url') - -if [[ "$browserDownloadUrl" == "null" ]]; then - echo "upload_release_asset failed: $json" - exit 3 -fi - -if [ $TAG_NAME != "master" ]; then - # Create comment in desktop PR - curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X POST $DESKTOP_API_BASE_URL/issues/$PR/comments -d "{ \"body\" : \"AppImage file: [$BASENAME]($browserDownloadUrl)

To test this change/fix you can simply download above AppImage file and test it.

Please make sure to quit your existing Nextcloud app and backup your data. \" }" -fi - -echo -echo "AppImage link: $browserDownloadUrl"