-
-
Notifications
You must be signed in to change notification settings - Fork 82
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
Merged
Merged
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit
Hold shift + click to select a range
2655997
docs: how to create a GitHub Action
johnnyreilly 292f85d
chore: add precommit
johnnyreilly a1af929
chore: formatting
johnnyreilly a96fa70
chore: markdown
johnnyreilly 5997af6
chore: markdown
johnnyreilly 294ccb4
chore: snapshot
johnnyreilly e2bf8a1
Merge branch 'main' of https://github.com/JoshuaKGoldberg/create-type…
johnnyreilly 92e0c1e
Update docs/FAQs.md
johnnyreilly fbf7506
Update docs/FAQs.md
johnnyreilly d4131c9
Update docs/FAQs.md
johnnyreilly 5fad64c
Update docs/FAQs.md
johnnyreilly 1348dd8
Update docs/FAQs.md
johnnyreilly 074cebe
Update docs/FAQs.md
johnnyreilly cd5b380
Update docs/FAQs.md
johnnyreilly cd9c50d
Update docs/FAQs.md
johnnyreilly c904bd8
fix: order
johnnyreilly 81e51b2
fix: order
johnnyreilly a57325c
Merge branch 'main' into docs-github-action
johnnyreilly c32deaf
feat: fold into build
johnnyreilly 5a5c515
Merge branch 'main' into docs-github-action
johnnyreilly 0b54452
fix: path
johnnyreilly 4307645
Merge branch 'main' into docs-github-action
johnnyreilly 776153f
Merge branch 'main' into docs-github-action
johnnyreilly 749e38c
Merge branch 'main' into docs-github-action
johnnyreilly b47e286
fix: remove tabs / spaces
johnnyreilly 1dbdbbc
fix: lint
johnnyreilly eddc441
fix: lint
johnnyreilly ee50e37
Update docs/FAQs.md
johnnyreilly 655d93a
Update docs/FAQs.md
johnnyreilly 1459ac1
Update docs/FAQs.md
johnnyreilly ce65189
Update docs/FAQs.md
johnnyreilly 4a86f79
Update docs/FAQs.md
johnnyreilly ab1322b
Update docs/FAQs.md
johnnyreilly 4b6095e
fix: prettier
johnnyreilly 6cc5b52
Update docs/FAQs.md
JoshuaKGoldberg File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -13,6 +13,108 @@ 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. | ||||||
|
||||||
## Can I create a GitHub action with CTA? | ||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
Yes! If you want to read in detail about GitHub Actions [try this](https://docs.github.com/en/actions/creating-actions). 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. | ||||||
2. GitHub Actions are _not_ like packages published to npm. The output is expected to live in the `dist` folder of a GitHub repo. As a consequence we should: | ||||||
- delete `.github/workflows/release.yml` and `.github/workflows/post-release.yml`. | ||||||
- update `.github/workflows/build.yml` | ||||||
```diff | ||||||
- - run: node ./lib/index.js | ||||||
``` | ||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
- 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. So delete `tsup.config.ts` then: | ||||||
```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`: | ||||||
```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 | ||||||
``` | ||||||
- on the off chance someone isn't running husky, we'll add `.github/workflows/check-dist.yml` ([based on this](https://github.com/actions/typescript-action/blob/main/.github/workflows/check-dist.yml)) to ensure `dist` is up to date: | ||||||
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. [Proofreading] For consistency...
Suggested change
|
||||||
```yml | ||||||
JoshuaKGoldberg marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
# In TypeScript actions, `dist/` is a special directory. When you reference | ||||||
# an action with the `uses:` property, `dist/index.js` is the code that will be | ||||||
# run. For this project, the `dist/index.js` file is transpiled from other | ||||||
# source files. This workflow ensures the `dist/index.js` file contains the | ||||||
# expected transpiled code. | ||||||
# | ||||||
# If this workflow is run from a feature branch, it will act as an additional CI | ||||||
# check and fail if the checked-in `dist/` directory does not match what is | ||||||
# expected from the build. | ||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
name: Check transpiled index.js in dist is up to date | ||||||
|
||||||
on: | ||||||
push: | ||||||
branches: | ||||||
- main | ||||||
pull_request: | ||||||
|
||||||
permissions: | ||||||
contents: read | ||||||
|
||||||
jobs: | ||||||
check-dist: | ||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
name: check dist | ||||||
runs-on: ubuntu-latest | ||||||
|
||||||
steps: | ||||||
- uses: actions/checkout@v4 | ||||||
- uses: ./.github/actions/prepare | ||||||
|
||||||
- name: Build dist directory | ||||||
id: build | ||||||
run: pnpm run build | ||||||
|
||||||
# This will fail the workflow if the PR wasn't created by Dependabot. | ||||||
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.
This template uses Renovate. But also I don't see why they're relevant? |
||||||
- name: Compare directories | ||||||
id: diff | ||||||
run: | | ||||||
if [ "$(git diff --ignore-space-at-eol --text dist/index.js | wc -l)" -gt "0" ]; then | ||||||
johnnyreilly marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
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 | ||||||
|
||||||
# If `dist/` was different than expected, and this was not a Dependabot | ||||||
# PR, upload the expected version as a workflow artifact. | ||||||
- if: ${{ failure() && steps.diff.outcome == 'failure' }} | ||||||
name: Upload artifact | ||||||
id: upload | ||||||
uses: actions/upload-artifact@v4 | ||||||
with: | ||||||
name: dist | ||||||
path: dist/ | ||||||
``` | ||||||
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" | ||||||
``` | ||||||
5. Change the code in your `src` directory to be a GitHub Action. It's worth reading the official documentation [for an example](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. | ||||||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.