-
-
Notifications
You must be signed in to change notification settings - Fork 81
docs: how to create a GitHub Action #1196
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 24 commits
2655997
292f85d
a1af929
a96fa70
5997af6
294ccb4
e2bf8a1
92e0c1e
fbf7506
d4131c9
5fad64c
1348dd8
074cebe
cd5b380
cd9c50d
c904bd8
81e51b2
a57325c
c32deaf
5a5c515
0b54452
4307645
776153f
749e38c
b47e286
1dbdbbc
eddc441
ee50e37
655d93a
1459ac1
ce65189
4a86f79
ab1322b
4b6095e
6cc5b52
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,6 +24,7 @@ | |
"npmpackagejsonlintrc", | ||
"outro", | ||
"packagejson", | ||
"precommit", | ||
"quickstart", | ||
"tada", | ||
"tsup", | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -13,6 +13,110 @@ After you set up a repository, you can substitute in any tools you'd like. | |||||||||||||
|
||||||||||||||
If you think the tool would be broadly useful to most consumers of this template, feel free to [file a feature request](https://github.com/JoshuaKGoldberg/create-typescript-app/issues/new?assignees=&labels=type%3A+feature&projects=&template=03-feature.yml&title=%F0%9F%9A%80+Feature%3A+%3Cshort+description+of+the+feature%3E) to add it in. | ||||||||||||||
|
||||||||||||||
## How can I create a GitHub action? | ||||||||||||||
|
||||||||||||||
Yes! If you want to read the [GitHub Actions documentation](https://docs.github.com/en/actions/creating-actions) in detail. | ||||||||||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||
Here we'll outline the steps required to migrate a CTA app to a GitHub Action: | ||||||||||||||
|
||||||||||||||
1. The GitHub Actions does not cater for tabs well, so you will likely want to set your `README.md` to use spaces, not tabs. | ||||||||||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||
2. GitHub Actions store built output on a GitHub branch rather than in a published package on npm. | ||||||||||||||
As a consequence we should: | ||||||||||||||
|
||||||||||||||
- delete `.github/workflows/release.yml` and `.github/workflows/post-release.yml`. | ||||||||||||||
- update `.github/workflows/build.yml` to ensure `dist` is up to date: | ||||||||||||||
|
||||||||||||||
<details> | ||||||||||||||
<summary><code>.github/workflows/build.yml</code></summary> | ||||||||||||||
|
||||||||||||||
```yml | ||||||||||||||
jobs: | ||||||||||||||
build: | ||||||||||||||
runs-on: ubuntu-latest | ||||||||||||||
steps: | ||||||||||||||
- uses: actions/checkout@v4 | ||||||||||||||
- uses: ./.github/actions/prepare | ||||||||||||||
- run: pnpm build | ||||||||||||||
|
||||||||||||||
- name: Compare dist/index.js | ||||||||||||||
run: | | ||||||||||||||
if [ "$(git diff --ignore-space-at-eol --text dist/index.js | wc -l)" -gt "0" ]; then | ||||||||||||||
echo "Detected uncommitted changes after build." | ||||||||||||||
echo "You may need to run 'pnpm run build' locally and commit the changes." | ||||||||||||||
echo "" | ||||||||||||||
echo "See diff below:" | ||||||||||||||
echo "" | ||||||||||||||
git diff --ignore-space-at-eol --text dist/index.js | ||||||||||||||
echo "" | ||||||||||||||
# say this again in case the diff is long | ||||||||||||||
echo "You may need to run 'pnpm run build' locally and commit the changes." | ||||||||||||||
echo "" | ||||||||||||||
exit 1 | ||||||||||||||
fi | ||||||||||||||
|
||||||||||||||
- id: upload | ||||||||||||||
if: ${{ failure() && steps.diff.outcome == 'failure' }} | ||||||||||||||
name: Upload artifact | ||||||||||||||
uses: actions/upload-artifact@v4 | ||||||||||||||
with: | ||||||||||||||
name: dist | ||||||||||||||
path: dist/ | ||||||||||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||
|
||||||||||||||
name: Build | ||||||||||||||
|
||||||||||||||
on: | ||||||||||||||
pull_request: ~ | ||||||||||||||
push: | ||||||||||||||
branches: | ||||||||||||||
- main | ||||||||||||||
|
||||||||||||||
permissions: | ||||||||||||||
contents: read | ||||||||||||||
``` | ||||||||||||||
|
||||||||||||||
</details> | ||||||||||||||
|
||||||||||||||
- GitHub Actions have a different build mechanism. | ||||||||||||||
So you'll be removing `tsup` in favour of [`ncc`](https://github.com/vercel/ncc) which compiles output into a single JS file. | ||||||||||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||
Delete `tsup.config.ts` then execute the following commands: | ||||||||||||||
|
||||||||||||||
```bash | ||||||||||||||
pnpm remove tsup | ||||||||||||||
pnpm add @vercel/ncc -D | ||||||||||||||
pnpm add @actions/core -P | ||||||||||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||
``` | ||||||||||||||
|
||||||||||||||
- We also added the [`@actions/core`](https://github.com/actions/toolkit/tree/master/packages/core) package, used for building GitHub Actions. | ||||||||||||||
Now we need to update the `build` script in our `package.json`: | ||||||||||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||
|
||||||||||||||
```diff | ||||||||||||||
-"build": "tsup", | ||||||||||||||
+"build": "ncc build src/index.ts -o dist --license licenses.txt", | ||||||||||||||
``` | ||||||||||||||
|
||||||||||||||
- Our build now emits to the `dist` directory; so we'll want to avoid linting that directory by adding the following to `.eslintignore` and our `.prettierignore`: | ||||||||||||||
|
||||||||||||||
```diff | ||||||||||||||
+dist | ||||||||||||||
``` | ||||||||||||||
|
||||||||||||||
- Rather than having to remember to compile each time, we'll update our precommit hook in `.husky/precommit` to build for us on each commit: | ||||||||||||||
|
||||||||||||||
```diff | ||||||||||||||
+pnpm run build | ||||||||||||||
+git add dist | ||||||||||||||
npx lint-staged | ||||||||||||||
``` | ||||||||||||||
|
||||||||||||||
3. We're going to need an [`action.yml`](https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions) file - [here's an example](https://docs.github.com/en/actions/creating-actions/creating-a-javascript-action#creating-an-action-metadata-file). | ||||||||||||||
JoshuaKGoldberg marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||
4. Our GitHub Action needs Node.js 20 so we'll update `.github/actions/prepare/action.yml`: | ||||||||||||||
|
||||||||||||||
```diff | ||||||||||||||
-node-version: "18" | ||||||||||||||
+node-version: "20" | ||||||||||||||
``` | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [Question] Is Node.js 20 needed? My actions have been running on 18 just fine.
Suggested change
Also filed #1204 to bump to 20 for everyone. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah I think it is - or at least I read it was There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||
|
||||||||||||||
It's worth reading the [GitHub Actions documentation](https://docs.github.com/en/actions/creating-actions/creating-a-javascript-action#writing-the-action-code). | ||||||||||||||
|
||||||||||||||
## How can I add dual CommonJS / ECMAScript Modules emit? | ||||||||||||||
|
||||||||||||||
First, I'd suggest reading [TypeScript Handbook > Modules - Introduction](https://www.typescriptlang.org/docs/handbook/modules/introduction.html) to understand how CommonJS (CJS) and ECMAScript (ESM) came to be. | ||||||||||||||
|
Uh oh!
There was an error while loading. Please reload this page.