Skip to content

Commit a57979b

Browse files
committed
update site links;retries on publish
1 parent a25007c commit a57979b

13 files changed

Lines changed: 188 additions & 35 deletions

File tree

‎.github/workflows/publish.yml‎

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ on:
1111
type: boolean
1212
default: false
1313
required: true
14+
verify_only:
15+
description: Verify existing public packages without rebuilding or uploading
16+
type: boolean
17+
default: false
18+
required: true
1419

1520
permissions:
1621
contents: read
@@ -21,7 +26,7 @@ concurrency:
2126

2227
jobs:
2328
support:
24-
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
29+
if: ${{ !inputs.verify_only && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) }}
2530
runs-on: ubuntu-latest
2631
steps:
2732
- uses: actions/checkout@v7
@@ -38,7 +43,7 @@ jobs:
3843
path: artifacts/nuget-release/0.1.0/public-support/logs/
3944

4045
validate:
41-
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
46+
if: ${{ !inputs.verify_only && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) }}
4247
runs-on: ubuntu-latest
4348
steps:
4449
- uses: actions/checkout@v7
@@ -67,7 +72,7 @@ jobs:
6772
artifacts/nuget-release/0.1.0/pack-logs/
6873
6974
publish:
70-
if: (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) || (github.event_name == 'workflow_dispatch' && inputs.publish)
75+
if: ${{ !inputs.verify_only && ((github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) || (github.event_name == 'workflow_dispatch' && inputs.publish)) }}
7176
needs: [validate, support]
7277
runs-on: ubuntu-latest
7378
environment: production
@@ -94,7 +99,36 @@ jobs:
9499
env:
95100
NUGET_API_KEY: ${{ steps.login.outputs.NUGET_API_KEY }}
96101
run: dotnet run --project tools/NuGetRelease -- publish --confirm 0.1.0
102+
- name: Retain publication logs
103+
if: always()
104+
uses: actions/upload-artifact@v7
105+
with:
106+
name: nuget-publication-logs
107+
path: artifacts/nuget-release/0.1.0/publish-logs/
108+
109+
verify-public:
110+
if: >-
111+
always() && !cancelled() &&
112+
(needs.publish.result == 'success' ||
113+
(github.event_name == 'workflow_dispatch' && inputs.verify_only && github.ref == 'refs/heads/main'))
114+
needs: publish
115+
runs-on: ubuntu-latest
116+
steps:
117+
- uses: actions/checkout@v7
118+
- uses: actions/setup-dotnet@v6
119+
with:
120+
global-json-file: global.json
97121
- name: Confirm public availability
98-
run: dotnet run --project tools/NuGetRelease -- availability
122+
timeout-minutes: 65
123+
run: dotnet run --project tools/NuGetRelease -- availability --wait-minutes 60
99124
- name: Compile against NuGet.org alone
100125
run: dotnet run --project tools/NuGetRelease -- examples --fable --public
126+
- name: Retain public consumer evidence
127+
if: always()
128+
uses: actions/upload-artifact@v7
129+
with:
130+
name: nuget-public-consumers
131+
path: |
132+
artifacts/nuget-release/0.1.0/consumers-public/results.json
133+
artifacts/nuget-release/0.1.0/consumers-public/logs/
134+
artifacts/nuget-release/0.1.0/consumers-public/resolved-packages/

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ let listAccounts (apiToken: string) =
120120

121121
[`tests/HawaiiApi/Program.fs`](tests/HawaiiApi/Program.fs) exercises the same clients against a loopback server, including a multipart asset upload.
122122

123-
## NuGet release preparation
123+
## NuGet packages
124124

