Skip to content

Commit

Permalink
chore: update ahead-of-time build docs for Deno Deploy
Browse files Browse the repository at this point in the history
  • Loading branch information
lucacasonato committed Mar 22, 2024
1 parent 13d514d commit c624bd9
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 154 deletions.
65 changes: 9 additions & 56 deletions docs/latest/concepts/ahead-of-time-builds.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Fresh enables you to pre-optimize frontend assets before the code is deployed.
During that process the code for Islands will be compressed and optimized, so
that Fresh can send as little code as possible to the browser. Depending on the
amount of code an island needs, this process can take several seconds if done on
the fly serverside.
the fly server-side.

Doing those optimizations ahead-of-time and deploying the already optimized
assets alongside with your code, allows Fresh to treat them as like any other
Expand All @@ -16,7 +16,7 @@ pages with islands, having to do no processing greatly speeds up page load
times.

Plugins can build static assets during ahead-of-time builds. This can be used to
preprocess or generate CSS files, for example.
pre-process or generate CSS files, for example.

## Creating an optimized build

Expand Down Expand Up @@ -58,61 +58,14 @@ Using snapshot found at /path/to/project/_fresh
## Deploying an optimized Fresh project

To generate optimized assets whenever you push changes to the `main` branch of
your project, copy the following GitHub action and add it under
`.github/workflows/deploy.yml` in your project.

```yml .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
pull_request:
branches: main

jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest

permissions:
id-token: write # Needed for auth with Deno Deploy
contents: read # Needed to clone the repository

steps:
- name: Clone repository
uses: actions/checkout@v4

- name: Install Deno
uses: denoland/setup-deno@v1
with:
deno-version: v1.x

- name: Build step
run: "deno task build" # 📝 Update the build command(s) if necessary

- name: Upload to Deno Deploy
uses: denoland/deployctl@v1
with:
project: "example-project" # 📝 Update the deploy project name if necessary
entrypoint: "./main.ts" # 📝 Update the entrypoint if necessary
```
> [info]: The project name here must match the project name you've picked in
> Deno Deploy under<br/> `Settings -> Project Name`.

On the Deno Deploy side change the GitHub integration mode to GitHub Actions.
You need to unlink first, if you have an existing project that's linked with the
"Automatic" mode.

![Deno Deploy UI screenshot that shows the project dropdown and highlights the GitHub Action option](/docs/deno-deploy-gh-action.jpg)

Once this is set up you're ready for your next deployment. Whenever a new PR is
merged into the `main` branch on GitHub the deploy action will be executed and
deploy the optimized assets to Deno Deploy.
If you are deploying a Fresh project to Deno Deploy, you can use ahead-of-time
builds to optimize the assets before deploying them. This will make your
application load quicker.

> [info]: If the project is already linked in "Automatic" mode, unlink the
> repository first and re-link it again.
Open the Deno Deploy dashboard for your project and head to the "Git
Integration" section in the project settings. Enter `deno task build` in the
"Build command" field and save. This will switch your Deno Deploy project to use
ahead-of-time builds.

## Migrating existing projects with Plugins

Expand Down
12 changes: 7 additions & 5 deletions docs/latest/getting-started/deploy-to-production.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ the code needs to be pushed to a repository on GitHub. Once this has been done,
one must go to the [Deno Deploy dashboard][deno-deploy-dashboard] and create a
new project.

After creating the project, head to the "Git" tab in the project settings,
select the repository, the production branch (`main`) and the entrypoint file
(`main.ts`). This will link the project to the repository and automatically
deploy it to the internet. The project will now be available at
https://$PROJECT_NAME.deno.dev.
Click on the "New Project" button and select the GitHub repository that contains
the Fresh project. Select the "Fresh" framework preset, and click on "Advanced
options". Enter `deno task build` in the "Build command" field. Press "Create
project".

The project will now deploy to Deno Deploy. After this is done, the project will
be available at https://$PROJECT_NAME.deno.dev.

