name: Build and Release EPUB on: push: tags: - 'v*' jobs: build: name: Build EPUB (${{ matrix.lang }}) runs-on: ubuntu-latest strategy: # Don't cancel other languages if one fails — we still want to release # whichever languages built successfully. fail-fast: false matrix: lang: [en, vi, zh] steps: - uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v4 - name: Install Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Install Mermaid CLI run: npm install -g @mermaid-js/mermaid-cli - name: Install Python dependencies run: | uv venv uv pip install -r scripts/requirements-dev.txt - name: Build EPUB run: | echo '{"args":["--no-sandbox","--disable-setuid-sandbox"]}' > /tmp/puppeteer-ci.json uv run scripts/build_epub.py \ --lang ${{ matrix.lang }} \ --puppeteer-config /tmp/puppeteer-ci.json - name: Upload EPUB artifact uses: actions/upload-artifact@v4 with: name: epub-${{ matrix.lang }} path: claude-howto-guide*.epub if-no-files-found: error retention-days: 7 release: name: Publish GitHub Release needs: build # Release even if some language builds failed — we still publish the # artifacts that did build. `needs.build.result != 'cancelled'` guards # against manually cancelled runs. if: ${{ always() && needs.build.result != 'cancelled' }} runs-on: ubuntu-latest permissions: contents: write steps: - name: Download all EPUB artifacts uses: actions/download-artifact@v4 with: path: dist pattern: epub-* merge-multiple: true - name: List built artifacts run: ls -lh dist/ - name: Create Release uses: softprops/action-gh-release@v2 with: files: dist/*.epub generate_release_notes: true fail_on_unmatched_files: true