runs-using-deno v1.2.2
Deno runtime for GitHub Actions
š¦ Write your GitHub Actions in Deno
import * as core from "npm:@actions/core@^1.10.1";
import * as github from "npm:@actions/github@^6.0.0";
console.log("github.context.payload", github.context.payload);
console.log(`Hello ${core.getInput("name")}!`);
core.setOutput("time", new Date().toLocaleTimeString());
ā Lets you write your GitHub Actions using TypeScript \
š Supports node_modules
-less development \
š¦ Uses the Deno runtime for your GitHub Action \
šØāš» Extremely hackish, but it works!
Installation
š Looking for a premade template? Check out jcbhmr/hello-world-deno-action!
Create _main.mjs
(or some other .mjs
file with main
in it) and add this
JavaScript code to it:
// _main.mjs
// https://github.com/jcbhmr/runs-using-deno
const response = await fetch("https://unpkg.com/runs-using-deno@1.2.2");
const buffer = Buffer.from(await response.arrayBuffer());
await import(`data:text/javascript;base64,${buffer.toString("base64")}`);
š Make sure you keep that pinned version up to date! š
wget https://unpkg.com/runs-using-deno -O _main.mjs
ā ļø The latest version of Deno will still be downloaded dynamically.
ā¹ This tool sniffs the (main|pre|post)
name from the process.argv[1]
file
(the entry point) so make sure you name your main: main.mjs
something like
_main.mjs
or .main.mjs
. It's recommended to use the .mjs
extension so that
the script is interpreted as ESM even when no Node.js package.json
type: "module"
is present.
Usage
To use this wrapper, add the following to your action.yml
:
# action.yml
runs:
using: node20
main: _main.mjs
runs-using-deno:
using: deno1
main: main.ts
š” Deno will auto-detect a deno.json
Deno configuration file if it's near
your main.ts
Deno script. You can use this to provide an import map inside the
deno.json
to make importing the same libraries across multiple files easier.
// deno.json
{
"imports": {
"@actions/core": "npm:@actions/core@^1.10.1",
"@actions/github": "npm:@actions/github@^6.0.0"
}
}
// main.ts
import * as core from "@actions/core";
import * as github from "@actions/github";
pre-if
and post-if
To get the native pre-if
and post-if
behaviour, you must specify these
keys on the native runs
YAML map instead of the custom runs-using-deno
YAML
map.
# action.yml
runs:
using: node20
main: _main.mjs
pre: _pre.mjs
post: _post.mjs
pre-if: runner.os == 'Linux'
post-if: runner.os == 'Windows'
runs-using-deno:
using: deno1
main: main.ts
pre: pre.ts
post: post.ts
You'll need to create _pre.mjs
and _post.mjs
files as separate entry points.
All of these should import the same https://unpkg.com/runs-using-deno@1
module
which will sniff the (main|pre|post)
from the entry point file name and choose
the right runs-using-deno
-defined stage to run from there. Check out the
test/
folder for a demo of an action using _main.mjs
, _pre.mjs
, and
_post.mjs
.
How it works
This is a wrapper Node.js script that downloads, installs, and caches the latest
Deno version. Then, using the fields from action.yml
, it executes Deno with
the main: main.ts
script as a subprocess. You automagically inherit all the
environment variables, working directory, GitHub context, and more. It's pretty
seamless! You can even use the @actions/core and other packages to interact as
you would in Node.js. To learn more about how the Deno runtime works, check out
the Deno manual.
Development
There's not really a good local test loop. The best way to test the code is to
run the test/action.yml
in GitHub Actions on each push or Pull Request. To
test your changes, just push to the main
branch or open a Pull Request (even a
Draft one). š