From c0ecf4dd56d48c8cdce4cb9b2406232fcb141041 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Thu, 13 Aug 2026 07:57:47 +0200 Subject: [PATCH] chore(ci): drop the eight legacy workflows that authenticate with the dead DEPLOY_KEY MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SSH DEPLOY_KEY is revoked — 'git@github.com: Permission denied (publickey)' on the Checkout Code step, 2026-08-08. It is a distinct dead credential from PROJECT_TOKEN and needs its own rotation. Deleted rather than rotated, because this generation is already superseded: beta and development both carry only the current .yml set and none of these files. main is the only branch still holding them, since a promotion adds files without removing what it replaced. Nothing here has succeeded since March 2026; release-beta.yaml has never run at all. Note: main is left with no release workflow until the next beta -> main promotion brings release-stable.yml. It currently has one that fails on checkout, so nothing working is lost, but the gap is real. --- .github/workflows/beta-release.yaml | 189 ------------------- .github/workflows/release-beta.yaml | 173 ------------------ .github/workflows/release-stable.yaml | 181 ------------------- .github/workflows/release-unstable.yaml | 175 ------------------ .github/workflows/release-workflow.yaml | 230 ------------------------ .github/workflows/sync-beta.yaml | 62 ------- .github/workflows/sync-dev.yaml | 61 ------- .github/workflows/unstable-release.yaml | 145 --------------- 8 files changed, 1216 deletions(-) delete mode 100644 .github/workflows/beta-release.yaml delete mode 100644 .github/workflows/release-beta.yaml delete mode 100644 .github/workflows/release-stable.yaml delete mode 100644 .github/workflows/release-unstable.yaml delete mode 100644 .github/workflows/release-workflow.yaml delete mode 100644 .github/workflows/sync-beta.yaml delete mode 100644 .github/workflows/sync-dev.yaml delete mode 100644 .github/workflows/unstable-release.yaml diff --git a/.github/workflows/beta-release.yaml b/.github/workflows/beta-release.yaml deleted file mode 100644 index 79ccd04e..00000000 --- a/.github/workflows/beta-release.yaml +++ /dev/null @@ -1,189 +0,0 @@ -name: Beta Release - -on: - push: - branches: - - beta - -jobs: - release-management: - runs-on: ubuntu-latest - # Observed max 0.7 min across 26 fleet runs; 45 matches the shared release - # jobs — a spurious release failure is expensive, so keep this loose. - timeout-minutes: 45 - steps: - - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Set app env - run: | - echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Get current version and append beta suffix - id: increment_version - run: | - # Get version from main branch - git fetch origin main - main_version=$(git show origin/main:appinfo/info.xml | grep -oP '(?<=)[^<]+' || echo "") - - # Get current version from current branch - current_version=$(grep -oP '(?<=)[^<]+' appinfo/info.xml || echo "") - - # Split main version into parts - IFS='.' read -ra main_version_parts <<< "$main_version" - - # Increment patch version by 1 from main - next_patch=$((main_version_parts[2] + 1)) - - # Extract beta counter from current version if it exists - beta_counter=1 - if [[ $current_version =~ -beta\.([0-9]+)$ ]]; then - # If current patch version is still ahead of main, increment counter - current_patch=$(echo $current_version | grep -oP '^[0-9]+\.[0-9]+\.(\d+)' | cut -d. -f3) - if [ "$current_patch" -eq "$next_patch" ]; then - beta_counter=$((BASH_REMATCH[1] + 1)) - fi - fi - - beta_version="${main_version_parts[0]}.${main_version_parts[1]}.${next_patch}-beta.${beta_counter}" - - echo "NEW_VERSION=$beta_version" >> $GITHUB_ENV - echo "new_version=$beta_version" >> $GITHUB_OUTPUT - echo "Main version: $main_version" - echo "Current version: $current_version" - echo "Using beta version: $beta_version" - - - name: Update version in info.xml - run: | - sed -i "s|.*|${{ env.NEW_VERSION }}|" appinfo/info.xml - - - name: Commit version update - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git commit -am "Bump beta version to ${{ env.NEW_VERSION }} [skip ci]" - git push - - - name: Prepare Signing Certificate and Key - run: | - echo "${{ secrets.NEXTCLOUD_SIGNING_CERT }}" > signing-cert.crt - echo "${{ secrets.NEXTCLOUD_SIGNING_KEY }}" > signing-key.key - - - name: Install npm dependencies - uses: actions/setup-node@v3 - with: - node-version: '18.x' - - - name: Set up PHP and install extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - extensions: zip, gd - - - run: npm ci - - run: npm run build - - run: composer install --no-dev - - - name: Copy the package files into the package - run: | - mkdir -p package/${{ github.event.repository.name }} - rsync -av --progress \ - --exclude='package' \ - --exclude='.git' \ - --exclude='.github' \ - --exclude='.vscode' \ - --exclude='docker' \ - --exclude='docs' \ - --exclude='website' \ - --exclude='node_modules' \ - --exclude='/src' \ - --exclude='test' \ - --exclude='package-lock.json' \ - --exclude='composer.lock' \ - --exclude='composer-setup.php' \ - --exclude='.phpunit.result.cache' \ - --exclude='phpmd.xml' \ - --exclude='signing-key.key' \ - --exclude='package.json' \ - --exclude='composer.json' \ - --exclude='coverage.txt' \ - --exclude='signing-cert.crt' \ - --exclude='docker-compose.yml' \ - --exclude='webpack.config.js' \ - --exclude='.prettierrc' \ - --exclude='psalm.xml' \ - --exclude='phpunit.xml' \ - --exclude='tsconfig.json' \ - --exclude='changelog-ci-config.json' \ - --exclude='jest.config.js' \ - --exclude='.gitattributes' \ - --exclude='.php-cs-fixer.dist.php' \ - --exclude='.gitignore' \ - --exclude='.eslintrc.js' \ - --exclude='stylelint.config.js' \ - --exclude='.babelrc' \ - --exclude='.nvmrc' \ - ./ package/${{ github.event.repository.name }}/ - - - name: Create Tarball - run: | - cd package && tar -czf ../nextcloud-release.tar.gz ${{ github.event.repository.name }} - - - name: Sign the TAR.GZ file with OpenSSL - run: | - openssl dgst -sha512 -sign signing-key.key nextcloud-release.tar.gz | openssl base64 -out nextcloud-release.signature - - - name: Git Version - id: version - uses: codacy/git-version@2.7.1 - with: - release-branch: beta - - - name: Extract repository description - id: repo-description - run: | - description=$(jq -r '.description' <(curl -s https://api.github.com/repos/${{ github.repository }})) - echo "REPO_DESCRIPTION=$description" >> $GITHUB_ENV - - - name: Use the version - run: | - echo "Git Version info: ${{ steps.version.outputs.version }}" - - - name: Upload Beta Release - uses: ncipollo/release-action@v1.12.0 - with: - tag: v${{ env.NEW_VERSION }} - name: Beta Release ${{ env.NEW_VERSION }} - draft: false - prerelease: true - skipIfReleaseExists: true - - - name: Attach tarball to GitHub release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: nextcloud-release.tar.gz - asset_name: ${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - tag: v${{ env.NEW_VERSION }} - overwrite: true - - - name: Upload app to Nextcloud appstore - uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 - with: - app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.NEXTCLOUD_APPSTORE_TOKEN }} - download_url: https://github.com/${{ github.repository }}/releases/download/v${{ env.NEW_VERSION }}/${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - app_private_key: ${{ secrets.NEXTCLOUD_SIGNING_KEY }} - nightly: false - - - name: Verify version and contents - run: | - echo "App version: ${{ env.NEW_VERSION }}" - echo "Tarball contents:" - tar -tvf nextcloud-release.tar.gz - echo "info.xml contents:" - tar -xOf nextcloud-release.tar.gz ${{ env.APP_NAME }}/appinfo/info.xml diff --git a/.github/workflows/release-beta.yaml b/.github/workflows/release-beta.yaml deleted file mode 100644 index 0c805346..00000000 --- a/.github/workflows/release-beta.yaml +++ /dev/null @@ -1,173 +0,0 @@ -name: Beta Release - -on: - push: - branches: - - beta-release - -jobs: - release-management: - runs-on: ubuntu-latest - # Observed max 0.7 min across 26 fleet runs; 45 matches the shared release - # jobs — a spurious release failure is expensive, so keep this loose. - timeout-minutes: 45 - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Set app env - run: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Get current version and append beta suffix - id: increment_version - run: | - git fetch origin main - main_version=$(git show origin/main:appinfo/info.xml | grep -oP '(?<=)[^<]+' || echo "") - current_version=$(grep -oP '(?<=)[^<]+' appinfo/info.xml || echo "") - - IFS='.' read -ra main_version_parts <<< "$main_version" - next_patch=$((main_version_parts[2] + 1)) - - beta_counter=1 - if [[ $current_version =~ -beta\.([0-9]+)$ ]]; then - current_patch=$(echo $current_version | grep -oP '^[0-9]+\.[0-9]+\.(\d+)' | cut -d. -f3) - if [ "$current_patch" -eq "$next_patch" ]; then - beta_counter=$((BASH_REMATCH[1] + 1)) - fi - fi - - beta_version="${main_version_parts[0]}.${main_version_parts[1]}.${next_patch}-beta.${beta_counter}" - echo "NEW_VERSION=$beta_version" >> $GITHUB_ENV - echo "new_version=$beta_version" >> $GITHUB_OUTPUT - echo "Main version: $main_version" - echo "Current version: $current_version" - echo "Using beta version: $beta_version" - - - name: Update version in info.xml - run: sed -i "s|.*|${{ env.NEW_VERSION }}|" appinfo/info.xml - - - name: Commit version update - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - if git diff --quiet && git diff --cached --quiet; then - echo "No changes to commit" - else - git add appinfo/info.xml - git commit -m "Bump beta version to ${{ env.NEW_VERSION }} [skip ci]" - git push - fi - - - name: Prepare Signing Certificate and Key - run: | - echo "${{ secrets.NEXTCLOUD_SIGNING_CERT }}" > signing-cert.crt - echo "${{ secrets.NEXTCLOUD_SIGNING_KEY }}" > signing-key.key - - - name: Install npm dependencies - uses: actions/setup-node@v3 - with: - node-version: '18.x' - - - name: Set up PHP and install extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - extensions: zip, gd - - - run: npm ci - - run: npm run build - - run: composer install --no-dev --optimize-autoloader --classmap-authoritative - - - name: Copy the package files into the package - run: | - mkdir -p package/${{ github.event.repository.name }} - rsync -av --progress \ - --exclude='/package' \ - --exclude='/.git' \ - --exclude='/.github' \ - --exclude='/.cursor' \ - --exclude='/.vscode' \ - --exclude='/node_modules' \ - --exclude='/src' \ - --exclude='/tests' \ - --exclude='/package.json' \ - --exclude='/package-lock.json' \ - --exclude='/composer.json' \ - --exclude='/composer.lock' \ - --exclude='/phpcs.xml' \ - --exclude='/phpmd.xml' \ - --exclude='/psalm.xml' \ - --exclude='/phpunit.xml' \ - --exclude='/.phpunit.cache' \ - --exclude='.phpunit.result.cache' \ - --exclude='/jest.config.js' \ - --exclude='/webpack.config.js' \ - --exclude='/tsconfig.json' \ - --exclude='/.babelrc' \ - --exclude='/.eslintrc.js' \ - --exclude='/.prettierrc' \ - --exclude='/stylelint.config.js' \ - --exclude='/.gitignore' \ - --exclude='/.gitattributes' \ - --exclude='/signing-key.key' \ - --exclude='/signing-cert.crt' \ - ./ package/${{ github.event.repository.name }}/ - - - name: Create Tarball - run: cd package && tar -czf ../nextcloud-release.tar.gz ${{ github.event.repository.name }} - - - name: Sign the TAR.GZ file with OpenSSL - run: openssl dgst -sha512 -sign signing-key.key nextcloud-release.tar.gz | openssl base64 -out nextcloud-release.signature - - - name: Upload tarball as artifact - uses: actions/upload-artifact@v4 - with: - name: nextcloud-release-${{ env.NEW_VERSION }} - path: | - nextcloud-release.tar.gz - nextcloud-release.signature - retention-days: 30 - - - name: Git Version - id: version - uses: codacy/git-version@2.7.1 - with: - release-branch: beta-release - - - name: Upload Beta Release - uses: ncipollo/release-action@v1.12.0 - with: - tag: v${{ env.NEW_VERSION }} - name: Beta Release ${{ env.NEW_VERSION }} - draft: false - prerelease: true - skipIfReleaseExists: true - - - name: Attach tarball to GitHub release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: nextcloud-release.tar.gz - asset_name: ${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - tag: v${{ env.NEW_VERSION }} - overwrite: true - - - name: Upload app to Nextcloud appstore - uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 - with: - app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.NEXTCLOUD_APPSTORE_TOKEN }} - download_url: https://github.com/${{ github.repository }}/releases/download/v${{ env.NEW_VERSION }}/${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - app_private_key: ${{ secrets.NEXTCLOUD_SIGNING_KEY }} - nightly: false - - - name: Verify release - run: | - echo "App version: ${{ env.NEW_VERSION }}" - echo "Tarball contents:" - tar -tvf nextcloud-release.tar.gz | head -50 - echo "info.xml contents:" - tar -xOf nextcloud-release.tar.gz ${{ env.APP_NAME }}/appinfo/info.xml diff --git a/.github/workflows/release-stable.yaml b/.github/workflows/release-stable.yaml deleted file mode 100644 index 13431854..00000000 --- a/.github/workflows/release-stable.yaml +++ /dev/null @@ -1,181 +0,0 @@ -name: Release Workflow - -on: - push: - branches: - - main - workflow_dispatch: - inputs: - version: - description: 'Version to release (leave empty for auto-increment)' - required: false - default: '' - -jobs: - release-management: - runs-on: ubuntu-latest - # Observed max 0.7 min across 26 fleet runs; 45 matches the shared release - # jobs — a spurious release failure is expensive, so keep this loose. - timeout-minutes: 45 - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Set app env - run: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Get current version and increment - id: increment_version - run: | - current_version=$(grep -oP '(?<=)[^<]+' appinfo/info.xml) - IFS='.' read -ra version_parts <<< "$current_version" - ((version_parts[2]++)) - new_version="${version_parts[0]}.${version_parts[1]}.${version_parts[2]}" - echo "NEW_VERSION=$new_version" >> $GITHUB_ENV - echo "new_version=$new_version" >> $GITHUB_OUTPUT - - - name: Update version in info.xml - run: sed -i "s|.*|${{ env.NEW_VERSION }}|" appinfo/info.xml - - - name: Commit version update - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git add appinfo/info.xml - git commit -m "Bump version to ${{ env.NEW_VERSION }} [skip ci]" - git push - - - name: Prepare Signing Certificate and Key - run: | - echo "${{ secrets.NEXTCLOUD_SIGNING_CERT }}" > signing-cert.crt - echo "${{ secrets.NEXTCLOUD_SIGNING_KEY }}" > signing-key.key - - - name: Install npm dependencies - uses: actions/setup-node@v3 - with: - node-version: '18.x' - - - name: Set up PHP and install extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - extensions: zip, gd - - - run: npm ci - - run: npm run build - - run: composer install --no-dev --optimize-autoloader --classmap-authoritative - - - name: Copy the package files into the package - run: | - mkdir -p package/${{ github.event.repository.name }} - rsync -av --progress \ - --exclude='/package' \ - --exclude='/.git' \ - --exclude='/.github' \ - --exclude='/.cursor' \ - --exclude='/.vscode' \ - --exclude='/node_modules' \ - --exclude='/src' \ - --exclude='/tests' \ - --exclude='/package.json' \ - --exclude='/package-lock.json' \ - --exclude='/composer.json' \ - --exclude='/composer.lock' \ - --exclude='/phpcs.xml' \ - --exclude='/phpmd.xml' \ - --exclude='/psalm.xml' \ - --exclude='/phpunit.xml' \ - --exclude='/.phpunit.cache' \ - --exclude='.phpunit.result.cache' \ - --exclude='/jest.config.js' \ - --exclude='/webpack.config.js' \ - --exclude='/tsconfig.json' \ - --exclude='/.babelrc' \ - --exclude='/.eslintrc.js' \ - --exclude='/.prettierrc' \ - --exclude='/stylelint.config.js' \ - --exclude='/.gitignore' \ - --exclude='/.gitattributes' \ - --exclude='/signing-key.key' \ - --exclude='/signing-cert.crt' \ - ./ package/${{ github.event.repository.name }}/ - - - name: Create Tarball - run: cd package && tar -czf ../nextcloud-release.tar.gz ${{ github.event.repository.name }} - - - name: Sign the TAR.GZ file with OpenSSL - run: openssl dgst -sha512 -sign signing-key.key nextcloud-release.tar.gz | openssl base64 -out nextcloud-release.signature - - - name: Git Version - id: version - uses: codacy/git-version@2.7.1 - with: - release-branch: main - - - name: Upload Release - uses: ncipollo/release-action@v1.12.0 - with: - tag: v${{ env.NEW_VERSION }} - name: Release ${{ env.NEW_VERSION }} - draft: false - prerelease: false - skipIfReleaseExists: true - - - name: Attach tarball to GitHub release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: nextcloud-release.tar.gz - asset_name: ${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - tag: v${{ env.NEW_VERSION }} - overwrite: true - - - name: Upload app to Nextcloud appstore - uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 - with: - app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.NEXTCLOUD_APPSTORE_TOKEN }} - download_url: https://github.com/${{ github.repository }}/releases/download/v${{ env.NEW_VERSION }}/${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - app_private_key: ${{ secrets.NEXTCLOUD_SIGNING_KEY }} - nightly: false - - - name: Verify release - run: | - echo "App version: ${{ env.NEW_VERSION }}" - echo "Tarball contents:" - tar -tvf nextcloud-release.tar.gz | head -50 - echo "info.xml contents:" - tar -xOf nextcloud-release.tar.gz ${{ env.APP_NAME }}/appinfo/info.xml - - update-changelog: - runs-on: ubuntu-latest - # Observed ~0.2 min; 15 leaves ample headroom. - timeout-minutes: 15 - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set app env - run: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Get current version and increment - id: increment_version - run: | - current_version=$(grep -oP '(?<=)[^<]+' appinfo/info.xml) - IFS='.' read -ra version_parts <<< "$current_version" - ((version_parts[2]++)) - new_version="${version_parts[0]}.${version_parts[1]}.${version_parts[2]}" - echo "NEW_VERSION=$new_version" >> $GITHUB_ENV - - - name: Run Changelog CI - if: github.ref == 'refs/heads/main' - uses: saadmk11/changelog-ci@v1.1.2 - with: - persist-credentials: true - release_version: ${{ env.NEW_VERSION }} - config_file: changelog-ci-config.json diff --git a/.github/workflows/release-unstable.yaml b/.github/workflows/release-unstable.yaml deleted file mode 100644 index 0406b6b1..00000000 --- a/.github/workflows/release-unstable.yaml +++ /dev/null @@ -1,175 +0,0 @@ -name: Unstable Release - -on: - push: - branches: - - development-release - -jobs: - release-management: - runs-on: ubuntu-latest - # Observed max 0.7 min across 26 fleet runs; 45 matches the shared release - # jobs — a spurious release failure is expensive, so keep this loose. - timeout-minutes: 45 - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Set app env - run: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Get current version and append unstable suffix - id: increment_version - run: | - git fetch origin main - main_version=$(git show origin/main:appinfo/info.xml | grep -oP '(?<=)[^<]+' || echo "") - current_version=$(grep -oP '(?<=)[^<]+' appinfo/info.xml || echo "") - - IFS='.' read -ra main_version_parts <<< "$main_version" - next_patch=$((main_version_parts[2] + 1)) - - unstable_counter=1 - if [[ $current_version =~ -unstable\.([0-9]+)$ ]]; then - current_patch=$(echo $current_version | grep -oP '^[0-9]+\.[0-9]+\.[0-9]+' | cut -d. -f3) - if [ "$current_patch" -eq "$next_patch" ]; then - unstable_counter=$((BASH_REMATCH[1] + 1)) - fi - fi - - unstable_version="${main_version_parts[0]}.${main_version_parts[1]}.${next_patch}-unstable.${unstable_counter}" - echo "NEW_VERSION=$unstable_version" >> $GITHUB_ENV - echo "new_version=$unstable_version" >> $GITHUB_OUTPUT - echo "Main version: $main_version" - echo "Current version: $current_version" - echo "Using unstable version: $unstable_version" - - - name: Update version in info.xml - run: sed -i "s|.*|${{ env.NEW_VERSION }}|" appinfo/info.xml - - - name: Commit version update - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - - # Only commit if there are actual changes - if git diff --quiet && git diff --cached --quiet; then - echo "No changes to commit" - else - git add appinfo/info.xml - git commit -m "Bump unstable version to ${{ env.NEW_VERSION }} [skip ci]" - git push - fi - - - name: Prepare Signing Certificate and Key - run: | - echo "${{ secrets.NEXTCLOUD_SIGNING_CERT }}" > signing-cert.crt - echo "${{ secrets.NEXTCLOUD_SIGNING_KEY }}" > signing-key.key - - - name: Install npm dependencies - uses: actions/setup-node@v3 - with: - node-version: '18.x' - - - name: Set up PHP and install extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - extensions: zip, gd - - - run: npm ci - - run: npm run build - - run: composer install --no-dev --optimize-autoloader --classmap-authoritative - - - name: Copy the package files into the package - run: | - mkdir -p package/${{ github.event.repository.name }} - rsync -av --progress \ - --exclude='/package' \ - --exclude='/.git' \ - --exclude='/.github' \ - --exclude='/.cursor' \ - --exclude='/.vscode' \ - --exclude='/node_modules' \ - --exclude='/src' \ - --exclude='/tests' \ - --exclude='/package.json' \ - --exclude='/package-lock.json' \ - --exclude='/composer.json' \ - --exclude='/composer.lock' \ - --exclude='/phpcs.xml' \ - --exclude='/phpmd.xml' \ - --exclude='/psalm.xml' \ - --exclude='/phpunit.xml' \ - --exclude='/.phpunit.cache' \ - --exclude='.phpunit.result.cache' \ - --exclude='/jest.config.js' \ - --exclude='/webpack.config.js' \ - --exclude='/tsconfig.json' \ - --exclude='/.babelrc' \ - --exclude='/.eslintrc.js' \ - --exclude='/.prettierrc' \ - --exclude='/stylelint.config.js' \ - --exclude='/.gitignore' \ - --exclude='/.gitattributes' \ - --exclude='/signing-key.key' \ - --exclude='/signing-cert.crt' \ - ./ package/${{ github.event.repository.name }}/ - - - name: Create Tarball - run: cd package && tar -czf ../nextcloud-release.tar.gz ${{ github.event.repository.name }} - - - name: Sign the TAR.GZ file with OpenSSL - run: openssl dgst -sha512 -sign signing-key.key nextcloud-release.tar.gz | openssl base64 -out nextcloud-release.signature - - - name: Upload tarball as artifact - uses: actions/upload-artifact@v4 - with: - name: nextcloud-release-${{ env.NEW_VERSION }} - path: | - nextcloud-release.tar.gz - nextcloud-release.signature - retention-days: 30 - - - name: Git Version - id: version - uses: codacy/git-version@2.7.1 - with: - release-branch: development-release - - - name: Upload Unstable Release - uses: ncipollo/release-action@v1.12.0 - with: - tag: v${{ env.NEW_VERSION }} - name: Unstable Release ${{ env.NEW_VERSION }} - draft: false - prerelease: true - skipIfReleaseExists: true - - - name: Attach tarball to GitHub release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: nextcloud-release.tar.gz - asset_name: ${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - tag: v${{ env.NEW_VERSION }} - overwrite: true - - - name: Upload app to Nextcloud appstore - uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 - with: - app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.NEXTCLOUD_APPSTORE_TOKEN }} - download_url: https://github.com/${{ github.repository }}/releases/download/v${{ env.NEW_VERSION }}/${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - app_private_key: ${{ secrets.NEXTCLOUD_SIGNING_KEY }} - nightly: true - - - name: Verify release - run: | - echo "App version: ${{ env.NEW_VERSION }}" - echo "Tarball contents:" - tar -tvf nextcloud-release.tar.gz | head -50 - echo "info.xml contents:" - tar -xOf nextcloud-release.tar.gz ${{ env.APP_NAME }}/appinfo/info.xml diff --git a/.github/workflows/release-workflow.yaml b/.github/workflows/release-workflow.yaml deleted file mode 100644 index 9cf8ed54..00000000 --- a/.github/workflows/release-workflow.yaml +++ /dev/null @@ -1,230 +0,0 @@ -name: Release Workflow - -on: - push: - branches: - - master - - main - workflow_dispatch: - inputs: - version: - description: 'Version to release (leave empty to use info.xml version)' - required: false - default: '' - -jobs: - release-management: - runs-on: ubuntu-latest - # Observed max 0.7 min across 26 fleet runs; 45 matches the shared release - # jobs — a spurious release failure is expensive, so keep this loose. - timeout-minutes: 45 - steps: - - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Set app env - run: | - echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Get current version and increment - id: increment_version - run: | - current_version=$(grep -oP '(?<=)[^<]+' appinfo/info.xml) - IFS='.' read -ra version_parts <<< "$current_version" - ((version_parts[2]++)) - new_version="${version_parts[0]}.${version_parts[1]}.${version_parts[2]}" - echo "NEW_VERSION=$new_version" >> $GITHUB_ENV - echo "new_version=$new_version" >> $GITHUB_OUTPUT - - - name: Update version in info.xml - run: | - sed -i "s|.*|${{ env.NEW_VERSION }}|" appinfo/info.xml - - - name: Commit version update - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git commit -am "Bump version to ${{ env.NEW_VERSION }}" -m "[skip ci]" - git push - - # Step 1: Prepare the signing certificate and key - - name: Prepare Signing Certificate and Key - run: | - echo "${{ secrets.NEXTCLOUD_SIGNING_CERT }}" > signing-cert.crt - echo "${{ secrets.NEXTCLOUD_SIGNING_KEY }}" > signing-key.key - - # Step 3: Install Node.js dependencies using npm - - name: Install npm dependencies - uses: actions/setup-node@v3 - with: - node-version: '18.x' # Specify Node.js version - - # Step 4: Install PHP extensions - - name: Set up PHP and install extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - extensions: zip, gd - - # Step 5: Build the node dependencies - - run: npm ci - - # Step 6: Build the node dependencies - - run: npm run build - - # Step 7: Build composer dependencies - - run: composer i --no-dev - - # Step 8: Copy the files into the package directory - - name: Copy the package files into the package - run: | - mkdir -p package/${{ github.event.repository.name }} - rsync -av --progress \ - --exclude='package' \ - --exclude='.git' \ - --exclude='.github' \ - --exclude='.vscode' \ - --exclude='docker' \ - --exclude='docs' \ - --exclude='website' \ - --exclude='node_modules' \ - --exclude='/src' \ - --exclude='test' \ - --exclude='package-lock.json' \ - --exclude='composer.lock' \ - --exclude='composer-setup.php' \ - --exclude='.phpunit.result.cache' \ - --exclude='phpmd.xml' \ - --exclude='signing-key.key' \ - --exclude='package.json' \ - --exclude='composer.json' \ - --exclude='coverage.txt' \ - --exclude='signing-cert.crt' \ - --exclude='docker-compose.yml' \ - --exclude='webpack.config.js' \ - --exclude='.prettierrc' \ - --exclude='psalm.xml' \ - --exclude='phpunit.xml' \ - --exclude='tsconfig.json' \ - --exclude='jest.config.js' \ - --exclude='.gitattributes' \ - --exclude='.php-cs-fixer.dist.php' \ - --exclude='.gitignore' \ - --exclude='.eslintrc.js' \ - --exclude='stylelint.config.js' \ - --exclude='.babelrc' \ - --exclude='.nvmrc' \ - ./ package/${{ github.event.repository.name }}/ - - # Step 9: Create the TAR.GZ archive - - name: Create Tarball - run: | - cd package && tar -czf ../nextcloud-release.tar.gz ${{ github.event.repository.name }} - - # Step 10: Sign the TAR.GZ file with OpenSSL - - name: Sign the TAR.GZ file with OpenSSL - run: | - openssl dgst -sha512 -sign signing-key.key nextcloud-release.tar.gz | openssl base64 -out nextcloud-release.signature - - # Step 11: Generate Git version information - - name: Git Version - id: version - uses: codacy/git-version@2.7.1 - with: - release-branch: main - - # Step 11a: Sanitize version for Docker tags - - name: Sanitize version for Docker tags - id: sanitize_version - run: | - # Remove leading dashes and make it Docker tag compliant - raw_version="${{ steps.version.outputs.version }}" - sanitized_version=$(echo "$raw_version" | sed 's/^-*//' | sed 's/[^a-zA-Z0-9._-]//g') - # Ensure it doesn't start with a period or dash - sanitized_version=$(echo "$sanitized_version" | sed 's/^[.-]*//') - # If empty or starts with invalid chars, use a default - if [[ -z "$sanitized_version" || "$sanitized_version" =~ ^[^a-zA-Z0-9] ]]; then - sanitized_version="v$(date +%s)" - fi - echo "DOCKER_TAG=$sanitized_version" >> $GITHUB_ENV - echo "docker_tag=$sanitized_version" >> $GITHUB_OUTPUT - echo "Sanitized version: $sanitized_version" - - # Step 12: Extract repository description - - name: Extract repository description - id: repo-description - run: | - description=$(jq -r '.description' <(curl -s https://api.github.com/repos/${{ github.repository }})) - echo "REPO_DESCRIPTION=$description" >> $GITHUB_ENV - - # Step 14: Output the version - - name: Use the version - run: | - echo ${{ steps.version.outputs.version }} - - # Step 15: Copy the package files into the package (this step seems redundant, consider removing) - - name: Copy the package files into the package - run: | - mkdir -p package/${{ github.event.repository.name }} - rsync -av --progress --exclude='package' --exclude='.git' ./ package/${{ github.event.repository.name }}/ - - # Step 18: Create a new release on GitHub - - name: Upload Release - uses: ncipollo/release-action@v1.12.0 - with: - tag: v${{ env.NEW_VERSION }} - name: Release ${{ env.NEW_VERSION }} - draft: false - prerelease: false - - - name: Attach tarball to github release - uses: svenstaro/upload-release-action@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # v2 - id: attach_to_release - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: nextcloud-release.tar.gz # Corrected spelling - asset_name: ${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - tag: v${{ env.NEW_VERSION }} - overwrite: true - - - name: Upload app to Nextcloud appstore - uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 # v1 - with: - app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.NEXTCLOUD_APPSTORE_TOKEN }} - download_url: https://github.com/${{ github.repository }}/releases/download/v${{ env.NEW_VERSION }}/${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - app_private_key: ${{ secrets.NEXTCLOUD_SIGNING_KEY }} - nightly: false - - - name: Verify version and contents - run: | - echo "App version: ${{ env.NEW_VERSION }}" - echo "Tarball contents:" - tar -tvf nextcloud-release.tar.gz - echo "info.xml contents:" - tar -xOf nextcloud-release.tar.gz ${{ env.APP_NAME }}/appinfo/info.xml - - # Example Docker build steps (commented out - add if needed) - # - name: Set up Docker Buildx - # uses: docker/setup-buildx-action@v2 - # - # - name: Log in to GitHub Container Registry - # uses: docker/login-action@v2 - # with: - # registry: ghcr.io - # username: ${{ github.actor }} - # password: ${{ secrets.GITHUB_TOKEN }} - # - # - name: Build and push Docker image - # uses: docker/build-push-action@v4 - # with: - # context: . - # push: true - # tags: | - # ghcr.io/${{ github.repository }}:${{ env.DOCKER_TAG }} - # ghcr.io/${{ github.repository }}:latest - diff --git a/.github/workflows/sync-beta.yaml b/.github/workflows/sync-beta.yaml deleted file mode 100644 index b1dd1b99..00000000 --- a/.github/workflows/sync-beta.yaml +++ /dev/null @@ -1,62 +0,0 @@ -name: Sync Beta to Beta-Release - -permissions: - contents: write - actions: write - -on: - push: - branches: - - beta - -jobs: - sync-to-beta-release: - runs-on: ubuntu-latest - # Branch-sync job; fleet sync jobs run well under a minute. 20 is generous. - timeout-minutes: 20 - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ github.sha }} - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Configure Git SSH - run: | - git config --global user.email "action@github.com" - git config --global user.name "GitHub Action" - git remote set-url origin git@github.com:${{ github.repository }}.git - - - name: Update beta-release branch - run: | - git fetch origin - - COMMIT_MSG=$(git log -1 --pretty=%B) - - # Preserve existing version on beta-release - BETA_RELEASE_VERSION="" - if git show-ref --quiet refs/remotes/origin/beta-release; then - git checkout origin/beta-release - BETA_RELEASE_VERSION=$(grep -oP '(?<=)[^<]+' appinfo/info.xml || echo "") - echo "Found existing beta-release version: $BETA_RELEASE_VERSION" - fi - - # Reset or create beta-release from beta - if git show-ref --quiet refs/remotes/origin/beta-release; then - git checkout beta-release - git reset --hard origin/beta - else - git checkout -b beta-release origin/beta - fi - - # Restore preserved version - if [ ! -z "$BETA_RELEASE_VERSION" ]; then - sed -i "s|.*|${BETA_RELEASE_VERSION}|" appinfo/info.xml - git add appinfo/info.xml - git commit -m "${COMMIT_MSG} - - Restored beta-release version to ${BETA_RELEASE_VERSION} [skip ci]" - fi - - git push -f origin beta-release diff --git a/.github/workflows/sync-dev.yaml b/.github/workflows/sync-dev.yaml deleted file mode 100644 index bde123d1..00000000 --- a/.github/workflows/sync-dev.yaml +++ /dev/null @@ -1,61 +0,0 @@ -name: Sync Development to Development-Release - -permissions: - contents: write - -on: - push: - branches: - - development - -jobs: - sync-to-development-release: - runs-on: ubuntu-latest - # Branch-sync job; fleet sync jobs run well under a minute. 20 is generous. - timeout-minutes: 20 - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ github.sha }} - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Configure Git SSH - run: | - git config --global user.email "action@github.com" - git config --global user.name "GitHub Action" - git remote set-url origin git@github.com:${{ github.repository }}.git - - - name: Update development-release branch - run: | - git fetch origin - - COMMIT_MSG=$(git log -1 --pretty=%B) - - # Preserve existing version on development-release - DEV_RELEASE_VERSION="" - if git show-ref --quiet refs/remotes/origin/development-release; then - git checkout origin/development-release - DEV_RELEASE_VERSION=$(grep -oP '(?<=)[^<]+' appinfo/info.xml || echo "") - echo "Found existing development-release version: $DEV_RELEASE_VERSION" - fi - - # Reset or create development-release from development - if git show-ref --quiet refs/remotes/origin/development-release; then - git checkout development-release - git reset --hard origin/development - else - git checkout -b development-release origin/development - fi - - # Restore preserved version - if [ ! -z "$DEV_RELEASE_VERSION" ]; then - sed -i "s|.*|${DEV_RELEASE_VERSION}|" appinfo/info.xml - git add appinfo/info.xml - git commit -m "${COMMIT_MSG} - - Restored development-release version to ${DEV_RELEASE_VERSION}" - fi - - git push -f origin development-release diff --git a/.github/workflows/unstable-release.yaml b/.github/workflows/unstable-release.yaml deleted file mode 100644 index 55ca5643..00000000 --- a/.github/workflows/unstable-release.yaml +++ /dev/null @@ -1,145 +0,0 @@ -name: Unstable Release - -on: - push: - branches: - - development - -jobs: - release-management: - runs-on: ubuntu-latest - # Observed max 0.7 min across 26 fleet runs; 45 matches the shared release - # jobs — a spurious release failure is expensive, so keep this loose. - timeout-minutes: 45 - steps: - - - name: Checkout Code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Set app env - run: | - echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Get version from info.xml - id: get_version - run: | - current_version=$(grep -oP '(?<=)[^<]+' appinfo/info.xml || echo "") - echo "NEW_VERSION=$current_version" >> $GITHUB_ENV - echo "new_version=$current_version" >> $GITHUB_OUTPUT - echo "Using version from info.xml: $current_version" - - - name: Prepare Signing Certificate and Key - run: | - echo "${{ secrets.NEXTCLOUD_SIGNING_CERT }}" > signing-cert.crt - echo "${{ secrets.NEXTCLOUD_SIGNING_KEY }}" > signing-key.key - - - name: Install npm dependencies - uses: actions/setup-node@v3 - with: - node-version: '18.x' - - - name: Set up PHP and install extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - extensions: zip, gd - - - run: npm ci - - run: npm run build - - run: composer install --no-dev --optimize-autoloader --classmap-authoritative - - - name: Copy the package files into the package - run: | - mkdir -p package/${{ github.event.repository.name }} - rsync -av --progress \ - --exclude='/package' \ - --exclude='/.git' \ - --exclude='/.github' \ - --exclude='/.cursor' \ - --exclude='/.vscode' \ - --exclude='/node_modules' \ - --exclude='/src' \ - --exclude='/tests' \ - --exclude='/package.json' \ - --exclude='/package-lock.json' \ - --exclude='/composer.json' \ - --exclude='/composer.lock' \ - --exclude='/phpcs.xml' \ - --exclude='/phpmd.xml' \ - --exclude='/psalm.xml' \ - --exclude='/phpunit.xml' \ - --exclude='/.phpunit.cache' \ - --exclude='.phpunit.result.cache' \ - --exclude='/jest.config.js' \ - --exclude='/webpack.config.js' \ - --exclude='/tsconfig.json' \ - --exclude='/.babelrc' \ - --exclude='/.eslintrc.js' \ - --exclude='/.prettierrc' \ - --exclude='/stylelint.config.js' \ - --exclude='/.gitignore' \ - --exclude='/.gitattributes' \ - --exclude='/signing-key.key' \ - --exclude='/signing-cert.crt' \ - ./ package/${{ github.event.repository.name }}/ - - - name: Create Tarball - run: | - cd package && tar -czf ../nextcloud-release.tar.gz ${{ github.event.repository.name }} - - - name: Sign the TAR.GZ file with OpenSSL - run: | - openssl dgst -sha512 -sign signing-key.key nextcloud-release.tar.gz | openssl base64 -out nextcloud-release.signature - - - name: Upload tarball as artifact - uses: actions/upload-artifact@v4 - with: - name: nextcloud-release-${{ env.NEW_VERSION }} - path: | - nextcloud-release.tar.gz - nextcloud-release.signature - retention-days: 30 - - - name: Git Version - id: version - uses: codacy/git-version@2.7.1 - with: - release-branch: development - - - name: Upload Unstable Release - uses: ncipollo/release-action@v1.12.0 - with: - tag: v${{ env.NEW_VERSION }} - name: Unstable Release ${{ env.NEW_VERSION }} - draft: false - prerelease: true - skipIfReleaseExists: true - - - name: Attach tarball to GitHub release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: nextcloud-release.tar.gz - asset_name: ${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - tag: v${{ env.NEW_VERSION }} - overwrite: true - - - name: Upload app to Nextcloud appstore - uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 - with: - app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.NEXTCLOUD_APPSTORE_TOKEN }} - download_url: https://github.com/${{ github.repository }}/releases/download/v${{ env.NEW_VERSION }}/${{ env.APP_NAME }}-${{ env.NEW_VERSION }}.tar.gz - app_private_key: ${{ secrets.NEXTCLOUD_SIGNING_KEY }} - nightly: true - - - name: Verify release - run: | - echo "App version: ${{ env.NEW_VERSION }}" - echo "Tarball contents:" - tar -tvf nextcloud-release.tar.gz | head -50 - echo "info.xml contents:" - tar -xOf nextcloud-release.tar.gz ${{ env.APP_NAME }}/appinfo/info.xml