name: Release Pipeline on: push: tags: - 'v*.*.*' jobs: validate: name: Validate Release runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Run full test suite run: npm run test:coverage - name: Run linting run: npm run lint - name: Validate tag matches package version run: | TAG_VERSION=${GITHUB_REF#refs/tags/v} PKG_VERSION=$(node -p "require('./package.json').version") echo "Tag version: v$TAG_VERSION" echo "Package version: $PKG_VERSION" if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then echo "❌ Version mismatch! Tag: v$TAG_VERSION, package.json: $PKG_VERSION" exit 1 fi echo "✅ Version validation passed" build-artifacts: name: Build Release Artifacts runs-on: ubuntu-latest needs: validate steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Create release directory run: mkdir -p release/chess-game - name: Copy application files run: | cp -r js release/chess-game/ cp -r css release/chess-game/ cp index.html release/chess-game/ cp package.json release/chess-game/ cp README.md release/chess-game/ 2>/dev/null || echo "No README found" cp LICENSE release/chess-game/ 2>/dev/null || echo "No LICENSE found" - name: Create source archive run: | cd release tar -czf chess-game-${GITHUB_REF#refs/tags/}.tar.gz chess-game/ zip -r chess-game-${GITHUB_REF#refs/tags/}.zip chess-game/ cd .. - name: Generate checksums run: | cd release sha256sum chess-game-*.tar.gz > checksums.txt sha256sum chess-game-*.zip >> checksums.txt cat checksums.txt cd .. - name: Create release notes run: | cat > release/RELEASE_NOTES.md << 'EOF' # Chess Game Release ${GITHUB_REF#refs/tags/} ## What's Included This release contains the complete HTML Chess Game application. ### Files - Source code (JavaScript ES6+ modules) - HTML interface - CSS styling - Documentation ### Installation 1. Extract the archive 2. Run `npm install` to install dependencies 3. Run `npm run dev` to start the development server 4. Open your browser to http://localhost:8080 ### Testing - Run `npm test` for the test suite - Run `npm run test:coverage` for coverage report ### Requirements - Node.js 18 or higher - Modern web browser (Chrome, Firefox, Safari, Edge) ## Verification Verify the integrity of downloaded files using: ```bash sha256sum -c checksums.txt ``` EOF - name: Upload release artifacts uses: actions/upload-artifact@v4 with: name: release-artifacts path: | release/*.tar.gz release/*.zip release/checksums.txt release/RELEASE_NOTES.md retention-days: 90 create-release: name: Create GitHub/Gitea Release runs-on: ubuntu-latest needs: build-artifacts steps: - name: Checkout code uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: name: release-artifacts path: release/ - name: Extract version info id: version run: | VERSION=${GITHUB_REF#refs/tags/v} echo "version=$VERSION" >> $GITHUB_OUTPUT echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Create Release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ github.ref }} release_name: Chess Game ${{ steps.version.outputs.tag }} body_path: release/RELEASE_NOTES.md draft: false prerelease: false - name: Upload tar.gz asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./release/chess-game-${{ steps.version.outputs.tag }}.tar.gz asset_name: chess-game-${{ steps.version.outputs.tag }}.tar.gz asset_content_type: application/gzip - name: Upload zip asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./release/chess-game-${{ steps.version.outputs.tag }}.zip asset_name: chess-game-${{ steps.version.outputs.tag }}.zip asset_content_type: application/zip - name: Upload checksums uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./release/checksums.txt asset_name: checksums.txt asset_content_type: text/plain notify: name: Post-Release Notifications runs-on: ubuntu-latest needs: create-release if: success() steps: - name: Release success notification run: | echo "✅ Release ${GITHUB_REF#refs/tags/} created successfully!" echo "📦 Artifacts uploaded and available for download" echo "🎉 Release pipeline completed"