Every time the code in the GitHub repository is updated, it will be deployed
either as a preview or production deployment. Production deployments are only
Expand Down
7 changes: 0 additions & 7 deletions init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { basename, colors, join, parse, resolve } from "./src/dev/deps.ts";
import { error } from "./src/dev/error.ts";
import { collect, ensureMinDenoVersion, generate } from "./src/dev/mod.ts";
import {
AOT_GH_ACTION,
dotenvImports,
freshImports,
tailwindImports,
Expand Down Expand Up @@ -340,12 +339,6 @@ if (useTailwind) {
join(resolvedDirectory, "tailwind.config.ts"),
TAILWIND_CONFIG_TS,
);
const ghWorkflowDir = join(resolvedDirectory, ".github", "workflows");
await Deno.mkdir(ghWorkflowDir, { recursive: true });
await Deno.writeTextFile(
join(ghWorkflowDir, "deploy.yml"),
AOT_GH_ACTION,
);
}

const TWIND_CONFIG_TS = `import { defineConfig, Preset } from "@twind/core";
Expand Down
35 changes: 0 additions & 35 deletions src/dev/imports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,38 +37,3 @@ export function tailwindImports(imports: Record<string, string>) {
export function dotenvImports(imports: Record<string, string>) {
imports["$std/"] = `https://deno.land/std@${RECOMMENDED_STD_VERSION}/`;
}

export const AOT_GH_ACTION = `name: Deploy
on:
push:
branches: [main]
pull_request:
branches: main
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
permissions:
id-token: write # Needed for auth with Deno Deploy
contents: read # Needed to clone the repository
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Install Deno
uses: denoland/setup-deno@v1
with:
deno-version: v1.x
- name: Build step
run: "deno task build" # 📝 Update the build command(s) if necessary
- name: Upload to Deno Deploy
uses: denoland/deployctl@v1
with:
project: "example-project" # 📝 Update the deploy project name if necessary
entrypoint: "./main.ts" # 📝 Update the entrypoint if necessary
`;
53 changes: 3 additions & 50 deletions src/server/tailwind_aot_error_page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { AOT_GH_ACTION } from "../dev/imports.ts";

const LINK = "https://fresh.deno.dev/docs/concepts/ahead-of-time-builds";

export default function TailwindErrorPage() {
Expand All @@ -18,63 +16,18 @@ export default function TailwindErrorPage() {
<code>Settings</code> tab.
</li>
<li>
Set Git-Integration to <code>GitHub Action</code>.<br />
<i style="display: block; font-style: italic; color: gray;">
Unlink the repository first if it is already linked via{" "}
<code>Automatic</code> and re-link it again.
</i>
</li>
<li>
Add the file <code>.github/workflows/deploy.yml</code>{" "}
to your repository with the following contents:<br />
<span style="background: #f0f0f0;display: block; position: relative;">
<button
id="copy-gh-action"
style="position: absolute; top: .5rem; right: .5rem;z-index: 100"
>
copy code
</button>
<pre style="height: 200px; overflow: auto;padding: 1rem;"><code>{AOT_GH_ACTION}</code></pre>
</span>
</li>
<li>
Copy the project name under <code>Setting {">"} Project Name</code>
In the Git Integration section, enter <code>deno task build</code>
{" "}
and replace "example project" with your actual project name in{" "}
<code>.github/workflows/deploy.yml</code>.
in the <code>Build Command</code> input.
</li>
<li>
Commit the file you created and merge it into the <code>main</code>
{" "}
branch. This will trigger a new deployment and finish the setup.
Save the changes.
</li>
</ol>
<p>
See the detailed guide here: <a href={LINK}>{LINK}</a>.
</p>
</div>
<script
dangerouslySetInnerHTML={{
__html: `
const copyBtn = document.querySelector("#copy-gh-action");
if (copyBtn) {
let timeout;
const text = copyBtn.textContent;
copyBtn.addEventListener("click", async () => {
copyBtn.textContent = "copied!";
clearTimeout(timeout);
timeout = setTimeout(() => {
copyBtn.textContent = text
}, 2000);
const code = \`${AOT_GH_ACTION}\`;
await navigator.clipboard.writeText(code);
})
}
`,
}}
/>
</div>
);
}
1 change: 0 additions & 1 deletion tests/init_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ Deno.test({
"/.vscode/settings.json",
"/.vscode/extensions.json",
"/.gitignore",
"/.github/workflows/deploy.yml",
];

await t.step("check generated files", async () => {
Expand Down

0 comments on commit c624bd9

Please sign in to comment.