Compare commits

...

61 Commits

Author SHA1 Message Date
dependabot[bot] 940247d08e ci: bump codecov/codecov-action from 6.0.1 to 7.0.0 (#707)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-08 13:21:59 +09:00
dependabot[bot] d17f2aa363 ci: bump github/codeql-action from 4.36.1 to 4.36.2 (#706)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-05 11:36:29 +09:00
dependabot[bot] c4a9c2db41 ci: bump github/codeql-action from 4.36.0 to 4.36.1 (#704)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-04 11:04:50 +09:00
dependabot[bot] 89ca553e6c ci: bump actions/checkout from 6.0.2 to 6.0.3 (#705)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-04 11:04:39 +09:00
dependabot[bot] 18deeac04c ci: bump github/codeql-action from 4.35.5 to 4.36.0 (#703)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-25 14:12:29 +09:00
dependabot[bot] 7845c37f7f ci: bump codecov/codecov-action from 6.0.0 to 6.0.1 (#702)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-19 22:14:18 +09:00
dependabot[bot] 8d04cd0510 ci: bump github/codeql-action from 4.35.4 to 4.35.5 (#701)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-18 11:59:53 +09:00
dependabot[bot] 9c46f58a58 ci: bump actions/dependency-review-action from 4.9.0 to 5.0.0 (#698)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 13:35:16 +09:00
dependabot[bot] 1f043ee545 ci: bump peaceiris/actions-hugo from 3.1.0 to 3.2.1 (#699)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 13:35:05 +09:00
dependabot[bot] 412dd9124a ci: bump codecov/codecov-action from 5.5.4 to 6.0.0 (#700)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 13:34:52 +09:00
peaceiris 4a3d6e00a5 chore(release): Remove build assets [skip ci] 2026-05-11 01:05:34 +09:00
peaceiris 2752ce1d29 chore(release): 3.2.1 2026-05-11 01:05:33 +09:00
peaceiris d8391e68b0 chore(release): Add build assets 2026-05-11 01:05:32 +09:00
Shohei Ueda 4e5bf412f0 fix: handle Hugo 0.139.5 archive fallback (#696)
Co-authored-by: Codex <noreply@openai.com>
2026-05-11 01:05:09 +09:00
peaceiris c2f9fa4376 chore(release): Remove build assets [skip ci] 2026-05-11 00:27:27 +09:00
peaceiris cf03c8dbc2 chore(release): 3.2.0 2026-05-11 00:27:26 +09:00
peaceiris 50c0903488 chore(release): Add build assets 2026-05-11 00:27:24 +09:00
dependabot[bot] 681f914d18 ci: bump github/codeql-action from 3.35.4 to 4.35.4 (#694)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 00:25:15 +09:00
dependabot[bot] 7c673b8b9e ci: bump peaceiris/actions-hugo from 3.0.0 to 3.1.0 (#693)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 00:25:06 +09:00
dependabot[bot] 27f9d4ab07 ci: bump actions/upload-artifact from 4.6.2 to 7.0.1 (#692)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 00:24:57 +09:00
dependabot[bot] 71c032c9dc ci: bump actions/checkout from 4.3.1 to 6.0.2 (#691)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 00:24:45 +09:00
dependabot[bot] 66080d4abb ci: bump actions/setup-node from 4.4.0 to 6.4.0 (#690)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from
4.4.0 to 6.4.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/setup-node/releases">actions/setup-node's
releases</a>.</em></p>
<blockquote>
<h2>v6.4.0</h2>
<h2>What's Changed</h2>
<h3>Dependency updates:</h3>
<ul>
<li>Upgrade <a
href="https://github.com/actions"><code>@​actions</code></a>
dependencies by <a
href="https://github.com/Copilot"><code>@​Copilot</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1525">actions/setup-node#1525</a></li>
<li>Update Node.js versions in versions.yml and bump package to v6.4.0
by <a
href="https://github.com/priya-kinthali"><code>@​priya-kinthali</code></a>
in <a
href="https://redirect.github.com/actions/setup-node/pull/1533">actions/setup-node#1533</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Copilot"><code>@​Copilot</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1525">actions/setup-node#1525</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/setup-node/compare/v6...v6.4.0">https://github.com/actions/setup-node/compare/v6...v6.4.0</a></p>
<h2>v6.3.0</h2>
<h2>What's Changed</h2>
<h3>Enhancements:</h3>
<ul>
<li>Support parsing <code>devEngines</code> field by <a
href="https://github.com/susnux"><code>@​susnux</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1283">actions/setup-node#1283</a></li>
</ul>
<blockquote>
<p>When using node-version-file: package.json, setup-node now
prefers devEngines.runtime over engines.node.</p>
</blockquote>
<h3>Dependency updates:</h3>
<ul>
<li>Fix npm audit issues by <a
href="https://github.com/gowridurgad"><code>@​gowridurgad</code></a> in
<a
href="https://redirect.github.com/actions/setup-node/pull/1491">actions/setup-node#1491</a></li>
<li>Replace uuid with crypto.randomUUID() by <a
href="https://github.com/trivikr"><code>@​trivikr</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1378">actions/setup-node#1378</a></li>
<li>Upgrade minimatch from 3.1.2 to 3.1.5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1498">actions/setup-node#1498</a></li>
</ul>
<h3>Bug fixes:</h3>
<ul>
<li>Remove hardcoded bearer for mirror-url <a
href="https://github.com/marco-ippolito"><code>@​marco-ippolito</code></a>
in <a
href="https://redirect.github.com/actions/setup-node/pull/1467">actions/setup-node#1467</a></li>
<li>Scope test lockfiles by package manager and update cache tests by <a
href="https://github.com/gowridurgad"><code>@​gowridurgad</code></a> in
<a
href="https://redirect.github.com/actions/setup-node/pull/1495">actions/setup-node#1495</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/susnux"><code>@​susnux</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1283">actions/setup-node#1283</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/setup-node/compare/v6...v6.3.0">https://github.com/actions/setup-node/compare/v6...v6.3.0</a></p>
<h2>v6.2.0</h2>
<h2>What's Changed</h2>
<h3>Documentation</h3>
<ul>
<li>Documentation update related to absence of Lockfile by <a
href="https://github.com/mahabaleshwars"><code>@​mahabaleshwars</code></a>
in <a
href="https://redirect.github.com/actions/setup-node/pull/1454">actions/setup-node#1454</a></li>
<li>Correct mirror option typos by <a
href="https://github.com/MikeMcC399"><code>@​MikeMcC399</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1442">actions/setup-node#1442</a></li>
<li>Readme update on checkout version v6 by <a
href="https://github.com/deining"><code>@​deining</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1446">actions/setup-node#1446</a></li>
<li>Readme typo fixes <a
href="https://github.com/munyari"><code>@​munyari</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1226">actions/setup-node#1226</a></li>
<li>Advanced document update on checkout version v6 by <a
href="https://github.com/aparnajyothi-y"><code>@​aparnajyothi-y</code></a>
in <a
href="https://redirect.github.com/actions/setup-node/pull/1468">actions/setup-node#1468</a></li>
</ul>
<h3>Dependency updates:</h3>
<ul>
<li>Upgrade <code>@​actions/cache</code> to v5.0.1 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1449">actions/setup-node#1449</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/mahabaleshwars"><code>@​mahabaleshwars</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1454">actions/setup-node#1454</a></li>
<li><a
href="https://github.com/MikeMcC399"><code>@​MikeMcC399</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1442">actions/setup-node#1442</a></li>
<li><a href="https://github.com/deining"><code>@​deining</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1446">actions/setup-node#1446</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/setup-node/commit/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"><code>48b55a0</code></a>
Update Node.js versions in versions.yml and bump package to v6.4.0 (<a
href="https://redirect.github.com/actions/setup-node/issues/1533">#1533</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/ab72c7e7eba0eaa11f8cab0f5679243900c2cac9"><code>ab72c7e</code></a>
Upgrade <a href="https://github.com/actions"><code>@​actions</code></a>
dependencies (<a
href="https://redirect.github.com/actions/setup-node/issues/1525">#1525</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/53b83947a5a98c8d113130e565377fae1a50d02f"><code>53b8394</code></a>
Bump minimatch from 3.1.2 to 3.1.5 (<a
href="https://redirect.github.com/actions/setup-node/issues/1498">#1498</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/54045abd5dcd3b0fee9ca02fa24c57545834c9cc"><code>54045ab</code></a>
Scope test lockfiles by package manager and update cache tests (<a
href="https://redirect.github.com/actions/setup-node/issues/1495">#1495</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/c882bffdbd4df51ace6b940023952e8669c9932a"><code>c882bff</code></a>
Replace uuid with crypto.randomUUID() (<a
href="https://redirect.github.com/actions/setup-node/issues/1378">#1378</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/774c1d62961e73038a114d59c8847023c003194d"><code>774c1d6</code></a>
feat(node-version-file): support parsing <code>devEngines</code> field
(<a
href="https://redirect.github.com/actions/setup-node/issues/1283">#1283</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/efcb663fc60e97218a2b2d6d827f7830f164739e"><code>efcb663</code></a>
fix: remove hardcoded bearer (<a
href="https://redirect.github.com/actions/setup-node/issues/1467">#1467</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/d02c89dce7e1ba9ef629ce0680989b3a1cc72edb"><code>d02c89d</code></a>
Fix npm audit issues (<a
href="https://redirect.github.com/actions/setup-node/issues/1491">#1491</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/6044e13b5dc448c55e2357c09f80417699197238"><code>6044e13</code></a>
Docs: bump actions/checkout from v5 to v6 (<a
href="https://redirect.github.com/actions/setup-node/issues/1468">#1468</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/8e494633d082d609d1e9ff931be32f8a44f1f657"><code>8e49463</code></a>
Fix README typo (<a
href="https://redirect.github.com/actions/setup-node/issues/1226">#1226</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/actions/setup-node/compare/49933ea5288caeca8642d1e84afbd3f7d6820020...48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-node&package-manager=github_actions&previous-version=4.4.0&new-version=6.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 00:24:17 +09:00
Shohei Ueda b1937e141c fix: Hugo package naming fix (#688)
## Summary

Rebases the Hugo package naming fix from #609 on top of the current
`main` branch, including the installer flow added in #687.

- Derive Hugo release asset OS and architecture naming conventions from
the requested Hugo version.
- Apply those conventions when selecting OS and architecture segments,
including the 0.102.x macOS universal boundary, 0.103+ downcased OS
names, Windows zip assets, and Linux ARM assets.
- Add table-driven tests for pre-0.102, 0.102.x, and 0.103+ naming
behavior, plus URL coverage for the corrected release asset names.

## Changes

- Add `getConventions` to centralize version-based release asset naming
decisions.
- Update `getOS` and `getArch` to use convention flags for macOS,
lower-case OS names, standardized architecture names, and the Windows
ARM support boundary.
- Update `getURL` to generate candidate URLs for downcased Windows and
Linux assets, and for darwin universal archives.
- Wire convention detection into `installer` before generating candidate
Hugo release asset URLs.
- Expand unit coverage for OS, architecture, convention, and URL
behavior.

## Checklist

- [x] I have read the latest README and followed the instructions.
- [x] I have added or updated tests for behavior changes.
- [x] README.md and action.yml updates are not needed because inputs and
action metadata are unchanged.
- [x] I have run the relevant verification commands.

## References

- Rebased follow-up for
https://github.com/peaceiris/actions-hugo/pull/609
- References https://github.com/peaceiris/actions-hugo/issues/605 and
https://github.com/peaceiris/actions-hugo/issues/608
- Based on `main` after
https://github.com/peaceiris/actions-hugo/pull/687

## Verification

- [x] `RUNNER_TEMP=/private/tmp npm run all`
- [ ] `npm run build` was not run because this branch does not update
bundled output and current `main` removed `lib/index.js`.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Version-aware conventions control OS and architecture naming,
including macOS universal asset support and expanded darwin/macOS
patterns.

* **Refactor**
* Conventions centralized and applied across installer and URL
generation; OS/arch inputs accept varied casing and naming variants.

* **Tests**
* Expanded, data-driven parameterized tests for conventions, OS/arch
mappings, URL variants, and error cases.
* Replaced network stubs with deterministic fetch-mock helpers for test
isolation.

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/peaceiris/actions-hugo/pull/688)
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Michael T Lombardi <michael.t.lombardi@gmail.com>
Co-authored-by: codefactor-io <support@codefactor.io>
Co-authored-by: Codex <noreply@openai.com>
2026-05-11 00:23:26 +09:00
Shohei Ueda 189731ef00 build: update npm dependencies (#689)
## Summary

Update all direct npm dependencies and devDependencies to the current
npm latest versions and pin them exactly instead of using caret or tilde
ranges.

## Changes

- Pin all direct runtime and development package versions in
`package.json` and refresh `package-lock.json`.
- Migrate ESLint from `.eslintrc.json` to flat config for ESLint 10.
- Update Jest and TypeScript configuration and test mocks to support the
latest ESM-only packages.
- Add response status handling and typed JSON access for the latest
`node-fetch` types.

## Checklist

- [x] I have read the latest README and followed the instructions.
- [x] I have added or updated tests for behavior changes.
- [x] I have updated README.md and action.yml when inputs or runtime
behavior changed.
- [x] I have run the relevant verification commands.

## Verification

- [x] `npm --userconfig=/private/tmp/empty-npmrc outdated --json
--include=dev` returned `{}`
- [x] `npm run all`
- [x] `npm run build`


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Tests**
* Added comprehensive test mocks for Actions APIs and fetch, improved
integration tests, and updated assertions for more precise error
validation.
  * Configured Jest to map external modules to local test mocks.

* **Chores**
* Migrated ESLint to the flat config format and replaced prior ESLint
config.
* Updated project dependencies and modernized TypeScript compiler
settings.

* **Refactor**
* Adjusted exported tool constants and made error handling more explicit
in version-fetching logic.

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/peaceiris/actions-hugo/pull/689)
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Codex <noreply@openai.com>
2026-05-10 23:30:59 +09:00
peaceiris e3c35ac635 docs: document build artifact constraint
Co-Authored-By: Codex <noreply@openai.com>
2026-05-10 22:45:44 +09:00
peaceiris 8a69ba55a5 chore: delete lib/index.js 2026-05-10 22:42:05 +09:00
Shohei Ueda 187a5efe81 feat: support renamed Hugo release assets (#687)
## Summary
- Support multiple Hugo release asset names for Linux, macOS, and
Windows so renamed upstream assets no longer fail with a plain 404.
- Preserve compatibility with legacy Hugo assets that used filename
forms such as `hugo_v0.20.3_*`, macOS `.zip` archives, and
`Linux_ARM`-style names.
- Add retry handling for missing candidate assets and macOS `.pkg`
extraction via `pkgutil --expand-full`, with focused URL and installer
tests plus the rebuilt `lib/index.js` bundle.

## References
- Fixes https://github.com/peaceiris/actions-hugo/issues/652
- `hugo-version: latest` still resolves through Homebrew; this change
does not fall back to an older Hugo version when the resolved release
has no compatible asset.
- Review note: `lib/index.js` is generated by `npm run build` and
contains bundled dependency code.

## Test plan
- [x] `RUNNER_TEMP=/tmp npm run all`
- [x] `npm run build`


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Tests**
* Broadened test coverage for asset URL generation, download retry
behavior, and extraction across OSes and architectures.

* **Bug Fixes**
* More resilient installer with multiple candidate download URLs and
retry handling for transient failures.
* Improved extraction logic to correctly handle platform- and
format-specific archives.

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/peaceiris/actions-hugo/pull/687)
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Codex <noreply@openai.com>
2026-05-10 22:40:55 +09:00
peaceiris d488e4d987 docs: add pull request template
Co-Authored-By: Codex <noreply@openai.com>
2026-05-10 21:44:58 +09:00
peaceiris 20e81489be chore(release): Remove build assets [skip ci] 2026-05-10 18:43:22 +09:00
peaceiris 32c7754570 chore(release): 3.1.0 2026-05-10 18:43:21 +09:00
peaceiris 62903c46a1 chore(release): Add build assets 2026-05-10 18:43:19 +09:00
Shohei Ueda 64e0f66acb ci: harden workflows and update Node.js (#686) 2026-05-10 18:21:41 +09:00
peaceiris fd1a667089 chore: add .codex/ 2026-05-10 01:23:17 +09:00
peaceiris ba5146cb8a docs: add contributor guidelines
Co-Authored-By: Codex <codex@openai.com>
2026-05-10 00:35:35 +09:00
Paul Keen 83259d800c feat: upgrade action runtime from Node 20 to 24 (#684) 2026-05-02 23:18:58 +09:00
dependabot[bot] 3a287949d3 ci: bump codecov/codecov-action from 4 to 5 (#660)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-15 11:27:10 +09:00
dependabot[bot] 3b443076f0 ci: bump peaceiris/actions-hugo from 2.6.0 to 3.0.0 (#653)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-05 12:39:54 +09:00
dependabot[bot] 764796d276 ci: bump actions/upload-artifact from 3 to 4 (#654)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-05 12:39:40 +09:00
dependabot[bot] e177dc33cb ci: bump codecov/codecov-action from 3 to 4 (#655)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-05 12:39:29 +09:00
dependabot[bot] 711df4ed64 ci: bump actions/dependency-review-action from 3 to 4 (#656)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-05 12:39:13 +09:00
dependabot[bot] 9d57878417 ci: bump github/codeql-action from 2 to 3 (#657)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-05 11:57:05 +09:00
Zer0xxxx 288264f9c9 docs: add env.HUGO_CACHEDIR (#650) 2024-06-19 17:09:50 +09:00
Shohei Ueda 7db63f5e7f docs: bump actions/cache to v4 2024-04-17 13:52:48 +09:00
Linda_pp 00e5abe1c8 fix(doc): Update @v2 to @v3 in README.md (#649) 2024-04-07 03:09:58 +09:00
peaceiris 1b06a03d21 chore(release): Remove build assets [skip ci] 2024-04-02 12:17:51 +09:00
peaceiris 75d2e84710 chore(release): 3.0.0 2024-04-02 12:17:50 +09:00
peaceiris e482f7ce0f chore(release): Add build assets 2024-04-02 12:17:49 +09:00
peaceiris d85452eadf chore: revert version 2024-04-02 12:16:58 +09:00
peaceiris 01bd2b16cc build: node 20.11.1 2024-04-02 09:33:47 +09:00
peaceiris 966dfad385 chore: npm audit fix 2024-02-06 23:49:51 +09:00
Rui Chen c57490a8b0 feat: bump to use node20 runtime (#641) 2024-02-06 23:47:20 +09:00
Andreas Deininger aadc3a98df ci: bump checkout to v4 (#639) 2023-10-05 09:17:20 +09:00
Andreas Deininger c0084b0763 docs: update cache usage (#636) 2023-09-12 00:08:23 +09:00
Henry Mai 31c46541ce docs: remove braces (#634)
https://docs.github.com/en/actions/using-jobs/using-conditions-to-control-job-execution#overview
2023-06-10 19:53:43 +09:00
Shohei Ueda 3d92e2fd55 docs: replace set-output with GITHUB_OUTPUT
close https://github.com/peaceiris/actions-hugo/issues/633
2023-05-05 23:18:27 +09:00
Andreas Deininger 7c4b9f1f99 docs: bump ruby version to 3.2 (#629) 2023-02-22 16:07:48 +09:00
Andreas Deininger 7652d53369 docs: bump versions (#628) 2023-02-21 23:46:45 +09:00
dependabot[bot] 3fa8fd6cee ci: bump actions/setup-node from 3.5.1 to 3.6.0 (#625)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-06 18:59:08 +09:00
dependabot[bot] 844f8735f6 ci: bump actions/dependency-review-action from 2 to 3 (#622)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-14 12:02:46 +09:00
dependabot[bot] b1822b6abe ci: bump peaceiris/actions-hugo from 2.5.0 to 2.6.0 (#621)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-24 11:25:57 +09:00
peaceiris 4910870eaa chore(release): Remove build assets [skip ci] 2022-10-24 00:28:24 +09:00
44 changed files with 8915 additions and 23057 deletions
-24
View File
@@ -1,24 +0,0 @@
{
"env": {
"commonjs": true,
"es6": true,
"node": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended",
"plugin:jest/recommended"
],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 2019
},
"rules": {
}
}
+23
View File
@@ -0,0 +1,23 @@
## Summary
<!-- Describe what this pull request changes and why. -->
## Changes
<!-- List the notable changes. -->
-
## Checklist
- [ ] I have read the latest README and followed the instructions.
- [ ] I have added or updated tests for behavior changes.
- [ ] I have updated README.md and action.yml when inputs or runtime behavior changed.
- [ ] I have run the relevant verification commands.
## Verification
<!-- List the commands you ran and their results. -->
- [ ] `npm run all`
- [ ] `npm run build`
+9 -5
View File
@@ -8,17 +8,21 @@ on:
jobs:
CodeQL-Build:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 20
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
with:
languages: javascript
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
+4 -3
View File
@@ -10,7 +10,8 @@ permissions:
jobs:
dependency-review:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- uses: actions/checkout@v3
- uses: actions/dependency-review-action@v2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
+5 -2
View File
@@ -23,9 +23,12 @@ on:
jobs:
dev-image-test:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 20
permissions:
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- run: make build
- run: make cirun cmd="npm ci"
# - run: make ciall
+7 -3
View File
@@ -12,14 +12,18 @@ on:
jobs:
comment:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
contents: read
issues: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
ref: main
- name: Label Commenter
uses: peaceiris/actions-label-commenter@v1.10.0
uses: peaceiris/actions-label-commenter@f0dbbef043eb1b150b566db36b0bdc8b7f505579 # v1.10.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# config_file: .github/label-commenter-config.yml
@@ -6,11 +6,12 @@ on:
jobs:
purge:
runs-on: ubuntu-22.04
runs-on: ubuntu-slim
timeout-minutes: 5
permissions: {}
steps:
- run: >
curl -sL https://github.com/${GITHUB_REPOSITORY} |
grep -oE '<img src="https?://camo.githubusercontent.com/[^"]+' |
sed -e 's/<img src="//' |
xargs -I % curl -sX PURGE %
- run: |
curl -sL "https://github.com/${GITHUB_REPOSITORY}" |
grep -oE '<img src="https?://camo.githubusercontent.com/[^"]+' |
sed -e 's/<img src="//' |
xargs -r -I % curl -sX PURGE %
+5 -2
View File
@@ -7,9 +7,12 @@ on:
jobs:
release:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 10
permissions:
contents: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Dump GitHub context
env:
+14 -24
View File
@@ -1,39 +1,29 @@
name: Daily Test
name: Test Action
on:
schedule:
- cron: '13 13 * * *'
push:
branches: [main, feat/node24]
pull_request:
workflow_dispatch:
jobs:
test:
runs-on: ${{ matrix.os }}
runs-on: ubuntu-24.04
timeout-minutes: 10
permissions:
contents: read
strategy:
matrix:
os:
- 'ubuntu-22.04'
- 'ubuntu-20.04'
- 'ubuntu-latest'
- 'macos-latest'
- 'windows-latest'
hugo-version:
- 'latest'
- '0.61.0'
extended:
- true
- false
hugo-version: ['latest', '0.160.1']
extended: [true, false]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2.5.0
uses: peaceiris/actions-hugo@2752ce1d29631191ea3f27c23495fa06139a5b78 # v3.2.1
with:
hugo-version: ${{ matrix.hugo-version }}
extended: ${{ matrix.extended }}
- name: Run hugo version
run: echo "::set-output name=hugo_version::$(hugo version)"
id: hugo_version
- name: '${{ steps.hugo_version.outputs.hugo_version }}'
run: echo '${{ steps.hugo_version.outputs.hugo_version }}'
- name: Verify Hugo
run: hugo version
+14 -16
View File
@@ -13,46 +13,44 @@ on:
jobs:
test:
runs-on: ${{ matrix.os }}
timeout-minutes: 20
permissions:
contents: read
strategy:
fail-fast: false
matrix:
os:
- 'ubuntu-22.04'
- 'ubuntu-20.04'
- 'ubuntu-latest'
- 'ubuntu-24.04'
- 'macos-latest'
- 'windows-latest'
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Read .nvmrc
run: echo "::set-output name=NVMRC::$(cat .nvmrc)"
id: nvm
- name: Setup Node
uses: actions/setup-node@v3.5.1
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: '${{ steps.nvm.outputs.NVMRC }}'
node-version-file: '.nvmrc'
cache: 'npm'
- run: npm ci
- name: Run prettier
if: startsWith(matrix.os, 'ubuntu-22.04')
if: matrix.os == 'ubuntu-24.04'
run: npm run format:check
- name: Run eslint
if: startsWith(matrix.os, 'ubuntu-22.04')
if: matrix.os == 'ubuntu-24.04'
run: npm run lint
- name: Run ncc
if: startsWith(matrix.os, 'ubuntu-22.04')
if: matrix.os == 'ubuntu-24.04'
run: npm run build
- run: npm test
- name: Upload test coverage as artifact
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: coverage-${{ matrix.os }}
path: coverage
- uses: codecov/codecov-action@v3
- uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
+5 -2
View File
@@ -6,9 +6,12 @@ on:
jobs:
update:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
contents: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Update major tag
run: |
+1
View File
@@ -4,3 +4,4 @@ coverage
.eslintcache
.env
node_modules
.codex/
+1 -1
View File
@@ -1 +1 @@
12.22.4
24.15.0
+31
View File
@@ -0,0 +1,31 @@
# Repository Guidelines
## Project Structure & Module Organization
This repository contains a TypeScript GitHub Action for installing Hugo. Runtime source lives in `src/`, with `src/index.ts` as the action entry and `src/main.ts` coordinating input handling and installation. Tests live in `__tests__/`, with fixtures in `__tests__/data/`. The action metadata is `action.yml`; it points to the bundled output `lib/index.js`, which is generated by `npm run build`. Workflow automation is under `.github/workflows/`, and project imagery is in `images/`.
## Build, Test, and Development Commands
- `npm ci`: install dependencies from `package-lock.json`.
- `npm run all`: run format check, ESLint, and Jest tests; use this before opening a PR.
- `npm test`: run Jest with coverage and verbose output.
- `npm run lint` / `npm run lint:fix`: check or fix TypeScript lint issues.
- `npm run format:check` / `npm run format`: check or apply Prettier formatting for `*.ts`.
- `npm run build`: bundle `src/index.ts` into `lib/` with `ncc`; do not regenerate `lib/index.js` except for release work.
- `make build`, `make test`, `make all`: run the Docker-based development image and test flow.
## Coding Style & Naming Conventions
Use TypeScript with `strict` and `noImplicitAny` enabled. Follow the existing Prettier settings: 2-space indentation, single quotes, semicolons, 100-column print width, no trailing commas, and no bracket spacing. Use named exports for reusable helpers, keep filenames lowercase with hyphenated words such as `get-latest-version.ts`, and keep tests named `*.test.ts`. Makefiles use tabs, as defined in `.editorconfig`.
## Testing Guidelines
Jest with `ts-jest` and `jest-circus` runs all `**/*.test.ts` files in a Node environment. Add focused unit tests next to related behavior in `__tests__/`, and place mocked API responses or reusable input data in `__tests__/data/`. Preserve or improve coverage when changing installer logic, URL generation, OS/arch detection, or latest-version lookup.
## Commit & Pull Request Guidelines
Commit history follows short Conventional Commit-style prefixes such as `feat:`, `ci:`, and `docs:`. Keep commit subjects imperative and scoped to one change. PRs should describe the behavior change, mention linked issues when applicable, and list verification commands such as `npm run all` and `npm run build`. Include updates to `README.md`, `action.yml`, and tests whenever inputs, runtime behavior, or documented examples change.
## Agent-Specific Instructions
Use English for repository-facing content, including documentation, code comments, commit messages, and pull request text, unless the task explicitly requires another language.
+105
View File
@@ -2,6 +2,111 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [3.2.1](https://github.com/peaceiris/actions-hugo/compare/v3.2.0...v3.2.1) (2026-05-10)
### fix
* handle Hugo 0.139.5 archive fallback (#696) ([4e5bf41](https://github.com/peaceiris/actions-hugo/commit/4e5bf412f00ba628ed366436825de7226933f80d)), closes [#696](https://github.com/peaceiris/actions-hugo/issues/696)
# [3.2.0](https://github.com/peaceiris/actions-hugo/compare/v3.1.0...v3.2.0) (2026-05-10)
### build
* update npm dependencies (#689) ([189731e](https://github.com/peaceiris/actions-hugo/commit/189731ef0083fa5500ca268865b02bd8eb3e7050)), closes [#689](https://github.com/peaceiris/actions-hugo/issues/689)
### chore
* delete lib/index.js ([8a69ba5](https://github.com/peaceiris/actions-hugo/commit/8a69ba55a596c78f65c6feef166e2eb2aebc2f2f))
### ci
* bump actions/checkout from 4.3.1 to 6.0.2 (#691) ([71c032c](https://github.com/peaceiris/actions-hugo/commit/71c032c9dcb44d6b93dd8910811cb1b6ea450bd5)), closes [#691](https://github.com/peaceiris/actions-hugo/issues/691)
* bump actions/setup-node from 4.4.0 to 6.4.0 (#690) ([66080d4](https://github.com/peaceiris/actions-hugo/commit/66080d4abbf3e0d1bcfc83914cbbb18f90efcf00)), closes [#690](https://github.com/peaceiris/actions-hugo/issues/690) [actions/setup-node#1525](https://github.com/actions/setup-node/issues/1525) [actions/setup-node#1533](https://github.com/actions/setup-node/issues/1533) [actions/setup-node#1525](https://github.com/actions/setup-node/issues/1525) [actions/setup-node#1283](https://github.com/actions/setup-node/issues/1283) [actions/setup-node#1491](https://github.com/actions/setup-node/issues/1491) [actions/setup-node#1378](https://github.com/actions/setup-node/issues/1378) [actions/setup-node#1498](https://github.com/actions/setup-node/issues/1498) [actions/setup-node#1467](https://github.com/actions/setup-node/issues/1467) [actions/setup-node#1495](https://github.com/actions/setup-node/issues/1495) [actions/setup-node#1283](https://github.com/actions/setup-node/issues/1283) [actions/setup-node#1454](https://github.com/actions/setup-node/issues/1454) [actions/setup-node#1442](https://github.com/actions/setup-node/issues/1442) [actions/setup-node#1446](https://github.com/actions/setup-node/issues/1446) [actions/setup-node#1226](https://github.com/actions/setup-node/issues/1226) [actions/setup-node#1468](https://github.com/actions/setup-node/issues/1468) [actions/setup-node#1449](https://github.com/actions/setup-node/issues/1449) [actions/setup-node#1454](https://github.com/actions/setup-node/issues/1454) [actions/setup-node#1442](https://github.com/actions/setup-node/issues/1442) [actions/setup-node#1446](https://github.com/actions/setup-node/issues/1446) [#1533](https://github.com/peaceiris/actions-hugo/issues/1533) [#1525](https://github.com/peaceiris/actions-hugo/issues/1525) [#1498](https://github.com/peaceiris/actions-hugo/issues/1498) [#1495](https://github.com/peaceiris/actions-hugo/issues/1495) [#1378](https://github.com/peaceiris/actions-hugo/issues/1378) [#1283](https://github.com/peaceiris/actions-hugo/issues/1283) [#1467](https://github.com/peaceiris/actions-hugo/issues/1467) [#1491](https://github.com/peaceiris/actions-hugo/issues/1491) [#1468](https://github.com/peaceiris/actions-hugo/issues/1468) [#1226](https://github.com/peaceiris/actions-hugo/issues/1226)
* bump actions/upload-artifact from 4.6.2 to 7.0.1 (#692) ([27f9d4a](https://github.com/peaceiris/actions-hugo/commit/27f9d4ab073f98ceaee353f893283fd6da81cb6d)), closes [#692](https://github.com/peaceiris/actions-hugo/issues/692)
* bump github/codeql-action from 3.35.4 to 4.35.4 (#694) ([681f914](https://github.com/peaceiris/actions-hugo/commit/681f914d18cf3aefb972de7c4f1ac75dfff38e5d)), closes [#694](https://github.com/peaceiris/actions-hugo/issues/694)
* bump peaceiris/actions-hugo from 3.0.0 to 3.1.0 (#693) ([7c673b8](https://github.com/peaceiris/actions-hugo/commit/7c673b8b9ebc5b359f3f4dd4eca150830f1fea5e)), closes [#693](https://github.com/peaceiris/actions-hugo/issues/693)
### docs
* add pull request template ([d488e4d](https://github.com/peaceiris/actions-hugo/commit/d488e4d9876f0cb74ace1aac7bbf14fcf52868d9))
* document build artifact constraint ([e3c35ac](https://github.com/peaceiris/actions-hugo/commit/e3c35ac635d46e1fc932dd524c5490fff7d235a9))
### feat
* support renamed Hugo release assets (#687) ([187a5ef](https://github.com/peaceiris/actions-hugo/commit/187a5efe8178fbcd0f0969d3db97b33d4f89d8ab)), closes [#687](https://github.com/peaceiris/actions-hugo/issues/687)
### fix
* Hugo package naming fix (#688) ([b1937e1](https://github.com/peaceiris/actions-hugo/commit/b1937e141c2b829e9913293bb8044aec5ef28dd2)), closes [#688](https://github.com/peaceiris/actions-hugo/issues/688) [#609](https://github.com/peaceiris/actions-hugo/issues/609) [#687](https://github.com/peaceiris/actions-hugo/issues/687)
# [3.1.0](https://github.com/peaceiris/actions-hugo/compare/v3.0.0...v3.1.0) (2026-05-10)
### chore
* add .codex/ ([fd1a667](https://github.com/peaceiris/actions-hugo/commit/fd1a6670898ca2ebf1a2c7f921f3eaf59eb75878))
### ci
* bump actions/dependency-review-action from 3 to 4 (#656) ([711df4e](https://github.com/peaceiris/actions-hugo/commit/711df4ed6415b013fd3ce424f98c5720d36d19e0)), closes [#656](https://github.com/peaceiris/actions-hugo/issues/656)
* bump actions/upload-artifact from 3 to 4 (#654) ([764796d](https://github.com/peaceiris/actions-hugo/commit/764796d276c5a0094764d3fb3fbc3bb6fefb19e6)), closes [#654](https://github.com/peaceiris/actions-hugo/issues/654)
* bump codecov/codecov-action from 3 to 4 (#655) ([e177dc3](https://github.com/peaceiris/actions-hugo/commit/e177dc33cb0d5866aa77a82d4cdfdda3a5cd76a3)), closes [#655](https://github.com/peaceiris/actions-hugo/issues/655)
* bump codecov/codecov-action from 4 to 5 (#660) ([3a28794](https://github.com/peaceiris/actions-hugo/commit/3a287949d38134f0920e6ac20032acef6d4a23c4)), closes [#660](https://github.com/peaceiris/actions-hugo/issues/660)
* bump github/codeql-action from 2 to 3 (#657) ([9d57878](https://github.com/peaceiris/actions-hugo/commit/9d57878417d5429540d059b1dbf19e0717797912)), closes [#657](https://github.com/peaceiris/actions-hugo/issues/657)
* bump peaceiris/actions-hugo from 2.6.0 to 3.0.0 (#653) ([3b44307](https://github.com/peaceiris/actions-hugo/commit/3b443076f02aa9537a31bdcaa0c971cdd41eb022)), closes [#653](https://github.com/peaceiris/actions-hugo/issues/653)
* harden workflows and update Node.js (#686) ([64e0f66](https://github.com/peaceiris/actions-hugo/commit/64e0f66acbd8b134359e19b06e518ceb2734de14)), closes [#686](https://github.com/peaceiris/actions-hugo/issues/686)
### docs
* add contributor guidelines ([ba5146c](https://github.com/peaceiris/actions-hugo/commit/ba5146cb8a90074a91c351b17a4206ffd8594cd5))
* add env.HUGO_CACHEDIR (#650) ([288264f](https://github.com/peaceiris/actions-hugo/commit/288264f9c9c4a54b634fdbfdc119faefe699d549)), closes [#650](https://github.com/peaceiris/actions-hugo/issues/650)
* bump actions/cache to v4 ([7db63f5](https://github.com/peaceiris/actions-hugo/commit/7db63f5e7f65f5c06a64fd56106389606f84a976))
### feat
* upgrade action runtime from Node 20 to 24 (#684) ([83259d8](https://github.com/peaceiris/actions-hugo/commit/83259d800c0f56b05d14cb0b320d8e4034770d68)), closes [#684](https://github.com/peaceiris/actions-hugo/issues/684)
# [3.0.0](https://github.com/peaceiris/actions-hugo/compare/v2.6.0...v3.0.0) (2024-04-02)
### build
* node 20.11.1 ([01bd2b1](https://github.com/peaceiris/actions-hugo/commit/01bd2b16cc6cadbc63cba9bddb36c689f462c2db))
### chore
* npm audit fix ([966dfad](https://github.com/peaceiris/actions-hugo/commit/966dfad3859a5cfc80b6e36761b0b4c7b3dd5e0c))
* revert version ([d85452e](https://github.com/peaceiris/actions-hugo/commit/d85452eadfba7065bf8c0601c8c22e427982d108))
### ci
* bump actions/dependency-review-action from 2 to 3 (#622) ([844f873](https://github.com/peaceiris/actions-hugo/commit/844f8735f61722d43677c23cbeae4283af7b554a)), closes [#622](https://github.com/peaceiris/actions-hugo/issues/622)
* bump actions/setup-node from 3.5.1 to 3.6.0 (#625) ([3fa8fd6](https://github.com/peaceiris/actions-hugo/commit/3fa8fd6cee4e03774c4e900dca8b766d1cdcae93)), closes [#625](https://github.com/peaceiris/actions-hugo/issues/625)
* bump checkout to v4 (#639) ([aadc3a9](https://github.com/peaceiris/actions-hugo/commit/aadc3a98dfd3437f8f97d436ea91b82a73dc85dd)), closes [#639](https://github.com/peaceiris/actions-hugo/issues/639)
* bump peaceiris/actions-hugo from 2.5.0 to 2.6.0 (#621) ([b1822b6](https://github.com/peaceiris/actions-hugo/commit/b1822b6abe1a489f9ba7b9b664d916aeafd3e592)), closes [#621](https://github.com/peaceiris/actions-hugo/issues/621)
### docs
* bump ruby version to 3.2 (#629) ([7c4b9f1](https://github.com/peaceiris/actions-hugo/commit/7c4b9f1f99c72728600c292c1f0e7138cc3a8865)), closes [#629](https://github.com/peaceiris/actions-hugo/issues/629)
* bump versions (#628) ([7652d53](https://github.com/peaceiris/actions-hugo/commit/7652d5336914f4ecd975baff70cd3c4b5070678b)), closes [#628](https://github.com/peaceiris/actions-hugo/issues/628)
* remove braces (#634) ([31c4654](https://github.com/peaceiris/actions-hugo/commit/31c46541ceabb0656cd9e943914ab1701da3e788)), closes [#634](https://github.com/peaceiris/actions-hugo/issues/634)
* replace set-output with GITHUB_OUTPUT ([3d92e2f](https://github.com/peaceiris/actions-hugo/commit/3d92e2fd556bef7470d7e2a6aea63141183c20a6))
* update cache usage (#636) ([c0084b0](https://github.com/peaceiris/actions-hugo/commit/c0084b0763db3a37f864755d9174f2a6f3e0c1c5)), closes [#636](https://github.com/peaceiris/actions-hugo/issues/636)
### feat
* bump to use node20 runtime (#641) ([c57490a](https://github.com/peaceiris/actions-hugo/commit/c57490a8b04136ae58ab5866a93d3db2f0fa0945)), closes [#641](https://github.com/peaceiris/actions-hugo/issues/641)
# [2.6.0](https://github.com/peaceiris/actions-hugo/compare/v2.5.0...v2.6.0) (2022-10-23)
+2 -2
View File
@@ -1,6 +1,6 @@
ARG NODE_VERSION
ARG NODE_VERSION=24.15.0
FROM node:${NODE_VERSION}-buster-slim
FROM node:${NODE_VERSION}-bookworm-slim
SHELL ["/bin/bash", "-l", "-c"]
+43 -29
View File
@@ -2,6 +2,7 @@
<img width="400" alt="GitHub Actions for Hugo" src="./images/ogp.svg">
[![Project status: active The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active)
[![license](https://img.shields.io/github/license/peaceiris/actions-hugo.svg)](https://github.com/peaceiris/actions-hugo/blob/main/LICENSE)
[![release](https://img.shields.io/github/release/peaceiris/actions-hugo.svg)](https://github.com/peaceiris/actions-hugo/releases/latest)
[![GitHub release date](https://img.shields.io/github/release-date/peaceiris/actions-hugo.svg)](https://github.com/peaceiris/actions-hugo/releases)
@@ -84,15 +85,15 @@ jobs:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true # Fetch Hugo themes (true OR recursive)
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.91.2'
hugo-version: '0.119.0'
# extended: true
- name: Build
@@ -100,7 +101,7 @@ jobs:
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
if: ${{ github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
@@ -120,9 +121,9 @@ Set `extended: true` to use a Hugo extended version.
```yaml
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.91.2'
hugo-version: '0.119.0'
extended: true
```
@@ -132,7 +133,7 @@ Set `hugo-version: 'latest'` to use the latest version of Hugo.
```yaml
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: 'latest'
```
@@ -150,12 +151,27 @@ This action fetches the latest version of Hugo by [hugo | Homebrew Formulae](htt
### ⭐️ Caching Hugo Modules
Insert a cache step before site-building as follows.
Note that the cache dir location of Hugo on a Linux-based operating system is `/tmp/hugo_cache`. On macOS, `${TMPDIR}/hugo_cache` has the location.
First, to maximize compatibility with all Hugo versions, let's define the variable `HUGO_CACHEDIR`:
```yaml
- uses: actions/cache@v2
# * ...
jobs:
deploy:
runs-on: ubuntu-22.04
env:
HUGO_CACHEDIR: /tmp/hugo_cache # <- Define the env variable here, so that Hugo's cache dir is now predictible in your workflow and doesn't depend on the Hugo's version you're using.
# * ...
```
Now, let's add the cache action call just above the _Build_ step:
```yaml
- uses: actions/cache@v4
with:
path: /tmp/hugo_cache
path: ${{ env.HUGO_CACHEDIR }} # <- Use the same env variable just right here
key: ${{ runner.os }}-hugomod-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-hugomod-
@@ -175,7 +191,7 @@ How to sync a Hugo version between a Docker Compose and a GitHub Actions workflo
Write a `HUGO_VERSION` to the `.env` file like the following and push it to a remote branch.
```sh
HUGO_VERSION=0.91.2
HUGO_VERSION=0.119.0
```
Next, add a step to read a Hugo version from the `.env` file.
@@ -185,10 +201,10 @@ Next, add a step to read a Hugo version from the `.env` file.
id: hugo-version
run: |
. ./.env
echo "::set-output name=HUGO_VERSION::${HUGO_VERSION}"
echo "HUGO_VERSION=${HUGO_VERSION}" >> "${GITHUB_OUTPUT}"
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '${{ steps.hugo-version.outputs.HUGO_VERSION }}'
extended: true
@@ -249,21 +265,19 @@ jobs:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@4
with:
submodules: recursive # Fetch the Docsy theme
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.91.2'
hugo-version: '0.119.0'
extended: true
- name: Setup Node
uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: '16'
node-version: '20'
cache: 'npm'
# The action defaults to search for the dependency file (package-lock.json,
# npm-shrinkwrap.json or yarn.lock) in the repository root, and uses its
@@ -276,7 +290,7 @@ jobs:
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
if: ${{ github.ref == 'refs/heads/master' }}
if: github.ref == 'refs/heads/master'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
```
@@ -304,21 +318,21 @@ jobs:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true # Fetch Hugo themes (true OR recursive)
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.91.2'
hugo-version: '0.119.0'
extended: true
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
ruby-version: 3.2
- run: gem install asciidoctor
@@ -329,7 +343,7 @@ jobs:
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
if: ${{ github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
```
@@ -356,7 +370,7 @@ jobs:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -364,9 +378,9 @@ jobs:
run: git config core.quotePath false
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.91.2'
hugo-version: '0.119.0'
```
<div align="right">
+130 -10
View File
@@ -1,15 +1,135 @@
import getArch from '../src/get-arch';
describe('getArch', () => {
test('processor architecture', () => {
expect(getArch('x64')).toBe('64bit');
expect(getArch('arm')).toBe('ARM');
expect(getArch('arm64')).toBe('ARM64');
});
const groups = [
{
condition: 'when hugo version < 0.102.0',
conventions: {
arch: {
darwinUniversal: false,
droppedWindowsArmSupport: false,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
},
tests: [
{arch: 'x64', os: 'linux', expected: '64bit'},
{arch: 'x64', os: 'darwin', expected: '64bit'},
{arch: 'x64', os: 'macOS', expected: '64bit'},
{arch: 'x64', os: 'windows', expected: '64bit'},
{arch: 'arm', os: 'linux', expected: 'ARM'},
{arch: 'arm', os: 'darwin', expected: 'ARM'},
{arch: 'arm', os: 'macOS', expected: 'ARM'},
{arch: 'arm', os: 'windows', expected: 'ARM'},
{arch: 'arm64', os: 'linux', expected: 'ARM64'},
{arch: 'arm64', os: 'darwin', expected: 'ARM64'},
{arch: 'arm64', os: 'macOS', expected: 'ARM64'},
{arch: 'arm64', os: 'windows', expected: 'ARM64'}
]
},
{
condition: 'when hugo version === 0.102.z',
conventions: {
arch: {
darwinUniversal: true,
droppedWindowsArmSupport: true,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
},
tests: [
{arch: 'x64', os: 'linux', expected: '64bit'},
{arch: 'x64', os: 'macOS', expected: 'universal'},
{arch: 'x64', os: 'windows', expected: '64bit'},
{arch: 'arm', os: 'linux', expected: 'ARM'},
{arch: 'arm', os: 'macOS', expected: 'universal'},
{arch: 'arm', os: 'windows', throws: true},
{arch: 'arm64', os: 'linux', expected: 'ARM64'},
{arch: 'arm64', os: 'macOS', expected: 'universal'},
{arch: 'arm64', os: 'windows', expected: 'ARM64'}
]
},
{
condition: 'when hugo version >= 0.103.0',
conventions: {
arch: {
darwinUniversal: true,
droppedWindowsArmSupport: true,
standardizedNaming: true
},
os: {
renamedMacOS: true,
downcasedAll: true
}
},
tests: [
{arch: 'x64', os: 'linux', expected: 'amd64'},
{arch: 'x64', os: 'macOS', expected: 'universal'},
{arch: 'x64', os: 'windows', expected: 'amd64'},
{arch: 'arm', os: 'linux', expected: 'arm'},
{arch: 'arm', os: 'macOS', expected: 'universal'},
{arch: 'arm', os: 'windows', throws: true},
{arch: 'arm64', os: 'linux', expected: 'arm64'},
{arch: 'arm64', os: 'macOS', expected: 'universal'},
{arch: 'arm64', os: 'windows', expected: 'arm64'}
]
},
{
condition: 'when the architecture is unsupported for the action',
conventions: {
arch: {
darwinUniversal: false,
droppedWindowsArmSupport: false,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
},
tests: [{arch: 'mips', os: 'linux', throws: true}]
}
];
test('exception', () => {
expect(() => {
getArch('mips');
}).toThrowError('mips is not supported');
});
const passingTests = groups.flatMap(group =>
group.tests
.filter(example => !example.throws)
.map(example => ({
...example,
condition: group.condition,
conventions: group.conventions
}))
);
const throwingTests = groups.flatMap(group =>
group.tests
.filter(example => example.throws)
.map(example => ({
...example,
condition: group.condition,
conventions: group.conventions
}))
);
test.each(passingTests)(
'$condition: $os on $arch returns $expected',
({arch, os, conventions, expected}) => {
expect(getArch(arch, os, conventions)).toBe(expected);
}
);
test.each(throwingTests)(
'$condition: $os on $arch throws as not supported',
({arch, os, conventions}) => {
expect(() => {
getArch(arch, os, conventions);
}).toThrow(`${arch} is not supported`);
}
);
});
+61
View File
@@ -0,0 +1,61 @@
import {getConventions} from '../src/get-conventions';
describe('getConventions()', () => {
const groups = [
{
condition: 'when hugo version < 0.102.0',
version: '0.101.0',
expected: {
arch: {
darwinUniversal: false,
droppedWindowsArmSupport: false,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
}
},
{
condition: 'when hugo version === 0.102.z',
version: '0.102.0',
expected: {
arch: {
darwinUniversal: true,
droppedWindowsArmSupport: true,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
}
},
{
condition: 'when hugo version >= 0.103.0',
version: '0.103.0',
expected: {
arch: {
darwinUniversal: true,
droppedWindowsArmSupport: true,
standardizedNaming: true
},
os: {
renamedMacOS: true,
downcasedAll: true
}
}
}
].map(function (group) {
return Object.assign(group, {
toString: function () {
return group.condition;
}
});
});
test.each(groups)('%s', ({expected, version}) => {
expect(getConventions(version)).toEqual(expected);
});
});
+10 -8
View File
@@ -1,6 +1,6 @@
import {getURL, getLatestVersion} from '../src/get-latest-version';
import nock from 'nock';
import {FetchError} from 'node-fetch';
import {clearMockFetchResponses, mockFetchResponse} from './mocks/node-fetch';
import {Tool} from '../src/constants';
import jsonTestBrew from './data/brew.json';
import jsonTestGithub from './data/github.json';
@@ -10,7 +10,7 @@ beforeEach(() => {
});
afterEach(() => {
nock.cleanAll();
clearMockFetchResponses();
});
describe('getURL()', () => {
@@ -27,24 +27,26 @@ describe('getURL()', () => {
describe('getLatestVersion()', () => {
test('return latest version via brew', async () => {
nock('https://formulae.brew.sh').get(`/api/formula/${Tool.Repo}.json`).reply(200, jsonTestBrew);
mockFetchResponse(`https://formulae.brew.sh/api/formula/${Tool.Repo}.json`, 200, jsonTestBrew);
const versionLatest: string = await getLatestVersion(Tool.Org, Tool.Repo, 'brew');
expect(versionLatest).toMatch(Tool.TestVersionLatest);
});
test('return latest version via GitHub', async () => {
nock('https://api.github.com')
.get(`/repos/${Tool.Org}/${Tool.Repo}/releases/latest`)
.reply(200, jsonTestGithub);
mockFetchResponse(
`https://api.github.com/repos/${Tool.Org}/${Tool.Repo}/releases/latest`,
200,
jsonTestGithub
);
const versionLatest: string = await getLatestVersion(Tool.Org, Tool.Repo, 'github');
expect(versionLatest).toMatch(Tool.TestVersionLatest);
});
test('return exception 404', async () => {
nock('https://formulae.brew.sh').get(`/api/formula/${Tool.Repo}.json`).reply(404);
mockFetchResponse(`https://formulae.brew.sh/api/formula/${Tool.Repo}.json`, 404);
await expect(getLatestVersion(Tool.Org, Tool.Repo, 'brew')).rejects.toThrowError(FetchError);
await expect(getLatestVersion(Tool.Org, Tool.Repo, 'brew')).rejects.toThrow(FetchError);
});
});
+91 -6
View File
@@ -1,15 +1,100 @@
import getOS from '../src/get-os';
describe('getOS', () => {
test('os type', () => {
expect(getOS('linux')).toBe('Linux');
expect(getOS('darwin')).toBe('macOS');
expect(getOS('win32')).toBe('Windows');
const groups = [
{
condition: 'when hugo version < 0.102.0',
conventions: {
arch: {
darwinUniversal: false,
droppedWindowsArmSupport: false,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
},
tests: [
{os: 'linux', expected: 'Linux'},
{os: 'darwin', expected: 'macOS'},
{os: 'win32', expected: 'Windows'}
]
},
{
condition: 'when hugo version === 0.102.z',
conventions: {
arch: {
darwinUniversal: true,
droppedWindowsArmSupport: true,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
},
tests: [
{os: 'linux', expected: 'Linux'},
{os: 'darwin', expected: 'macOS'},
{os: 'win32', expected: 'Windows'}
]
},
{
condition: 'when hugo version >= 0.103.0',
conventions: {
arch: {
darwinUniversal: true,
droppedWindowsArmSupport: true,
standardizedNaming: true
},
os: {
renamedMacOS: true,
downcasedAll: true
}
},
tests: [
{os: 'linux', expected: 'linux'},
{os: 'darwin', expected: 'darwin'},
{os: 'win32', expected: 'windows'}
]
}
].map(function (group) {
group.tests = group.tests.map(function (example) {
return Object.assign(example, {
toString: function () {
return `${example.os} returns ${example.expected}`;
}
});
});
return Object.assign(group, {
toString: function () {
return group.condition;
}
});
});
describe.each(groups)('%s', ({conventions, tests}) => {
test.each(tests)('%s', ({os, expected}) => {
expect(getOS(os, conventions)).toBe(expected);
});
});
test('exception', () => {
const conventions = {
arch: {
darwinUniversal: false,
droppedWindowsArmSupport: false,
standardizedNaming: false
},
os: {
renamedMacOS: false,
downcasedAll: false
}
};
expect(() => {
getOS('centos');
}).toThrowError('centos is not supported');
getOS('centos', conventions);
}).toThrow('centos is not supported');
});
});
+156 -15
View File
@@ -1,20 +1,161 @@
import getURL from '../src/get-url';
import getURL, {getDownloadVersion} from '../src/get-url';
describe('getURL()', () => {
test('get a URL to an asset for each platform', () => {
test('get URLs to Linux assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.58.2';
const urlLinux = `${baseURL}/hugo_0.58.2_Linux-64bit.tar.gz`;
const urlLinuxExtended = `${baseURL}/hugo_extended_0.58.2_Linux-64bit.tar.gz`;
const urlMacOS = `${baseURL}/hugo_0.58.2_macOS-64bit.tar.gz`;
const urlMacOSExtended = `${baseURL}/hugo_extended_0.58.2_macOS-64bit.tar.gz`;
const urlWindows = `${baseURL}/hugo_0.58.2_Windows-64bit.zip`;
expect(getURL('Linux', '64bit', 'false', '0.58.2')).toBe(urlLinux);
expect(getURL('Linux', '64bit', 'true', '0.58.2')).not.toBe(urlLinux);
expect(getURL('MyOS', '64bit', 'false', '0.58.2')).not.toBe(urlLinux);
expect(getURL('Linux', '64bit', 'false', '0.58.1')).not.toBe(urlLinux);
expect(getURL('Linux', '64bit', 'true', '0.58.2')).toBe(urlLinuxExtended);
expect(getURL('macOS', '64bit', 'false', '0.58.2')).toBe(urlMacOS);
expect(getURL('macOS', '64bit', 'true', '0.58.2')).toBe(urlMacOSExtended);
expect(getURL('Windows', '64bit', 'false', '0.58.2')).toBe(urlWindows);
expect(getURL('Linux', '64bit', 'false', '0.58.2')).toEqual([
`${baseURL}/hugo_0.58.2_Linux-64bit.tar.gz`,
`${baseURL}/hugo_0.58.2_Linux_64bit.tar.gz`,
`${baseURL}/hugo_0.58.2_linux-amd64.tar.gz`,
`${baseURL}/hugo_v0.58.2_Linux-64bit.tar.gz`,
`${baseURL}/hugo_v0.58.2_Linux_64bit.tar.gz`,
`${baseURL}/hugo_v0.58.2_linux-amd64.tar.gz`
]);
expect(getURL('Linux', 'ARM64', 'true', '0.58.2')).toEqual([
`${baseURL}/hugo_extended_0.58.2_Linux-ARM64.tar.gz`,
`${baseURL}/hugo_extended_0.58.2_Linux_ARM64.tar.gz`,
`${baseURL}/hugo_extended_0.58.2_linux-arm64.tar.gz`,
`${baseURL}/hugo_extended_v0.58.2_Linux-ARM64.tar.gz`,
`${baseURL}/hugo_extended_v0.58.2_Linux_ARM64.tar.gz`,
`${baseURL}/hugo_extended_v0.58.2_linux-arm64.tar.gz`
]);
});
test('get URLs to legacy Linux assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.20.3';
expect(getURL('Linux', '64bit', 'false', '0.20.3')).toEqual([
`${baseURL}/hugo_0.20.3_Linux-64bit.tar.gz`,
`${baseURL}/hugo_0.20.3_Linux_64bit.tar.gz`,
`${baseURL}/hugo_0.20.3_linux-amd64.tar.gz`,
`${baseURL}/hugo_v0.20.3_Linux-64bit.tar.gz`,
`${baseURL}/hugo_v0.20.3_Linux_64bit.tar.gz`,
`${baseURL}/hugo_v0.20.3_linux-amd64.tar.gz`
]);
});
test('get URLs to macOS assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.161.1';
expect(getURL('macOS', '64bit', 'true', '0.161.1')).toEqual([
`${baseURL}/hugo_extended_0.161.1_macOS-64bit.tar.gz`,
`${baseURL}/hugo_extended_0.161.1_macOS-64bit.zip`,
`${baseURL}/hugo_extended_0.161.1_macOS-all.tar.gz`,
`${baseURL}/hugo_extended_0.161.1_darwin-universal.tar.gz`,
`${baseURL}/hugo_extended_0.161.1_darwin-universal.pkg`,
`${baseURL}/hugo_extended_v0.161.1_macOS-64bit.tar.gz`,
`${baseURL}/hugo_extended_v0.161.1_macOS-64bit.zip`,
`${baseURL}/hugo_extended_v0.161.1_macOS-all.tar.gz`,
`${baseURL}/hugo_extended_v0.161.1_darwin-universal.tar.gz`,
`${baseURL}/hugo_extended_v0.161.1_darwin-universal.pkg`
]);
});
test('get URLs to macOS 0.102 universal assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.102.0';
expect(getURL('macOS', 'universal', 'false', '0.102.0')).toEqual([
`${baseURL}/hugo_0.102.0_macOS-universal.tar.gz`,
`${baseURL}/hugo_0.102.0_macOS-universal.zip`,
`${baseURL}/hugo_0.102.0_macOS-all.tar.gz`,
`${baseURL}/hugo_0.102.0_darwin-universal.tar.gz`,
`${baseURL}/hugo_0.102.0_darwin-universal.pkg`,
`${baseURL}/hugo_v0.102.0_macOS-universal.tar.gz`,
`${baseURL}/hugo_v0.102.0_macOS-universal.zip`,
`${baseURL}/hugo_v0.102.0_macOS-all.tar.gz`,
`${baseURL}/hugo_v0.102.0_darwin-universal.tar.gz`,
`${baseURL}/hugo_v0.102.0_darwin-universal.pkg`
]);
});
test('get URLs to darwin assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.103.0';
expect(getURL('darwin', 'universal', 'false', '0.103.0')).toEqual([
`${baseURL}/hugo_0.103.0_darwin-universal.tar.gz`,
`${baseURL}/hugo_0.103.0_darwin-universal.pkg`,
`${baseURL}/hugo_v0.103.0_darwin-universal.tar.gz`,
`${baseURL}/hugo_v0.103.0_darwin-universal.pkg`
]);
});
test('get URLs to legacy macOS assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.20.2';
expect(getURL('macOS', '64bit', 'false', '0.20.2')).toEqual([
`${baseURL}/hugo_0.20.2_macOS-64bit.tar.gz`,
`${baseURL}/hugo_0.20.2_macOS-64bit.zip`,
`${baseURL}/hugo_0.20.2_macOS-all.tar.gz`,
`${baseURL}/hugo_0.20.2_darwin-universal.tar.gz`,
`${baseURL}/hugo_0.20.2_darwin-universal.pkg`,
`${baseURL}/hugo_v0.20.2_macOS-64bit.tar.gz`,
`${baseURL}/hugo_v0.20.2_macOS-64bit.zip`,
`${baseURL}/hugo_v0.20.2_macOS-all.tar.gz`,
`${baseURL}/hugo_v0.20.2_darwin-universal.tar.gz`,
`${baseURL}/hugo_v0.20.2_darwin-universal.pkg`
]);
});
test('get URLs to Windows assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.58.2';
expect(getURL('Windows', '64bit', 'false', '0.58.2')).toEqual([
`${baseURL}/hugo_0.58.2_Windows-64bit.zip`,
`${baseURL}/hugo_0.58.2_windows-amd64.zip`,
`${baseURL}/hugo_v0.58.2_Windows-64bit.zip`,
`${baseURL}/hugo_v0.58.2_windows-amd64.zip`
]);
expect(getURL('Windows', 'ARM64', 'true', '0.58.2')).toEqual([
`${baseURL}/hugo_extended_0.58.2_Windows-ARM64.zip`,
`${baseURL}/hugo_extended_0.58.2_windows-arm64.zip`,
`${baseURL}/hugo_extended_v0.58.2_Windows-ARM64.zip`,
`${baseURL}/hugo_extended_v0.58.2_windows-arm64.zip`
]);
});
test('get URLs to downcased Windows assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.103.0';
expect(getURL('windows', 'amd64', 'false', '0.103.0')).toEqual([
`${baseURL}/hugo_0.103.0_windows-amd64.zip`,
`${baseURL}/hugo_0.103.0_Windows-amd64.zip`,
`${baseURL}/hugo_v0.103.0_windows-amd64.zip`,
`${baseURL}/hugo_v0.103.0_Windows-amd64.zip`
]);
});
test('get URLs to legacy Windows assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.20.3';
expect(getURL('Windows', '64bit', 'false', '0.20.3')).toEqual([
`${baseURL}/hugo_0.20.3_Windows-64bit.zip`,
`${baseURL}/hugo_0.20.3_windows-amd64.zip`,
`${baseURL}/hugo_v0.20.3_Windows-64bit.zip`,
`${baseURL}/hugo_v0.20.3_windows-amd64.zip`
]);
});
test('get URLs to downcased Linux assets', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.103.0';
expect(getURL('linux', 'arm', 'false', '0.103.0')).toEqual([
`${baseURL}/hugo_0.103.0_linux-arm.tar.gz`,
`${baseURL}/hugo_0.103.0_Linux-arm.tar.gz`,
`${baseURL}/hugo_0.103.0_Linux_arm.tar.gz`,
`${baseURL}/hugo_v0.103.0_linux-arm.tar.gz`,
`${baseURL}/hugo_v0.103.0_Linux-arm.tar.gz`,
`${baseURL}/hugo_v0.103.0_Linux_arm.tar.gz`
]);
});
test('get URLs to Hugo 0.139.5 archive alias', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.139.4';
expect(getDownloadVersion('0.139.5')).toBe('0.139.4');
expect(getURL('linux', 'amd64', 'true', '0.139.5')).toEqual([
`${baseURL}/hugo_extended_0.139.4_linux-amd64.tar.gz`,
`${baseURL}/hugo_extended_0.139.4_Linux-amd64.tar.gz`,
`${baseURL}/hugo_extended_0.139.4_Linux_amd64.tar.gz`,
`${baseURL}/hugo_extended_v0.139.4_linux-amd64.tar.gz`,
`${baseURL}/hugo_extended_v0.139.4_Linux-amd64.tar.gz`,
`${baseURL}/hugo_extended_v0.139.4_Linux_amd64.tar.gz`
]);
});
test('get a fallback URL to an unknown OS asset', () => {
const baseURL = 'https://github.com/gohugoio/hugo/releases/download/v0.58.2';
expect(getURL('MyOS', '64bit', 'false', '0.58.2')).toEqual([
`${baseURL}/hugo_0.58.2_MyOS-64bit.tar.gz`
]);
});
});
+136
View File
@@ -0,0 +1,136 @@
import * as tc from '@actions/tool-cache';
import * as io from '@actions/io';
import * as exec from '@actions/exec';
import path from 'path';
import {downloadHugoAsset, extractHugoAsset, isWindowsAsset} from '../src/installer';
jest.mock('@actions/tool-cache', () => ({
downloadTool: jest.fn(),
extractTar: jest.fn(),
extractZip: jest.fn()
}));
jest.mock('@actions/io', () => ({
mv: jest.fn()
}));
jest.mock('@actions/exec', () => ({
exec: jest.fn()
}));
describe('downloadHugoAsset()', () => {
const mockedTC = tc as jest.Mocked<typeof tc>;
beforeEach(() => {
jest.clearAllMocks();
});
test('retry 404 candidates and return the first downloaded asset', async () => {
mockedTC.downloadTool
.mockRejectedValueOnce(new Error('Unexpected HTTP response: 404'))
.mockResolvedValueOnce('/tmp/hugo');
const result = await downloadHugoAsset([
'https://example.com/missing.tar.gz',
'https://example.com/hugo.tar.gz'
]);
expect(result).toEqual({
path: '/tmp/hugo',
url: 'https://example.com/hugo.tar.gz'
});
expect(mockedTC.downloadTool).toHaveBeenCalledTimes(2);
});
test('throw a clear error when all candidates return 404', async () => {
mockedTC.downloadTool.mockRejectedValue(new Error('Unexpected HTTP response: 404'));
await expect(
downloadHugoAsset([
'https://example.com/missing-1.tar.gz',
'https://example.com/missing-2.tar.gz'
])
).rejects.toThrow('Unable to find a compatible Hugo release asset');
});
test('rethrow non-404 download failures without retrying', async () => {
const error = new Error('socket hang up');
mockedTC.downloadTool.mockRejectedValueOnce(error);
await expect(
downloadHugoAsset(['https://example.com/hugo.tar.gz', 'https://example.com/fallback.tar.gz'])
).rejects.toBe(error);
expect(mockedTC.downloadTool).toHaveBeenCalledTimes(1);
});
});
describe('extractHugoAsset()', () => {
const mockedTC = tc as jest.Mocked<typeof tc>;
const mockedIO = io as jest.Mocked<typeof io>;
const mockedExec = exec as jest.Mocked<typeof exec>;
beforeEach(() => {
jest.clearAllMocks();
});
test('extract a tar.gz asset', async () => {
mockedTC.extractTar.mockResolvedValue('/tmp/extracted');
await extractHugoAsset('/tmp/tool', 'https://example.com/hugo.tar.gz', '/tmp/temp', '/tmp/bin');
expect(mockedTC.extractTar).toHaveBeenCalledWith('/tmp/tool', '/tmp/temp');
expect(mockedIO.mv).toHaveBeenCalledWith(path.join('/tmp/extracted', 'hugo'), '/tmp/bin');
});
test('extract a zip asset', async () => {
mockedTC.extractZip.mockResolvedValue('/tmp/extracted');
await extractHugoAsset(
'/tmp/tool',
'https://example.com/hugo_0.58.2_Windows-64bit.zip',
'/tmp/temp',
'/tmp/bin'
);
expect(mockedTC.extractZip).toHaveBeenCalledWith('/tmp/tool', '/tmp/temp');
expect(mockedIO.mv).toHaveBeenCalledWith(path.join('/tmp/extracted', 'hugo.exe'), '/tmp/bin');
});
test('extract a macOS zip asset', async () => {
mockedTC.extractZip.mockResolvedValue('/tmp/extracted');
await extractHugoAsset(
'/tmp/tool',
'https://example.com/hugo_0.20.2_macOS-64bit.zip',
'/tmp/temp',
'/tmp/bin'
);
expect(mockedTC.extractZip).toHaveBeenCalledWith('/tmp/tool', '/tmp/temp');
expect(mockedIO.mv).toHaveBeenCalledWith(path.join('/tmp/extracted', 'hugo'), '/tmp/bin');
});
test('extract a macOS pkg asset', async () => {
mockedExec.exec.mockResolvedValue(0);
await extractHugoAsset('/tmp/tool', 'https://example.com/hugo.pkg', '/tmp/temp', '/tmp/bin');
expect(mockedExec.exec).toHaveBeenCalledWith('pkgutil', [
'--expand-full',
'/tmp/tool',
path.join('/tmp/temp', 'pkg')
]);
expect(mockedIO.mv).toHaveBeenCalledWith(
path.join('/tmp/temp', 'pkg', 'Payload', 'hugo'),
'/tmp/bin'
);
});
});
describe('isWindowsAsset()', () => {
test('detect Windows asset URLs', () => {
expect(isWindowsAsset('https://example.com/hugo_0.58.2_Windows-64bit.zip')).toBe(true);
expect(isWindowsAsset('https://example.com/hugo_0.119.0_windows-amd64.zip')).toBe(true);
expect(isWindowsAsset('https://example.com/hugo_0.20.2_macOS-64bit.zip')).toBe(false);
});
});
+8 -7
View File
@@ -1,9 +1,9 @@
import * as main from '../src/main';
import * as io from '@actions/io';
import path from 'path';
import nock from 'nock';
import {Tool, Action} from '../src/constants';
import {FetchError} from 'node-fetch';
import {clearMockFetchResponses, mockFetchResponse} from './mocks/node-fetch';
import jsonTestBrew from './data/brew.json';
// import jsonTestGithub from './data/github.json';
@@ -19,7 +19,8 @@ describe('Integration testing run()', () => {
await io.rmRF(workDir);
delete process.env['INPUT_HUGO-VERSION'];
nock.cleanAll();
delete process.env['INPUT_EXTENDED'];
clearMockFetchResponses();
});
test('succeed in installing a custom version', async () => {
@@ -43,7 +44,7 @@ describe('Integration testing run()', () => {
test('succeed in installing the latest version', async () => {
const testVersion = 'latest';
process.env['INPUT_HUGO-VERSION'] = testVersion;
nock('https://formulae.brew.sh').get(`/api/formula/${Tool.Repo}.json`).reply(200, jsonTestBrew);
mockFetchResponse(`https://formulae.brew.sh/api/formula/${Tool.Repo}.json`, 200, jsonTestBrew);
const result: main.ActionResult = await main.run();
expect(result.exitcode).toBe(0);
expect(result.output).toMatch(`hugo v${Tool.TestVersionLatest}`);
@@ -53,7 +54,7 @@ describe('Integration testing run()', () => {
const testVersion = 'latest';
process.env['INPUT_HUGO-VERSION'] = testVersion;
process.env['INPUT_EXTENDED'] = 'true';
nock('https://formulae.brew.sh').get(`/api/formula/${Tool.Repo}.json`).reply(200, jsonTestBrew);
mockFetchResponse(`https://formulae.brew.sh/api/formula/${Tool.Repo}.json`, 200, jsonTestBrew);
const result: main.ActionResult = await main.run();
expect(result.exitcode).toBe(0);
expect(result.output).toMatch(`hugo v${Tool.TestVersionLatest}`);
@@ -62,9 +63,9 @@ describe('Integration testing run()', () => {
test('fail to install the latest version due to 404 of brew', async () => {
process.env['INPUT_HUGO-VERSION'] = 'latest';
nock('https://formulae.brew.sh').get(`/api/formula/${Tool.Repo}.json`).reply(404);
mockFetchResponse(`https://formulae.brew.sh/api/formula/${Tool.Repo}.json`, 404);
await expect(main.run()).rejects.toThrowError(FetchError);
await expect(main.run()).rejects.toThrow(FetchError);
});
});
@@ -81,6 +82,6 @@ describe('showVersion()', () => {
});
test('return not found', async () => {
await expect(main.showVersion('gitgit', ['--version'])).rejects.toThrowError(Error);
await expect(main.showVersion('gitgit', ['--version'])).rejects.toThrow('spawn gitgit ENOENT');
});
});
+17
View File
@@ -0,0 +1,17 @@
import path from 'path';
export function getInput(name: string): string {
return process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';
}
export function addPath(inputPath: string): void {
process.env.PATH = `${inputPath}${path.delimiter}${process.env.PATH || ''}`;
}
export function debug(message: string): void {
void message;
}
export function info(message: string): void {
void message;
}
+36
View File
@@ -0,0 +1,36 @@
import {spawn} from 'child_process';
interface ExecOptions {
listeners?: {
stdout?: (data: Buffer) => void;
stderr?: (data: Buffer) => void;
};
}
export async function exec(
commandLine: string,
args: string[] = [],
options: ExecOptions = {}
): Promise<number> {
if (commandLine === 'hugo') {
const version = process.env.TEST_HUGO_VERSION || '';
const extended = process.env.TEST_HUGO_EXTENDED === 'true' ? ' extended' : '';
options.listeners?.stdout?.(Buffer.from(`hugo v${version}${extended}\n`));
return 0;
}
return new Promise((resolve, reject) => {
const child = spawn(commandLine, args);
child.stdout?.on('data', (data: Buffer) => {
options.listeners?.stdout?.(data);
});
child.stderr?.on('data', (data: Buffer) => {
options.listeners?.stderr?.(data);
});
child.on('error', reject);
child.on('close', code => {
resolve(code ?? 0);
});
});
}
+12
View File
@@ -0,0 +1,12 @@
export async function mkdirP(dir: string): Promise<void> {
void dir;
}
export async function rmRF(target: string): Promise<void> {
void target;
}
export async function mv(source: string, dest: string): Promise<void> {
void source;
void dest;
}
+18
View File
@@ -0,0 +1,18 @@
export async function downloadTool(url: string): Promise<string> {
const version = /hugo(?:_extended)?_([^_]+)_/.exec(url)?.[1] || '';
process.env.TEST_HUGO_VERSION = version;
process.env.TEST_HUGO_EXTENDED = url.includes('hugo_extended_') ? 'true' : 'false';
return '/tmp/hugo-archive';
}
export async function extractTar(assetPath: string, tempDir: string): Promise<string> {
void assetPath;
void tempDir;
return '/tmp/extracted';
}
export async function extractZip(assetPath: string, tempDir: string): Promise<string> {
void assetPath;
void tempDir;
return '/tmp/extracted';
}
+80
View File
@@ -0,0 +1,80 @@
import http from 'http';
import https from 'https';
export class FetchError extends Error {
name = 'FetchError' as const;
constructor(
message: string,
public type: string,
systemError?: Record<string, unknown>
) {
super(message);
if (systemError) {
Object.assign(this, systemError);
}
}
}
interface ResponseLike {
ok: boolean;
status: number;
json: () => Promise<unknown>;
}
interface MockResponse {
body?: unknown;
status: number;
}
const mockResponses = new Map<string, MockResponse>();
export function mockFetchResponse(url: string, status: number, body?: unknown): void {
mockResponses.set(url, {
body,
status
});
}
export function clearMockFetchResponses(): void {
mockResponses.clear();
}
export default async function fetch(url: string | URL): Promise<ResponseLike> {
const target = url.toString();
const mockResponse = mockResponses.get(target);
if (mockResponse) {
return {
ok: mockResponse.status >= 200 && mockResponse.status < 300,
status: mockResponse.status,
json: async () => mockResponse.body as unknown
};
}
const client = target.startsWith('https:') ? https : http;
return new Promise((resolve, reject) => {
const request = client.get(target, response => {
const chunks: Buffer[] = [];
response.on('data', (chunk: Buffer | string) => {
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
});
response.on('end', () => {
const status = response.statusCode ?? 0;
const body = Buffer.concat(chunks).toString();
resolve({
ok: status >= 200 && status < 300,
status,
json: async () => JSON.parse(body) as unknown
});
});
});
request.on('error', error => {
reject(new FetchError(error.message, 'system'));
});
});
}
+1 -1
View File
@@ -11,7 +11,7 @@ inputs:
required: false
default: 'false'
runs:
using: 'node16'
using: 'node24'
main: 'lib/index.js'
branding:
icon: 'package'
+40
View File
@@ -0,0 +1,40 @@
const tseslint = require('@typescript-eslint/eslint-plugin');
const jest = require('eslint-plugin-jest');
const globals = {
Atomics: 'readonly',
Buffer: 'readonly',
SharedArrayBuffer: 'readonly',
__dirname: 'readonly',
clearTimeout: 'readonly',
console: 'readonly',
exports: 'writable',
module: 'readonly',
process: 'readonly',
require: 'readonly',
setTimeout: 'readonly'
};
module.exports = [
{
ignores: ['lib/**', 'coverage/**', 'node_modules/**']
},
...tseslint.configs['flat/recommended'],
{
files: ['src/**/*.ts', '__tests__/**/*.ts'],
languageOptions: {
ecmaVersion: 2019,
sourceType: 'module',
globals
}
},
{
files: ['__tests__/**/*.ts'],
...jest.configs['flat/recommended'],
settings: {
jest: {
version: 30
}
}
}
];
+16 -2
View File
@@ -4,8 +4,22 @@ module.exports = {
testEnvironment: 'node',
testMatch: ['**/*.test.ts'],
testRunner: 'jest-circus/runner',
moduleNameMapper: {
'^@actions/core$': '<rootDir>/__tests__/mocks/actions-core.ts',
'^@actions/exec$': '<rootDir>/__tests__/mocks/actions-exec.ts',
'^@actions/io$': '<rootDir>/__tests__/mocks/actions-io.ts',
'^@actions/tool-cache$': '<rootDir>/__tests__/mocks/actions-tool-cache.ts',
'^node-fetch$': '<rootDir>/__tests__/mocks/node-fetch.ts'
},
transform: {
'^.+\\.ts$': 'ts-jest'
'^.+\\.ts$': [
'ts-jest',
{
tsconfig: {
types: ['jest', 'node']
}
}
]
},
verbose: true
}
}
-9107
View File
File diff suppressed because it is too large Load Diff
+7567 -13709
View File
File diff suppressed because it is too large Load Diff
+24 -25
View File
@@ -1,11 +1,11 @@
{
"name": "actions-hugo",
"version": "2.6.0",
"version": "3.2.1",
"description": "GitHub Actions for Hugo",
"main": "lib/index.js",
"engines": {
"node": ">=16.18.0",
"npm": ">=8.19.0"
"node": ">=24.15.0",
"npm": ">=11.12.1"
},
"scripts": {
"all": "npm run format:check && npm run lint && npm test",
@@ -47,29 +47,28 @@
},
"homepage": "https://github.com/peaceiris/actions-hugo#readme",
"dependencies": {
"@actions/core": "^1.10.0",
"@actions/exec": "^1.1.1",
"@actions/io": "^1.1.0",
"@actions/tool-cache": "^1.7.2",
"node-fetch": "^2.6.1"
"@actions/core": "3.0.1",
"@actions/exec": "3.0.0",
"@actions/io": "3.0.2",
"@actions/tool-cache": "4.0.0",
"node-fetch": "3.3.2"
},
"devDependencies": {
"@types/jest": "^26.0.20",
"@types/node": "~12",
"@types/node-fetch": "^2.5.8",
"@typescript-eslint/eslint-plugin": "^4.16.1",
"@typescript-eslint/parser": "^4.16.1",
"@vercel/ncc": "^0.27.0",
"eslint": "^7.21.0",
"eslint-plugin-jest": "^24.1.5",
"husky": "^5.1.3",
"jest": "^26.6.3",
"jest-circus": "^26.6.3",
"lint-staged": "^10.5.4",
"nock": "^13.0.10",
"prettier": "2.2.1",
"standard-version": "^9.1.1",
"ts-jest": "^26.5.3",
"typescript": "^4.2.3"
"@types/jest": "30.0.0",
"@types/node": "25.6.2",
"@typescript-eslint/eslint-plugin": "8.59.2",
"@typescript-eslint/parser": "8.59.2",
"@vercel/ncc": "0.38.4",
"eslint": "10.3.0",
"eslint-plugin-jest": "29.15.2",
"husky": "9.1.7",
"jest": "30.4.2",
"jest-circus": "30.4.2",
"lint-staged": "17.0.4",
"nock": "14.0.15",
"prettier": "3.8.3",
"standard-version": "9.5.0",
"ts-jest": "29.4.9",
"typescript": "6.0.3"
}
}
+9 -9
View File
@@ -1,12 +1,12 @@
export enum Tool {
Name = 'Hugo',
Org = 'gohugoio',
Repo = 'hugo',
CmdName = 'hugo',
CmdOptVersion = 'version',
TestVersionLatest = '0.83.1',
TestVersionSpec = '0.82.1'
}
export const Tool = {
Name: 'Hugo',
Org: 'gohugoio',
Repo: 'hugo',
CmdName: 'hugo',
CmdOptVersion: 'version',
TestVersionLatest: '0.83.1',
TestVersionSpec: '0.82.1'
} as const;
export enum Action {
WorkDirName = 'actions_hugo',
+14 -4
View File
@@ -1,11 +1,21 @@
export default function getArch(arch: string): string {
import {conventions} from './get-conventions';
export default function getArch(arch: string, os: string, conventions: conventions): string {
if (conventions.arch.darwinUniversal && (os === 'darwin' || os === 'macOS')) {
return 'universal';
}
switch (arch) {
case 'x64':
return '64bit';
return conventions.arch.standardizedNaming ? 'amd64' : '64bit';
case 'arm':
return 'ARM';
if (conventions.arch.droppedWindowsArmSupport && (os === 'Windows' || os === 'windows')) {
throw new Error(`${arch} is not supported`);
}
return conventions.arch.standardizedNaming ? 'arm' : 'ARM';
case 'arm64':
return 'ARM64';
return conventions.arch.standardizedNaming ? 'arm64' : 'ARM64';
default:
throw new Error(`${arch} is not supported`);
}
+29
View File
@@ -0,0 +1,29 @@
export interface conventions {
arch: {
darwinUniversal: boolean;
droppedWindowsArmSupport: boolean;
standardizedNaming: boolean;
};
os: {
renamedMacOS: boolean;
downcasedAll: boolean;
};
}
export function getConventions(version: string): conventions {
const segments = version.split('.').map(s => parseInt(s));
const stableOrNewer = segments[0] > 0;
const newerThan103 = stableOrNewer || segments[1] >= 103;
const newerThan102 = stableOrNewer || segments[1] >= 102;
return {
arch: {
darwinUniversal: newerThan102,
droppedWindowsArmSupport: newerThan102,
standardizedNaming: newerThan103
},
os: {
renamedMacOS: newerThan103,
downcasedAll: newerThan103
}
};
}
+17 -3
View File
@@ -1,4 +1,14 @@
import fetch from 'node-fetch';
import fetch, {FetchError} from 'node-fetch';
interface BrewFormulaResponse {
versions: {
stable: string;
};
}
interface GitHubReleaseResponse {
tag_name: string;
}
export function getURL(org: string, repo: string, api: string): string {
let url = '';
@@ -15,12 +25,16 @@ export function getURL(org: string, repo: string, api: string): string {
export async function getLatestVersion(org: string, repo: string, api: string): Promise<string> {
const url = getURL(org, repo, api);
const response = await fetch(url);
if (!response.ok) {
throw new FetchError(`request to ${url} failed with status ${response.status}`, 'system');
}
const json = await response.json();
let latestVersion = '';
if (api === 'brew') {
latestVersion = json.versions.stable;
latestVersion = (json as BrewFormulaResponse).versions.stable;
} else if (api === 'github') {
latestVersion = json.tag_name;
latestVersion = (json as GitHubReleaseResponse).tag_name;
}
return latestVersion;
}
+6 -4
View File
@@ -1,11 +1,13 @@
export default function getOS(platform: string): string {
import {conventions} from './get-conventions';
export default function getOS(platform: string, conventions: conventions): string {
switch (platform) {
case 'linux':
return 'Linux';
return conventions.os.downcasedAll ? 'linux' : 'Linux';
case 'darwin':
return 'macOS';
return conventions.os.renamedMacOS ? 'darwin' : 'macOS';
case 'win32':
return 'Windows';
return conventions.os.downcasedAll ? 'windows' : 'Windows';
default:
throw new Error(`${platform} is not supported`);
}
+74 -9
View File
@@ -3,7 +3,9 @@ export default function getURL(
arch: string,
extended: string,
version: string
): string {
): string[] {
const downloadVersion = getDownloadVersion(version);
const extendedStr = (extended: string): string => {
if (extended === 'true') {
return 'extended_';
@@ -14,17 +16,80 @@ export default function getURL(
}
};
const ext = (os: string): string => {
if (os === 'Windows') {
return 'zip';
} else {
return 'tar.gz';
const lowerArch = (arch: string): string => {
switch (arch) {
case '64bit':
return 'amd64';
case 'ARM':
return 'arm';
case 'ARM64':
return 'arm64';
default:
return arch.toLowerCase();
}
};
const hugoName = `hugo_${extendedStr(extended)}${version}_${os}-${arch}`;
const baseURL = 'https://github.com/gohugoio/hugo/releases/download';
const url = `${baseURL}/v${version}/${hugoName}.${ext(os)}`;
const assetBase = `hugo_${extendedStr(extended)}${downloadVersion}_`;
const legacyVersionedAssetBase = `hugo_${extendedStr(extended)}v${downloadVersion}_`;
const assetBases = [assetBase, legacyVersionedAssetBase];
const assetURLs = (assetNames: string[]): string[] => {
return Array.from(new Set(assetNames)).map(assetName => {
return `${baseURL}/v${downloadVersion}/${assetName}`;
});
};
return url;
if (os === 'macOS') {
return assetURLs(
assetBases.flatMap(assetBase => [
`${assetBase}macOS-${arch}.tar.gz`,
`${assetBase}macOS-${arch}.zip`,
`${assetBase}macOS-all.tar.gz`,
`${assetBase}darwin-universal.tar.gz`,
`${assetBase}darwin-universal.pkg`
])
);
}
if (os === 'darwin') {
return assetURLs(
assetBases.flatMap(assetBase => [
`${assetBase}darwin-${arch}.tar.gz`,
`${assetBase}darwin-${arch}.pkg`
])
);
}
if (os === 'Windows' || os === 'windows') {
const assetPatterns =
os === 'windows'
? [`windows-${lowerArch(arch)}.zip`, `Windows-${arch}.zip`]
: [`Windows-${arch}.zip`, `windows-${lowerArch(arch)}.zip`];
return assetURLs(
assetBases.flatMap(assetBase => assetPatterns.map(asset => `${assetBase}${asset}`))
);
}
if (os === 'Linux' || os === 'linux') {
const assetPatterns =
os === 'linux'
? [`linux-${lowerArch(arch)}.tar.gz`, `Linux-${arch}.tar.gz`, `Linux_${arch}.tar.gz`]
: [`Linux-${arch}.tar.gz`, `Linux_${arch}.tar.gz`, `linux-${lowerArch(arch)}.tar.gz`];
return assetURLs(
assetBases.flatMap(assetBase => assetPatterns.map(asset => `${assetBase}${asset}`))
);
}
return assetURLs([`${assetBase}${os}-${arch}.tar.gz`]);
}
export function getDownloadVersion(version: string): string {
if (version === '0.139.5') {
// v0.139.5 has no release archives; Hugo publishes the same archives under v0.139.4.
return '0.139.4';
}
return version;
}
+2 -1
View File
@@ -5,6 +5,7 @@ import * as main from './main';
try {
await main.run();
} catch (e) {
core.setFailed(`Action failed with error ${e.message}`);
const message = e instanceof Error ? e.message : String(e);
core.setFailed(`Action failed with error ${message}`);
}
})();
+81 -15
View File
@@ -1,12 +1,19 @@
import * as core from '@actions/core';
import * as tc from '@actions/tool-cache';
import * as io from '@actions/io';
import * as exec from '@actions/exec';
import {getConventions} from './get-conventions';
import getOS from './get-os';
import getArch from './get-arch';
import getURL from './get-url';
import getURL, {getDownloadVersion} from './get-url';
import * as path from 'path';
import {Tool, Action} from './constants';
export interface DownloadedAsset {
path: string;
url: string;
}
export function getHomeDir(): string {
let homedir = '';
@@ -43,31 +50,90 @@ export async function createBinDir(workDir: string): Promise<string> {
return binDir;
}
export function isRetryableDownloadError(error: unknown): boolean {
const message = error instanceof Error ? error.message : `${error}`;
return (
message.includes('Unexpected HTTP response: 404') ||
message.includes('Code(404)') ||
(message.includes('404') && message.includes('Not Found'))
);
}
export function isWindowsAsset(assetURL: string): boolean {
return /(?:Windows[-_]|windows[-_])/.test(assetURL);
}
export async function downloadHugoAsset(toolURLs: string[]): Promise<DownloadedAsset> {
for (const toolURL of toolURLs) {
core.debug(`toolURL: ${toolURL}`);
try {
return {
path: await tc.downloadTool(toolURL),
url: toolURL
};
} catch (error) {
if (!isRetryableDownloadError(error)) {
throw error;
}
core.debug(`Hugo asset not found at ${toolURL}`);
}
}
throw new Error(
`Unable to find a compatible Hugo release asset for this runner. Tried:\n${toolURLs.join('\n')}`
);
}
export async function extractHugoAsset(
assetPath: string,
assetURL: string,
tempDir: string,
binDir: string
): Promise<void> {
let toolBin = '';
if (assetURL.endsWith('.zip')) {
const toolExtractedFolder: string = await tc.extractZip(assetPath, tempDir);
const toolCmd = isWindowsAsset(assetURL) ? `${Tool.CmdName}.exe` : Tool.CmdName;
toolBin = path.join(toolExtractedFolder, toolCmd);
} else if (assetURL.endsWith('.pkg')) {
const pkgExtractedFolder = path.join(tempDir, 'pkg');
await exec.exec('pkgutil', ['--expand-full', assetPath, pkgExtractedFolder]);
toolBin = path.join(pkgExtractedFolder, 'Payload', Tool.CmdName);
} else {
const toolExtractedFolder: string = await tc.extractTar(assetPath, tempDir);
toolBin = path.join(toolExtractedFolder, Tool.CmdName);
}
await io.mv(toolBin, binDir);
}
export async function installer(version: string): Promise<void> {
const extended: string = core.getInput('extended');
core.debug(`Hugo extended: ${extended}`);
const osName: string = getOS(process.platform);
const conventions = getConventions(version);
const osName: string = getOS(process.platform, conventions);
core.debug(`Operating System: ${osName}`);
const archName: string = getArch(process.arch);
const archName: string = getArch(process.arch, osName, conventions);
core.debug(`Processor Architecture: ${archName}`);
const toolURL: string = getURL(osName, archName, extended, version);
core.debug(`toolURL: ${toolURL}`);
const toolURLs: string[] = getURL(osName, archName, extended, version);
const downloadVersion = getDownloadVersion(version);
if (downloadVersion !== version) {
core.info(
`Hugo ${version} release does not publish archives; downloading v${downloadVersion} archives instead.`
);
}
const workDir = await createWorkDir();
const binDir = await createBinDir(workDir);
const tempDir = await createTempDir(workDir);
const toolAssets: string = await tc.downloadTool(toolURL);
let toolBin = '';
if (process.platform === 'win32') {
const toolExtractedFolder: string = await tc.extractZip(toolAssets, tempDir);
toolBin = `${toolExtractedFolder}/${Tool.CmdName}.exe`;
} else {
const toolExtractedFolder: string = await tc.extractTar(toolAssets, tempDir);
toolBin = `${toolExtractedFolder}/${Tool.CmdName}`;
}
await io.mv(toolBin, binDir);
const toolAsset: DownloadedAsset = await downloadHugoAsset(toolURLs);
await extractHugoAsset(toolAsset.path, toolAsset.url, tempDir, binDir);
}
+3 -2
View File
@@ -1,7 +1,8 @@
{
"compilerOptions": {
"lib": ["ES2019"],
"module": "commonjs",
"module": "ESNext",
"moduleResolution": "bundler",
"target": "ES2019",
"sourceMap": true,
"outDir": "./lib",
@@ -12,5 +13,5 @@
"esModuleInterop": true,
"resolveJsonModule": true
},
"exclude": ["node_modules", "**/*.test.ts"]
"exclude": ["node_modules", "__tests__"]
}