Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
63b2475
Merge pull request #869 from ConductionNL/hotfix/useduses
rubenvdlinde Dec 9, 2025
0145df9
Enable searching linked objects from setting side of inversedby
rjzondervan Jan 14, 2026
298a202
Merge pull request #880 from ConductionNL/feature/zgw-subfilter
rjzondervan Jan 14, 2026
b336309
Merge pull request #873 from ConductionNL/feature/woo-bct-config
bbrands02 Jan 16, 2026
0abb2bf
Backwards compatibility fixes
rjzondervan Jan 22, 2026
6bd11c6
Create unstable release for this branch
rjzondervan Jan 29, 2026
fd28e14
Correct branch name
rjzondervan Jan 29, 2026
2a89da0
Bump unstable version to 0.2.10-unstable.1 [skip ci]
actions-user Jan 29, 2026
911df0e
Fetch correct multitenancy tenant
rjzondervan Jan 29, 2026
02f75bf
Merge remote-tracking branch 'origin/fix/backward-compatibility' into…
rjzondervan Jan 29, 2026
824a612
Bump unstable version to 0.2.10-unstable.2 [skip ci]
actions-user Jan 29, 2026
48912c5
Fetch id
rjzondervan Jan 29, 2026
79d88d2
Merge remote-tracking branch 'origin/fix/backward-compatibility' into…
rjzondervan Jan 29, 2026
141342b
Bump unstable version to 0.2.10-unstable.3 [skip ci]
actions-user Jan 29, 2026
372ac0a
Add logging for cascading objects
bbrands02 Jan 29, 2026
9383039
Bump unstable version to 0.2.10-unstable.4 [skip ci]
actions-user Jan 29, 2026
2b55ba9
ignore oneOf when importing
bbrands02 Feb 3, 2026
d67a85c
Merge pull request #882 from ConductionNL/fix/ignore-oneof
bbrands02 Feb 4, 2026
e34822c
Bump unstable version to 0.2.10-unstable.5 [skip ci]
actions-user Feb 4, 2026
c54fab1
Fix multitenancy settings by reflecting the actual situation at boot
rjzondervan Feb 6, 2026
4ab7328
Enable catalogs to be set with slugs
rjzondervan Feb 6, 2026
358259b
Merge pull request #884 from ConductionNL/fix/multitenancy-settings
rjzondervan Feb 6, 2026
323c9d3
Bump unstable version to 0.2.10-unstable.6 [skip ci]
actions-user Feb 6, 2026
e6226f2
Merge branch 'main' into fix/backward-compatibility
rjzondervan Feb 9, 2026
9c25cac
Bump unstable version to 0.2.10-unstable.7 [skip ci]
actions-user Feb 9, 2026
2ce2f81
fix some typos to trigger a build
rjzondervan Feb 9, 2026
ce33d18
Bump unstable version to 0.2.10-unstable.8 [skip ci]
actions-user Feb 9, 2026
f3b93f7
Disable build
rjzondervan Feb 9, 2026
1cef5be
Bump unstable version to 0.2.10-unstable.1 [skip ci]
actions-user Feb 9, 2026
d190db5
reset info.xml
rjzondervan Feb 9, 2026
63e1b2c
Bump unstable version to 0.2.10-unstable.1 [skip ci]
actions-user Feb 9, 2026
0eb63b8
Another attempt to reset info.xml
rjzondervan Feb 9, 2026
906fd0d
Bump unstable version to 0.2.10-unstable.1 [skip ci]
actions-user Feb 9, 2026
ce7579c
Try to semi-disable workflow again
rjzondervan Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
297 changes: 297 additions & 0 deletions .github/workflows/unstable-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,297 @@
name: Unstable Release

on:
push:
branches:
# - feature/php-linting # Disabled - now building beta releases instead
- fix/backward-compatibility # Workflow disabled

jobs:
release-management:
runs-on: ubuntu-latest
steps:

# Step 1: Checkout Code
- name: Checkout Code
uses: actions/checkout@v3
with:
fetch-depth: 0
ssh-key: ${{ secrets.DEPLOY_KEY }}

# Step 2: Set the app name (use the repo name)
- name: Set app env
run: |
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV

# Step 3: Get current version from info.xml, increment patch and add unstable suffix
- name: Get current version and append unstable 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 '(?<=<version>)[^<]+' || echo "")

