From 98c1721db6974b74af70be2539d76c105966ec25 Mon Sep 17 00:00:00 2001 From: KeshavAnandCode Date: Tue, 19 May 2026 16:27:38 -0500 Subject: [PATCH] changed publish.yml workflow --- .gitea/workflows/publish.yml | 136 +++++++++++++++-------------------- 1 file changed, 56 insertions(+), 80 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 5e2ce25..6a1bc2d 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -1,104 +1,80 @@ -name: CI/CD Pipeline +name: Publish Language Pack on: push: - branches: ["main"] - tags: ["v*"] # Triggers production deployment whenever a version tag is pushed - pull_request: - branches: ["main"] + tags: + - "v*" # Fires directly on v0.1.0, v0.2.0 etc. jobs: - # --------------------------------------------------------------------------- - # Stage 1: Quality Control & Automated Verification - # --------------------------------------------------------------------------- - test: - name: Verify Pack Integrity + # Enforce that tests MUST pass before release can execute + verify: runs-on: ubuntu-latest steps: - - name: Checkout Code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install and Verify + run: | + pip install pytest + pytest tests/ -v + + publish: + needs: verify # Blocks execution if verify job fails + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - - name: Install Testing Environment - run: | - python -m pip install --upgrade pip - pip install pytest + - name: Install Release Tools + run: pip install build twine - - name: Execute Code Audit - run: python -m pytest tests/ -v - - # --------------------------------------------------------------------------- - # Stage 2: Production Build & Multi-Platform Distribution - # --------------------------------------------------------------------------- - publish: - name: Production Release (PyPI & Gitea) - needs: test - if: startsWith(github.ref, 'refs/tags/v') # Strictly run only for tagged versions - runs-on: ubuntu-latest - - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Set up Production Python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - - name: Install Modern Build Toolchain - run: | - python -m pip install --upgrade pip - pip install build twine - - - name: Compile Distribution Assets (PEP 517) - # This automatically handles whatever package name is configured inside pyproject.toml - run: python -m build + - name: Build Wheel and Source Distribution + # Automatically detects pyproject.toml and builds the correct pack + run: python -m build . - name: Publish Package to PyPI env: TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} # Uses your org-level token safely + # Inherits your clean Organization level secret + TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} run: twine upload --skip-existing dist/* - - name: Generate Automated Gitea Release - uses: actions/github-script@v7 - with: - script: | - const fs = require('fs'); - const path = require('path'); + - name: Build Gitea Release with Assets + env: + # Pulls your clean Organization level Gitea Token + GIT_RELEASE_TOKEN: ${{ secrets.GIT_RELEASE_TOKEN }} + run: | + TAG=${GITHUB_REF#refs/tags/} + REPO_NAME=${{ github.event.repository.name }} - // Extract tag context - const tagName = context.ref.replace('refs/tags/', ''); + # Delete existing release block if present + EXISTING=$(curl -s -H "Authorization: token $GIT_RELEASE_TOKEN" "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/tags/$TAG") + EXISTING_ID=$(echo $EXISTING | python -c "import sys,json; d=json.load(sys.stdin); print(d.get('id',''))" 2>/dev/null || echo "") + if [ -n "$EXISTING_ID" ]; then + curl -s -X DELETE -H "Authorization: token $GIT_RELEASE_TOKEN" "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/$EXISTING_ID" + fi - // Create the Gitea Release container - const release = await github.rest.repos.createRelease({ - owner: context.repo.owner, - repo: context.repo.repo, - tag_name: tagName, - name: `Release ${tagName}`, - body: `Automated distribution release for version ${tagName}. Verified by system tests.`, - draft: false, - prerelease: false - }); + # Create fresh production release container + RELEASE=$(curl -s -X POST \ + -H "Authorization: token $GIT_RELEASE_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{ + \"tag_name\": \"$TAG\", + \"name\": \"$REPO_NAME $TAG\", + \"body\": \"Language pack release version $TAG for the foreignthon transpiler framework.\", + \"draft\": false, + \"prerelease\": false + }" "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases") - // Read and attach compiled distribution files (.whl and .tar.gz) - const distDir = './dist'; - const files = fs.readdirSync(distDir); + RELEASE_ID=$(echo $RELEASE | python -c "import sys,json; print(json.load(sys.stdin)['id'])") - for (const file of files) { - const filePath = path.join(distDir, file); - const fileData = fs.readFileSync(filePath); - - await github.rest.repos.uploadReleaseAsset({ - owner: context.repo.owner, - repo: context.repo.repo, - release_id: release.data.id, - name: file, - data: fileData - }); - console.log(`Successfully attached asset: ${file}`); - } + # Upload wheels directly into Gitea Assets tab + for FILE in dist/*; do + curl -s -X POST -H "Authorization: token $GIT_RELEASE_TOKEN" -F "attachment=@$FILE" "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/$RELEASE_ID/assets" + done