125-
The first 0.1.0 release is being prepared. The [package catalog](https://fsprojects.github.io/FSharp.CloudEdge/libraries/packages/) lists the intended package IDs and URLs. The [maintainer release guide](docs/nuget-release.md) covers publisher access, the F#/.NET release tool, and the current upstream Fable packaging blocker. Public installation is pending those checks and publication.
125+
**FSharp.CloudEdge 0.1.0 is available on NuGet.** [Browse all packages](https://www.nuget.org/packages?q=FSharp.CloudEdge), or use the [package catalog](https://fsprojects.github.io/FSharp.CloudEdge/libraries/packages/) for individual package IDs and versioned links. The [installation guide](https://fsprojects.github.io/FSharp.CloudEdge/guide/packages/) explains which packages to reference; examples use `0.1.*` to accept patches. The [maintainer release guide](docs/nuget-release.md) covers publisher access and the F#/.NET release tooling.
126126

127127
## Local Build
128128

‎docs/nuget-release.md‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# NuGet release and publisher setup
22

3-
FSharp.CloudEdge's first release targets **0.1.0** for the 47 projects selected in `FSharp.CloudEdge.Bindings.slnx`. **GitHub Actions builds, validates, and publishes the packages.** Like Furnace, the workflow supports `v*` release tags and manual dispatch. A `v0.1.0` tag must match the configured package version. Local commands below reproduce the checks when investigating a failure; maintainers do not need to upload packages manually.
3+
FSharp.CloudEdge **0.1.0** is published for the 47 projects selected in `FSharp.CloudEdge.Bindings.slnx`. [Browse the packages on NuGet](https://www.nuget.org/packages?q=FSharp.CloudEdge). **GitHub Actions builds, validates, and publishes the packages.** Like Furnace, the workflow supports `v*` release tags and manual dispatch. A release tag must match the configured package version. Local commands below reproduce the checks when investigating a failure; maintainers do not need to upload packages manually.
44

55
NuGet account ownership and publishing authorization are setup tasks independent of GitHub repository administration. This workflow uses **NuGet Trusted Publishing** with GitHub OIDC. GitHub obtains temporary publishing credentials for each run.
66

77
## Release dependencies and validation
88

99
The release uses the published **0.1.0** versions of `Xantham.Fable.Core` and `Xantham.Fable.Core.TS` from nuget.org. `publicDependencies` in `config/nuget-release.json` records those versions. Publishing CloudEdge does not require publishing or modifying Xantham.
1010

11-
Release validation builds the 19 site example projects against the candidate CloudEdge packages and public external dependencies, then compiles the Fable examples and checks the site's code snippets. Isolated package caches and resolved-package reports make those checks reproducible. The intended first CloudEdge release remains **0.1.0** until its packages have been published successfully.
11+
Release validation builds the 19 site example projects against the candidate CloudEdge packages and public external dependencies, then compiles the Fable examples and checks the site's code snippets. Isolated package caches and resolved-package reports make those checks reproducible. Verification of the published **0.1.0** release uses the same consumers with nuget.org as their only source.
1212

1313
The `support` check restores both public Xantham packages, compiles `tests/SupportPackage/Smoke.fs` with .NET and Fable, and executes its key-value and indexer checks in JavaScript. This covers the support bindings used by CloudEdge; upstream inline helper functions are outside this release gate.
1414

@@ -48,7 +48,7 @@ Sign into NuGet.org as **houstonhaynes** and create a **Trusted Publishing** pol
4848
| Scope | Push new packages and package versions |
4949
| Glob Patterns and Packages | `FSharp.CloudEdge.*` |
5050

51-
Enter the filename only, without `.github/workflows/`. Enter `FSharp.CloudEdge.*` as one line in **Glob Patterns and Packages**. The first release creates 47 new package IDs, so the policy must permit new packages as well as new versions. [NuGet Trusted Publishing setup](https://learn.microsoft.com/en-us/nuget/nuget-org/trusted-publishing).
51+
Enter the filename only, without `.github/workflows/`. Enter `FSharp.CloudEdge.*` as one line in **Glob Patterns and Packages**. The policy covers all 47 package IDs and permits new packages as well as new versions. [NuGet Trusted Publishing setup](https://learn.microsoft.com/en-us/nuget/nuget-org/trusted-publishing).
5252

5353
In **fsprojects/FSharp.CloudEdge → Settings → Environments**, create the **`production` environment**, matching the policy and publication job. Configure environment branch/tag rules to permit `main` and `v*` release tags as appropriate. The repository owner is `fsprojects`; the NuGet package owner and login user are `houstonhaynes`. These fields identify different things.
5454

@@ -86,13 +86,15 @@ Inspect the README, license, dependency versions, source assets, and emitted imp
8686

8787
## Publish and verify the public feed
8888

89+
**0.1.0 has already been uploaded.** Use **verify_only** to check that release again. The upload instructions below apply to a new, unpublished release version.
90+
8991
Run the **NuGet** workflow on `main` with **publish disabled** first. It builds candidates, checks consumers, and uploads the packages and verification evidence as an artifact. Fix failures before requesting the actual release.
9092

9193
After committing and merging fixes into `main`, use **Actions → NuGet → Run workflow**, choose `main`, and leave **publish** unchecked. The equivalent command is `gh workflow run publish.yml --ref main -f publish=false`. Here `publish.yml` is the workflow filename and `-f publish=false` supplies its boolean input. Rerunning the old tag's job uses the old commit; dispatching on `main` picks up the merged fixes without changing the package version or moving the tag. Enable **publish** only when ready to upload.
9294

9395
GitHub runs the public support binding check alongside candidate package and consumer validation. The publication job requires both jobs to succeed. Package compilation uses two MSBuild processes on the standard runner; uploads remain ordered by dependency.
9496

95-
When account ownership, the Trusted Publishing policy, and candidate checks are complete, push the release tag **`v0.1.0`**, or run the workflow manually with **publish enabled**. GitHub repeats validation, obtains temporary credentials, then uploads packages in the manifest's dependency order. A partial upload is possible: NuGet publication is not a transaction across 47 packages. The workflow stops on an upload error rather than silently skipping an existing version. Inspect ownership, versions, and package contents before deciding how to resume.
97+
For a new release, when account ownership, the Trusted Publishing policy, and candidate checks are complete, push the matching **`v*` release tag**, or run the workflow manually with **publish enabled**. GitHub repeats validation, obtains temporary credentials, then uploads packages in the manifest's dependency order. A partial upload is possible: NuGet publication is not a transaction across 47 packages. The workflow stops on an upload error rather than silently skipping an existing version. Inspect ownership, versions, and package contents before deciding how to resume.
9698

9799
NuGet package versions are immutable. Do not publish a placeholder `0.1.0` as a test. If an uploaded version is wrong, unlisting does not free that version for replacement; publish a corrected version. [NuGet publication behavior](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/publish-nuget-package).
98100

@@ -103,6 +105,8 @@ dotnet run --project tools/NuGetRelease -- availability
103105
dotnet run --project tools/NuGetRelease -- examples --fable --public
104106
```
105107

106-
The workflow performs these public checks after pushing. A processing delay can make the checks fail even after an upload succeeds. Resolve public availability and repeat the checks before announcing success; do not republish different bytes with the same version.
108+
The workflow performs these public checks in a separate `verify-public` job after pushing. Availability checks wait up to 60 minutes for NuGet processing, retrying pending packages and temporary network/server failures every 30 seconds. `availability` alone checks once; `availability --wait-minutes 60` enables the same wait locally. NuGet validation and indexing are asynchronous after a successful upload. [NuGet processing](https://learn.microsoft.com/en-us/nuget/nuget-org/publish-a-package#package-validation-and-indexing).
109+
110+
If public verification times out after successful uploads, rerun only the failed verification job. To verify packages from a previous run, dispatch the workflow on `main` with **verify_only** checked; that mode skips candidate builds, authentication, and uploads, even if **publish** is also checked. The command is `gh workflow run publish.yml --ref main -f verify_only=true`. Publication logs and public consumer results are retained as separate artifacts. A verification failure does not undo an upload or require a version bump; do not repeat the upload of an existing version.
107111

108-
Finally, update the release-availability paragraph in `site/content/guide/packages.md`, deploy the site, and announce the release. Package IDs, `0.1.0` references, and NuGet URLs can be prepared beforehand with that pending-release notice. The beginner path should not claim public installation works until the public consumer checks pass.
112+
For future releases, update the availability paragraph in `site/content/guide/packages.md` and the catalog's versioned NuGet links after public verification, then deploy the site and announce the release.

‎site/Site.fs‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ open Partas.Nacara.Theme
88

99
let baseUrl = "/FSharp.CloudEdge/"
1010

11+
let private nugetUrl = "https://www.nuget.org/packages?q=FSharp.CloudEdge"
12+
1113
let private themeCss name =
1214
File.ReadAllText (Path.Combine (__SOURCE_DIRECTORY__, "theme", name))
1315

@@ -262,7 +264,11 @@ let theme =
262264
Menu.page "libraries/control-plane/clients.md"
263265
]
264266
]
265-
|> Theme.navbarEnd [ NavbarIcon ("GitHub", "https://github.com/fsprojects/FSharp.CloudEdge", Icons.github) ]
267+
|> Theme.navbarEnd
268+
[
269+
NavbarLink ("NuGet", nugetUrl)
270+
NavbarIcon ("GitHub", "https://github.com/fsprojects/FSharp.CloudEdge", Icons.github)
271+
]
266272
|> Theme.editUrl "https://github.com/fsprojects/FSharp.CloudEdge/edit/main/site"
267273
|> Theme.lightTokens lightColours
268274
|> Theme.darkTokens darkColours
@@ -275,6 +281,8 @@ let theme =
275281
Html.p
276282
[
277283
Html.text "FSharp.CloudEdge · MIT · "
284+
Html.a [ prop.href nugetUrl; prop.text "NuGet" ]
285+
Html.text " · "
278286
Html.a [ prop.href "https://github.com/fsprojects/FSharp.CloudEdge"; prop.text "GitHub" ]
279287
Html.text " · Built with Nacara"
280288
]

‎site/content/guide/first-worker.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ order: 4
1414

1515
## Project Folder
1616

17-
Create the application anywhere convenient. It restores `FSharp.CloudEdge.Runtime.Workers` from the `0.1.*` patch series on NuGet; no sibling library checkout is required. See [Packages](packages.md) for release availability and candidate-feed testing.
17+
Create the application anywhere convenient. It restores [`FSharp.CloudEdge.Runtime.Workers`](https://www.nuget.org/packages/FSharp.CloudEdge.Runtime.Workers) from the `0.1.*` patch series on NuGet; no sibling library checkout is required. See [Packages](packages.md) for installation guidance and links to the full package family.
1818

1919
1. Open a terminal in the folder where you keep your projects.
2020
2. Create `hello-worker` and enter it.

‎site/content/guide/packages.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ Application projects reference the FSharp.CloudEdge libraries by NuGet package I
88

99
## Release availability
1010

11-
The first `0.1.0` release is being prepared. Package links and examples name the intended public versions; they do not assert that publication has completed. The release uses the published `Xantham.Fable.Core` and `Xantham.Fable.Core.TS` **0.1.0** packages from nuget.org. Until CloudEdge publication and public validation are complete, use the [contributor source build](local-build.md).
11+
All **47 packages** in the **0.1.0** release are published on nuget.org. [Browse all FSharp.CloudEdge packages on NuGet](https://www.nuget.org/packages?q=FSharp.CloudEdge), or use the [package catalog](../libraries/packages.md) to find a specific library.
1212

13-
The release order is: validate candidate packages and consumers, publish dependencies before their consumers, confirm every `0.1.0` package restores from nuget.org, then announce availability. A package page appearing in search is separate from a clean restore succeeding.
13+
The release uses the published `Xantham.Fable.Core` and `Xantham.Fable.Core.TS` **0.1.0** packages. Application projects restore these dependencies through NuGet; contributors can use the [source build](local-build.md) when regenerating or changing the bindings.
1414

1515
## Add the package your application uses
1616

@@ -34,7 +34,7 @@ The NuGet feed is `https://api.nuget.org/v3/index.json`. A package page such as
3434

3535
## Fable and npm dependencies
3636

37-
CloudEdge's runtime and Fable support candidates contain their F# source as well as .NET assemblies. Fable uses that source when compiling the application to JavaScript. NuGet restores the published Xantham support dependencies transitively. Release validation compiles the site's actual examples against this package combination. Application developers do not run the binding generators.
37+
CloudEdge's runtime and Fable support packages contain their F# source as well as .NET assemblies. Fable uses that source when compiling the application to JavaScript. NuGet restores the published Xantham support dependencies transitively. Release validation compiles the site's actual examples against this package combination. Application developers do not run the binding generators.
3838

3939
NuGet does not install the upstream JavaScript SDKs. Where an example imports an npm SDK, install the exact package version shown on its library page. Worker-native APIs such as `Request`, D1, and R2 are supplied by the Workers runtime. The platform type declarations describe those APIs; they are not a JavaScript runtime implementation to bundle.
4040

‎site/content/index.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ layout: splash
1414
<div class="ce-actions">
1515
<a class="ce-btn ce-btn--primary" href="#building-blocks">See what you can build <svg aria-hidden="true" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14"/><path d="m19 12-7 7-7-7"/></svg></a>
1616
<a class="ce-btn ce-btn--secondary" href="/FSharp.CloudEdge/libraries/">Library line-up</a>
17+
<a class="ce-btn ce-btn--secondary" href="https://www.nuget.org/packages?q=FSharp.CloudEdge">Browse packages on NuGet</a>
1718
</div>
1819
</div>
1920
<figure class="ce-code" aria-label="A Durable Object that counts requests, written in F#">

‎site/content/libraries/index.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ The capability pages describe integration boundaries and areas that need runtime
3030

3131
See [installation and release availability](../guide/packages.md).
3232

33-
The [NuGet package catalog](packages.md) lists every package ID and its versioned `0.1.0` URL.
33+
[Browse all FSharp.CloudEdge packages on NuGet](https://www.nuget.org/packages?q=FSharp.CloudEdge). The [package catalog](packages.md) lists every package ID and its versioned `0.1.0` URL.

‎site/content/libraries/packages.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ title: NuGet Package Catalog
33
description: Versioned package IDs and links for the FSharp.CloudEdge 0.1.0 release.
44
---
55

6-
The selected release contains **47 packages**, all version **0.1.0**: 31 runtime bindings, three AI contract libraries, one Workers support library, shared API models, and eleven control-plane clients. These links name the intended public package versions. Check [release availability](../guide/packages.md#release-availability) before restoring the first release.
6+
The **0.1.0** release contains **47 published packages**: 31 runtime bindings, three AI contract libraries, one Workers support library, shared API models, and eleven control-plane clients.
7+
8+
[Browse all FSharp.CloudEdge packages on NuGet](https://www.nuget.org/packages?q=FSharp.CloudEdge). The links below open each package's **0.1.0** page; the [installation guide](../guide/packages.md) shows how to add them to your project.
79

810
| Package ID | Version | Target | Consumer |
911
| --- | --- | --- | --- |

0 commit comments

Comments
 (0)