Skip to content

Commit ca0ffab

Browse files
Feature: Make Publish Action Prerelease-Aware (#235)
1 parent ab8ab3b commit ca0ffab

File tree

7 files changed

+98
-11
lines changed

7 files changed

+98
-11
lines changed

.github/workflows/sdk-publish.yaml

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,19 @@ jobs:
264264
- name: Publish
265265
env:
266266
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
267-
run: npm publish --access public
267+
run: |
268+
VERSION=$(npm view . version)
269+
echo "Detected version: $VERSION"
270+
271+
if [[ "$VERSION" == *"-"* ]]; then
272+
PRERELEASE=${VERSION#*-}
273+
TAG=${PRERELEASE%%.*}
274+
echo "Prerelease detected; publishing under dist-tag: $TAG"
275+
npm publish --tag "$TAG" --access public
276+
else
277+
echo "Official release detected; publishing under 'latest'"
278+
npm publish --access public
279+
fi
268280
- name: Build & Upload MCP Server Binaries
269281
if: ${{ needs.release.outputs.mcp_release_typescript != '' }}
270282
env:
@@ -357,7 +369,19 @@ jobs:
357369
- run: npm install
358370
- env:
359371
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
360-
run: npm publish --access public
372+
run: |
373+
VERSION=$(npm view . version)
374+
echo "Detected version: $VERSION"
375+
376+
if [[ "$VERSION" == *"-"* ]]; then
377+
PRERELEASE=${VERSION#*-}
378+
TAG=${PRERELEASE%%.*}
379+
echo "Prerelease detected; publishing under dist-tag: $TAG"
380+
npm publish --tag "$TAG" --access public
381+
else
382+
echo "Official release detected; publishing under 'latest'"
383+
npm publish --access public
384+
fi
361385
- name: Build & Upload MCP Server Binaries
362386
if: ${{ needs.release.outputs.mcp_release_typescript != '' }}
363387
env:

.github/workflows/workflow-executor.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,19 @@ jobs:
393393
- name: Publish
394394
env:
395395
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
396-
run: npm publish --access public
396+
run: |
397+
VERSION=$(npm view . version)
398+
echo "Detected version: $VERSION"
399+
400+
if [[ "$VERSION" == *"-"* ]]; then
401+
PRERELEASE=${VERSION#*-}
402+
TAG=${PRERELEASE%%.*}
403+
echo "Prerelease detected; publishing under dist-tag: $TAG"
404+
npm publish --tag "$TAG" --access public
405+
else
406+
echo "Official release detected; publishing under 'latest'"
407+
npm publish --access public
408+
fi
397409
- id: publish-event
398410
uses: speakeasy-api/sdk-generation-action@v15
399411
if: always()

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ require (
77
github.com/go-git/go-git/v5 v5.11.0
88
github.com/google/go-github/v63 v63.0.0
99
github.com/google/uuid v1.6.0
10-
github.com/hashicorp/go-version v1.6.0
10+
github.com/hashicorp/go-version v1.7.0
1111
github.com/joho/godotenv v1.5.1
1212
github.com/pb33f/libopenapi v0.15.14
1313
github.com/pkg/errors v0.9.1
1414
github.com/speakeasy-api/git-diff-parser v0.0.3
1515
github.com/speakeasy-api/sdk-gen-config v1.31.3
1616
github.com/speakeasy-api/speakeasy-client-sdk-go/v3 v3.15.4
1717
github.com/speakeasy-api/versioning-reports v0.6.1
18-
github.com/stretchr/testify v1.9.0
18+
github.com/stretchr/testify v1.10.0
1919
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a
2020
golang.org/x/oauth2 v0.11.0
2121
gopkg.in/yaml.v3 v3.0.1

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17
8181
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
8282
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
8383
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
84-
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
85-
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
84+
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
85+
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
8686
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
8787
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
8888
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
@@ -148,8 +148,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
148148
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
149149
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
150150
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
151-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
152-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
151+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
152+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
153153
github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk=
154154
github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ=
155155
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=

internal/git/releases.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,19 @@ func (g *Git) CreateRelease(oldReleaseContent string, languages map[string]relea
105105
releaseBody = targetSpecificReleaseNotes.GetReleaseNotesForTarget(lang)
106106
fmt.Println(fmt.Sprintf("Release Notes Body: \n%s\n", releaseBody))
107107
}
108-
_, _, err = g.client.Repositories.CreateRelease(context.Background(), os.Getenv("GITHUB_REPOSITORY_OWNER"), GetRepo(), &github.RepositoryRelease{
108+
109+
release := &github.RepositoryRelease{
109110
TagName: tagName,
110111
TargetCommitish: github.String(commitHash),
111112
Name: github.String(fmt.Sprintf("%s - %s - %s", lang, tag, environment.GetInvokeTime().Format("2006-01-02 15:04:05"))),
112113
Body: github.String(fmt.Sprintf(`# Generated by Speakeasy CLI%s`, releaseBody)),
113-
})
114+
}
115+
if info.IsPrerelease() {
116+
release.Prerelease = github.Bool(true)
117+
// prereleases shouldn’t become the “latest”:
118+
release.MakeLatest = github.String("false")
119+
}
120+
_, _, err = g.client.Repositories.CreateRelease(context.Background(), os.Getenv("GITHUB_REPOSITORY_OWNER"), GetRepo(), release)
114121

115122
if err != nil {
116123
if release, _, err := g.client.Repositories.GetReleaseByTag(context.Background(), os.Getenv("GITHUB_REPOSITORY_OWNER"), GetRepo(), *tagName); err == nil && release != nil {

pkg/releases/releases.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"regexp"
99
"strings"
1010

11+
version "github.com/hashicorp/go-version"
1112
config "github.com/speakeasy-api/sdk-gen-config"
1213
"github.com/speakeasy-api/sdk-generation-action/internal/environment"
1314
"github.com/speakeasy-api/sdk-generation-action/internal/logging"
@@ -55,6 +56,21 @@ type ReleasesInfo struct {
5556
LanguagesGenerated map[string]GenerationInfo
5657
}
5758

59+
func (l LanguageReleaseInfo) IsPrerelease() bool {
60+
logging.Info("version is %v ", l.Version)
61+
v, err := version.NewVersion(l.Version)
62+
if err != nil {
63+
logging.Error("error parsing version when deciding if it is a prerelease. Therefore assuming it is not a prerelease. Version is %v. Error details: %v", l.Version, err)
64+
return false
65+
}
66+
logging.Info("prerelease info from go lib %v", v.Prerelease())
67+
if v.Prerelease() != "" {
68+
// If a prerelease info was found it means its a prerelease
69+
return true
70+
}
71+
return false
72+
}
73+
5874
// This representation is used when adding body to Github releases
5975
func (r ReleasesInfo) String() string {
6076
generationOutput := []string{}

pkg/releases/releases_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,3 +440,31 @@ Based on:
440440
LanguagesGenerated: map[string]releases.GenerationInfo{},
441441
}, *info)
442442
}
443+
444+
func TestLanguageReleaseInfo_IsPrerelease(t *testing.T) {
445+
cases := []struct {
446+
version string
447+
want bool
448+
}{
449+
{"1.2.3", false},
450+
{"v1.2.3", false},
451+
{"v1.2", false},
452+
{"1.2", false},
453+
{"1.2.3-alpha", true},
454+
{"1.2.3-alpha.1", true},
455+
{"v1.2.3-beta", true},
456+
{"2.0.0-BETA.2", true},
457+
{"3.0.0-rc.1", true},
458+
{"3.0.0-rc", true},
459+
{"3.0.0-rc-1", true},
460+
{"1.2.3a1", true},
461+
{"1.2.4b1", true},
462+
{"1.2.5rc1", true},
463+
}
464+
465+
for _, c := range cases {
466+
l := releases.LanguageReleaseInfo{Version: c.version}
467+
got := l.IsPrerelease()
468+
assert.Equal(t, c.want, got, "Version %s: expected %v, got %v", c.version, c.want, got)
469+
}
470+
}

0 commit comments

Comments
 (0)