# Get current version from feature/php-linting branch
current_version=$(grep -oP '(?<=<version>)[^<]+' 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 unstable counter from current version if it exists
unstable_counter=1
if [[ $current_version =~ -unstable\.([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
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"

# Step 4: Update the version in info.xml
- name: Update version in info.xml
run: |
sed -i "s|<version>.*</version>|<version>${{ env.NEW_VERSION }}</version>|" appinfo/info.xml

# Step 5: Commit the new version
- name: Commit version update
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"

# Check if there are changes to commit
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

# Step 6: Prepare the signing certificates
- name: Prepare Signing Certificate and Key
run: |
echo "${{ secrets.NEXTCLOUD_SIGNING_CERT }}" > signing-cert.crt
echo "${{ secrets.NEXTCLOUD_SIGNING_KEY }}" > signing-key.key

# Step 7: Install npm dependencies
- name: Install npm dependencies
uses: actions/setup-node@v3
with:
node-version: '18.x'

# Step 8: Set up PHP and install required extensions
- name: Set up PHP and install extensions
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: zip, gd

# Step 9: Run npm install, build and composer install
- run: npm ci
- run: npm run build
- run: composer install --no-dev --optimize-autoloader --classmap-authoritative

# Step 9a: Verify vendor dependencies are installed
- name: Verify vendor dependencies
run: |
echo "Checking critical dependencies..."

# Check that vendor directory exists and has content
if [ ! -d "vendor" ] || [ -z "$(ls -A vendor 2>/dev/null)" ]; then
echo "ERROR: vendor directory is missing or empty"
exit 1
fi

# Check specific critical dependencies
missing_deps=0

if [ ! -d "vendor/openai-php/client/src" ]; then
echo "ERROR: openai-php/client source files not found"
missing_deps=1
fi

if [ ! -d "vendor/theodo-group/llphant/src" ]; then
echo "ERROR: theodo-group/llphant source files not found"
missing_deps=1
fi

if [ $missing_deps -eq 1 ]; then
echo "HINT: Check composer.json dependencies and composer install output"
exit 1
fi

echo "✓ All critical dependencies verified with source files"

# Step 10: 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='/.cursor' \
--exclude='/.vscode' \
--exclude='/.nextcloud' \
--exclude='/docker' \
--exclude='/docker-compose.yml' \
--exclude='/docs' \
--exclude='/website' \
--exclude='/node_modules' \
--exclude='/src' \
--exclude='/phpcs-custom-sniffs' \
--exclude='/resources' \
--exclude='/tests' \
--exclude='/path' \
--exclude='/package.json' \
--exclude='/package-lock.json' \
--exclude='/composer.json' \
--exclude='/composer.lock' \
--exclude='/composer-setup.php' \
--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='/.spectral.yml' \
--exclude='/.gitignore' \
--exclude='/.gitattributes' \
--exclude='/.php-cs-fixer.dist.php' \
--exclude='/.nvmrc' \
--exclude='/changelog-ci-config.json' \
--exclude='/coverage.txt' \
--exclude='/signing-key.key' \
--exclude='/signing-cert.crt' \
--exclude='/openapi.json' \
--exclude='/*_ANALYSIS.md' \
--exclude='/*_FIX.md' \
--exclude='/*_SUMMARY.md' \
--exclude='/*_GUIDE.md' \
./ package/${{ github.event.repository.name }}/

# Step 11: Verify package contents before creating tarball
- name: Verify package vendor directory
run: |
echo "Verifying package contains complete vendor dependencies..."

# Check vendor directory was copied
if [ ! -d "package/${{ github.event.repository.name }}/vendor" ]; then
echo "ERROR: vendor directory not found in package"
exit 1
fi

# Verify vendor packages have source files (not just LICENSE)
if [ ! -d "package/${{ github.event.repository.name }}/vendor/openai-php/client/src" ]; then
echo "ERROR: openai-php/client/src not found in package"
echo "HINT: Check rsync exclusion patterns - they may be too broad"
ls -la package/${{ github.event.repository.name }}/vendor/openai-php/client/ || true
exit 1
fi

# Quick sanity check: count vendor subdirectories
vendor_count=$(find package/${{ github.event.repository.name }}/vendor -maxdepth 1 -type d | wc -l)
if [ $vendor_count -lt 10 ]; then
echo "WARNING: Only $vendor_count vendor directories found (expected 20+)"
echo "Listing vendor contents:"
ls -la package/${{ github.event.repository.name }}/vendor/
fi

echo "✓ Package vendor directory verified with source files"

# Step 12: Create the TAR.GZ archive
- name: Create Tarball
run: |
cd package && tar -czf ../nextcloud-release.tar.gz ${{ github.event.repository.name }}

# Step 13: 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 13a: Upload tarball as workflow artifact for easy inspection
- 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

# Step 14: Generate Git version information (optional, for logging)
- name: Git Version
id: version
uses: codacy/git-version@2.7.1
with:
release-branch: feature/php-linting

# Step 15: Extract repository description (optional)
- 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 16: Output the version (for logging)
- name: Use the version
run: |
echo "Git Version info: ${{ steps.version.outputs.version }}"

# Step 17: Create a new GitHub release (as prerelease)
- 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

# Step 18: Attach the tarball as asset to the GitHub release
- 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

# Step 19: Upload the app to the Nextcloud App Store as unstable/nightly
- 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

# Step 20: Verify the release
- name: Verify version and contents
run: |
echo "App version: ${{ env.NEW_VERSION }}"
echo "Tarball contents:"
tar -tvf nextcloud-release.tar.gz | head -100
echo "Verify vendor directory in tarball:"
tar -tvf nextcloud-release.tar.gz | grep "vendor/openai-php/client" | head -5 || echo "WARNING: openai-php/client not found in tarball!"
echo "info.xml contents:"
tar -xOf nextcloud-release.tar.gz ${{ env.APP_NAME }}/appinfo/info.xml
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ This monorepo is a Nextcloud app, it is based on the following structure:
├── templates/ # Template files for rendering app views
└── website/ # Documentation website source files

When running locally, or in development mode the folders nodus_modules and vendor are added. Thes shoudl however not be commited.
When running locally, or in development mode the folders nodus_modules and vendor are added. These should however not be commited.

## Contributing

Expand Down
Loading