mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			1cdd8d9ba8
			...
			release-wo
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 3cfb0f5856 | 
							
								
								
									
										135
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| name: Paperless-ngx Release | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       version: | ||||
|         description: "Release version (e.g., 2.18.3)" | ||||
|         required: true | ||||
|         type: string | ||||
| permissions: | ||||
|   contents: write | ||||
|   actions: read | ||||
| concurrency: | ||||
|   group: release-main | ||||
|   cancel-in-progress: false | ||||
| jobs: | ||||
|   release: | ||||
|     runs-on: ubuntu-24.04 | ||||
|     steps: | ||||
|       - name: Checkout (full) | ||||
|         uses: actions/checkout@v4 | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|       - name: Configure git | ||||
|         run: | | ||||
|           git config user.name  "${{ github.actor }}" | ||||
|           git config user.email "${{ github.actor }}@users.noreply.github.com" | ||||
|       - name: Sanitize & validate input | ||||
|         id: ver | ||||
|         shell: bash | ||||
|         run: | | ||||
|           RAW="${{ github.event.inputs.version }}" | ||||
|           # trim spaces + strip leading 'v' if present | ||||
|           RAW="${RAW//[[:space:]]/}" | ||||
|           RAW="${RAW#v}" | ||||
|  | ||||
|           # basic semver X.Y.Z | ||||
|           if [[ ! "$RAW" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | ||||
|             echo "❌ Invalid version: '$RAW' (expected X.Y.Z or vX.Y.Z)"; exit 1 | ||||
|           fi | ||||
|  | ||||
|           MAJOR="${RAW%%.*}" | ||||
|           REST="${RAW#*.}" | ||||
|           MINOR="${REST%%.*}" | ||||
|           PATCH="${REST#*.}" | ||||
|  | ||||
|           echo "version=$RAW"   >> "$GITHUB_OUTPUT" | ||||
|           echo "major=$MAJOR"   >> "$GITHUB_OUTPUT" | ||||
|           echo "minor=$MINOR"   >> "$GITHUB_OUTPUT" | ||||
|           echo "patch=$PATCH"   >> "$GITHUB_OUTPUT" | ||||
|  | ||||
|           echo "✅ Using version $RAW" | ||||
|       - name: Ensure tag does not already exist | ||||
|         run: | | ||||
|           git fetch --tags | ||||
|           if git rev-parse "v${{ steps.ver.outputs.version }}" >/dev/null 2>&1; then | ||||
|             echo "❌ Tag v${{ steps.ver.outputs.version }} already exists"; exit 1 | ||||
|           fi | ||||
|       - name: Update local branches | ||||
|         run: | | ||||
|           git fetch origin main dev | ||||
|       - name: Fast-forward main to dev (no merge commits) | ||||
|         run: | | ||||
|           # Reset local main to remote, then try fast-forward to dev. | ||||
|           git checkout main | ||||
|           git reset --hard origin/main | ||||
|           # --ff-only ensures the workflow fails if the branches diverged. | ||||
|           git merge --ff-only origin/dev | ||||
|           echo "✅ main fast-forwarded to dev at $(git rev-parse --short HEAD)" | ||||
|       - name: Bump versions in files | ||||
|         shell: bash | ||||
|         run: | | ||||
|           VER="${{ steps.ver.outputs.version }}" | ||||
|           MAJ="${{ steps.ver.outputs.major }}" | ||||
|           MIN="${{ steps.ver.outputs.minor }}" | ||||
|           PAT="${{ steps.ver.outputs.patch }}" | ||||
|  | ||||
|           # 1) pyproject.toml: [project] version = "X.Y.Z" | ||||
|           sed -i -E 's/^version = "[0-9]+\.[0-9]+\.[0-9]+"/version = "'"$VER"'"/' pyproject.toml | ||||
|  | ||||
|           # 2) src-ui/package.json: "version": "X.Y.Z" | ||||
|           # Use jq if available; otherwise sed fallback. | ||||
|           if command -v jq >/dev/null 2>&1; then | ||||
|             tmp=$(mktemp) | ||||
|             jq --arg v "$VER" '.version=$v' src-ui/package.json > "$tmp" && mv "$tmp" src-ui/package.json | ||||
|           else | ||||
|             sed -i -E 's/"version": "[0-9]+\.[0-9]+\.[0-9]+"/"version": "'"$VER"'"/' src-ui/package.json | ||||
|           fi | ||||
|  | ||||
|           # 3) src-ui/src/environments/environment.prod.ts: version: 'X.Y.Z' | ||||
|           sed -i -E "s/version: '[0-9]+\.[0-9]+\.[0-9]+'/version: '$VER'/" src-ui/src/environments/environment.prod.ts | ||||
|  | ||||
|           # 4) src/paperless/version.py: __version__ = (X, Y, Z) | ||||
|           sed -i -E "s/__version__:\s*Final\[tuple\[int,\s*int,\s*int\]\]\s*=\s*\([0-9]+,\s*[0-9]+,\s*[0-9]+\)/__version__: Final[tuple[int, int, int]] = ($MAJ, $MIN, $PAT)/" src/paperless/version.py | ||||
|  | ||||
|           # 5) uv.lock: in the [[package]] name = "paperless-ngx" block, set version = "X.Y.Z" | ||||
|           # This awk edits only the block for paperless-ngx. | ||||
|           awk -v ver="$VER" ' | ||||
|             BEGIN{inpkg=0} | ||||
|             /^\[\[package\]\]/{inpkg=0} | ||||
|             /^\[\[package\]\]/{print; next} | ||||
|             {print > "/dev/stdout"} | ||||
|           ' uv.lock >/dev/null 2>&1 # noop to ensure awk exists | ||||
|  | ||||
|           # More robust in-place edit with awk: | ||||
|           awk -v ver="$VER" ' | ||||
|             BEGIN{inpkg=0} | ||||
|             /^\[\[package\]\]/{inpkg=0; print; next} | ||||
|             /^name = "paperless-ngx"/{inpkg=1; print; next} | ||||
|             inpkg && /^version = "/{ | ||||
|               sub(/version = "[0-9]+\.[0-9]+\.[0-9]+"/, "version = \"" ver "\"") | ||||
|               print; next | ||||
|             } | ||||
|             {print} | ||||
|           ' uv.lock > uv.lock.new && mv uv.lock.new uv.lock | ||||
|  | ||||
|           echo "✅ Files updated to $VER" | ||||
|       - name: Commit bump (if changes) | ||||
|         run: | | ||||
|           if git diff --quiet; then | ||||
|             echo "ℹ️ No changes to commit (versions may already match)"; | ||||
|           else | ||||
|             git add pyproject.toml src-ui/package.json src-ui/src/environments/environment.prod.ts src/paperless/version.py uv.lock | ||||
|             git commit -m "Bump version to ${{ steps.ver.outputs.version }}" | ||||
|           fi | ||||
|       - name: Push main | ||||
|         run: | | ||||
|           # Push branch (even if no commit, ensures remote main == local) | ||||
|           git push origin HEAD:main | ||||
|       - name: Create and push tag | ||||
|         run: | | ||||
|           VER="${{ steps.ver.outputs.version }}" | ||||
|           git tag -a "v${VER}" -m "Release v${VER}" | ||||
|           git push origin "v${VER}" | ||||
|       - name: Done | ||||
|         run: echo "🎉 Release v${{ steps.ver.outputs.version }} created and pushed." | ||||
		Reference in New Issue
	
	Block a user