diff --git a/.github/actions/deploy-to-cloudflare-pages/action.yml b/.github/actions/deploy-to-cloudflare-pages/action.yml new file mode 100644 index 000000000..c449af272 --- /dev/null +++ b/.github/actions/deploy-to-cloudflare-pages/action.yml @@ -0,0 +1,94 @@ +name: "Deploy to Cloudflare Pages" +description: "Deploys to Cloudflare Pages on either a temporary branch with preview comment, or on the production version if on the main branch." +inputs: + project_name: + description: "CloudFlare Pages project name" + comment_body: + description: "The message to display when deployment is ready" + default: "Deployment is ready." + required: false + production_url: + description: "The URL to mention as the production URL." + required: true + deploy_dir: + description: "The directory from which to deploy." + required: true +runs: + using: composite + steps: + # Install wrangler globally to avoid workspace issues + - name: Install Wrangler + shell: bash + run: npm install -g wrangler + + # Deploy using Wrangler (use pre-installed wrangler) + - name: Deploy to Cloudflare Pages + id: deploy + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=${{ github.ref_name }} + wranglerVersion: '' # Use pre-installed version + + # Deploy preview for PRs + - name: Deploy Preview to Cloudflare Pages + id: preview-deployment + if: github.event_name == 'pull_request' + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=pr-${{ github.event.pull_request.number }} + wranglerVersion: '' # Use pre-installed version + + # Post deployment URL as PR comment + - name: Comment PR with Preview URL + if: github.event_name == 'pull_request' + uses: actions/github-script@v8 + env: + COMMENT_BODY: ${{ inputs.comment_body }} + PRODUCTION_URL: ${{ inputs.production_url }} + PROJECT_NAME: ${{ inputs.project_name }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = context.issue.number; + // Construct preview URL based on Cloudflare Pages pattern + const projectName = process.env.PROJECT_NAME; + const previewUrl = `https://pr-${prNumber}.${projectName}.pages.dev`; + + // Check if we already commented + const comments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber + }); + + const customMessage = process.env.COMMENT_BODY; + const botComment = comments.data.find(comment => + comment.user.type === 'Bot' && + comment.body.includes(customMessage) + ); + + const mainUrl = process.env.PRODUCTION_URL; + const commentBody = `${customMessage}!\n\nšŸ”— Preview URL: ${previewUrl}\nšŸ“– Production URL: ${mainUrl}\n\nāœ… All checks passed\n\n_This preview will be updated automatically with new commits._`; + + if (botComment) { + // Update existing comment + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: commentBody + }); + } else { + // Create new comment + await github.rest.issues.createComment({ + issue_number: prNumber, + owner: context.repo.owner, + repo: context.repo.repo, + body: commentBody + }); + } diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index b80fadb69..e0c91ac40 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -16,10 +16,10 @@ on: - 'requirements-docs.txt' - '.github/workflows/deploy-docs.yml' - 'scripts/fix-mkdocs-structure.ts' - + # Allow manual triggering from Actions tab workflow_dispatch: - + # Run on pull requests for preview deployments pull_request: branches: @@ -38,55 +38,55 @@ jobs: name: Build and Deploy MkDocs runs-on: ubuntu-latest timeout-minutes: 10 - + # Required permissions for deployment permissions: contents: read deployments: write pull-requests: write # For PR preview comments id-token: write # For OIDC authentication (if needed) - + steps: - name: Checkout Repository uses: actions/checkout@v5 with: fetch-depth: 0 # Fetch all history for git info and mkdocs-git-revision-date plugin - + - name: Setup Python uses: actions/setup-python@v6 with: python-version: '3.13' cache: 'pip' cache-dependency-path: 'requirements-docs.txt' - + - name: Install MkDocs and Dependencies run: | pip install --upgrade pip pip install -r requirements-docs.txt env: PIP_DISABLE_PIP_VERSION_CHECK: 1 - + # Setup pnpm before fixing docs structure - name: Setup pnpm uses: pnpm/action-setup@v4 - + # Setup Node.js with pnpm - name: Setup Node.js uses: actions/setup-node@v5 with: node-version: '22' cache: 'pnpm' - + # Install Node.js dependencies for the TypeScript script - name: Install Dependencies run: | pnpm install --frozen-lockfile - + - name: Fix Documentation Structure run: | # Fix duplicate navigation entries by moving overview pages to index.md pnpm run chore:fix-mkdocs-structure - + - name: Build MkDocs Site run: | # Build with strict mode but allow expected warnings @@ -115,74 +115,11 @@ jobs: test -f site/sitemap.xml || (echo "ERROR: site/sitemap.xml not found" && exit 1) test -d site/assets || (echo "ERROR: site/assets directory not found" && exit 1) echo "āœ… Site validation passed" - - # Install wrangler globally to avoid workspace issues - - name: Install Wrangler - run: | - npm install -g wrangler - - # Deploy using Wrangler (use pre-installed wrangler) - - name: Deploy to Cloudflare Pages - id: deploy - if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' - uses: cloudflare/wrangler-action@v3 + + - name: Deploy + uses: ./.github/actions/deploy-to-cloudflare-pages with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: pages deploy site --project-name=trilium-docs --branch=${{ github.ref_name }} - wranglerVersion: '' # Use pre-installed version - - # Deploy preview for PRs - - name: Deploy Preview to Cloudflare Pages - id: preview-deployment - if: github.event_name == 'pull_request' - uses: cloudflare/wrangler-action@v3 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: pages deploy site --project-name=trilium-docs --branch=pr-${{ github.event.pull_request.number }} - wranglerVersion: '' # Use pre-installed version - - # Post deployment URL as PR comment - - name: Comment PR with Preview URL - if: github.event_name == 'pull_request' - uses: actions/github-script@v8 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const prNumber = context.issue.number; - // Construct preview URL based on Cloudflare Pages pattern - const previewUrl = `https://pr-${prNumber}.trilium-docs.pages.dev`; - const mainUrl = 'https://docs.triliumnotes.org'; - - // Check if we already commented - const comments = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber - }); - - const botComment = comments.data.find(comment => - comment.user.type === 'Bot' && - comment.body.includes('Documentation preview is ready') - ); - - const commentBody = `šŸ“š Documentation preview is ready!\n\nšŸ”— Preview URL: ${previewUrl}\nšŸ“– Production URL: ${mainUrl}\n\nāœ… All checks passed\n\n_This preview will be updated automatically with new commits._`; - - if (botComment) { - // Update existing comment - await github.rest.issues.updateComment({ - owner: context.repo.owner, - repo: context.repo.repo, - comment_id: botComment.id, - body: commentBody - }); - } else { - // Create new comment - await github.rest.issues.createComment({ - issue_number: prNumber, - owner: context.repo.owner, - repo: context.repo.repo, - body: commentBody - }); - } + project_name: "trilium-docs" + comment_body: "šŸ“š Documentation preview is ready" + production_url: "https://docs.triliumnotes.org" + deploy_dir: "site" diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 000000000..6a14a2249 --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,38 @@ +name: Deploy website + +on: + push: + branches: + - main + paths: + - "apps/website/**" + + pull_request: + paths: + - "apps/website/**" + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + permissions: + contents: read + deployments: write + pull-requests: write # For PR preview comments + + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + + - name: Build the website + run: | + pnpm i + pnpm website:build + + - name: Deploy + uses: ./.github/actions/deploy-to-cloudflare-pages + with: + project_name: "trilium-homepage" + comment_body: "šŸ“š Website preview is ready" + production_url: "https://triliumnotes.org" + deploy_dir: "apps/website/dist" diff --git a/package.json b/package.json index 9299e0f6d..0578bcd2a 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "desktop:start": "pnpm run --filter desktop dev", "desktop:build": "pnpm run --filter desktop build", "desktop:start-prod": "pnpm run --filter desktop start-prod", + "website:build": "pnpm run --filter website build", "electron:build": "pnpm desktop:build", "electron:start": "pnpm desktop:start", "electron:start-prod": "pnpm desktop:start-prod",