extension/tools/release: uncomment vsce package and fix README handling
This CL also adds a trivial test that checks -n output to see if the release command calls expected commands. And fix nightly release's README handling again. I hoped the new --readme-path flag can help us package README.md file in the repo root https://go-review.git.corp.google.com/c/vscode-go/+/556535 but it doesn't seem to work yet. Instead, we copy the README.md file to the extension directory. Also, fixes the image and content base uris. Update golang/vscode-go#3122 Change-Id: I6c79d34653346ef2e2b596f0ca4db1de16b79853 Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/556536 Commit-Queue: Hyang-Ah Hana Kim <hyangah@gmail.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Родитель
15be937e0f
Коммит
bd87b3a981
|
@ -96,7 +96,7 @@ prepare_nightly() {
|
|||
') > /tmp/package.json && cp /tmp/package.json extension/package.json
|
||||
|
||||
# Replace CHANGELOG.md with CHANGELOG.md + Release commit info.
|
||||
printf "**Release ${VER} @ ${COMMIT}** \n\n" | cat - CHANGELOG.md > /tmp/CHANGELOG.md.new && mv /tmp/CHANGELOG.md.new extension/CHANGELOG.md
|
||||
printf "**Release ${VER} @ ${COMMIT}** \n\n" | cat - extension/CHANGELOG.md > /tmp/CHANGELOG.md.new && mv /tmp/CHANGELOG.md.new extension/CHANGELOG.md
|
||||
# Replace the heading of README.md with the heading for Go Nightly.
|
||||
sed '/^# Go for Visual Studio Code$/d' README.md | cat build/nightly/README.md - > /tmp/README.md.new && mv /tmp/README.md.new README.md
|
||||
# Replace src/const.ts with build/nightly/const.ts.
|
||||
|
|
|
@ -77,7 +77,7 @@ artifacts:
|
|||
objects:
|
||||
location: 'gs://$PROJECT_ID/nightly'
|
||||
paths:
|
||||
- vscode-go/*.vsix
|
||||
- vscode-go/extension/*.vsix
|
||||
availableSecrets:
|
||||
secretManager:
|
||||
- versionName: projects/$PROJECT_ID/secrets/$_VSCE_TOKEN/versions/latest
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
],
|
||||
"scripts": {
|
||||
"clean": "rm -rf ./dist/* && rm -rf ./out/* && rm -rf ./bin/* && rm *.vsix",
|
||||
"package": "npx vsce package --readme-path ../README.md",
|
||||
"package": "cp ../README.md ./README.md && npx vsce package --baseContentUrl https://github.com/golang/vscode-go/raw/HEAD --baseImagesUrl https://github.com/golang/vscode-go/raw/HEAD",
|
||||
"vscode:prepublish": "npm run compile",
|
||||
"bundle": "esbuild src/goMain.ts debugAdapter=src/debugAdapter/goDebug.ts --bundle --outdir=dist --external:vscode --format=cjs --platform=node",
|
||||
"bundle-dev": "npm run bundle -- --sourcemap",
|
||||
|
|
|
@ -26,18 +26,24 @@ package main
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var flagN = flag.Bool("n", false, "print the underlying commands but do not run them")
|
||||
|
||||
func main() {
|
||||
if len(os.Args) != 2 {
|
||||
fatalf("usage: %s [package|publish]", os.Args[0])
|
||||
flag.Parse()
|
||||
if flag.NArg() != 1 {
|
||||
usage()
|
||||
os.Exit(1)
|
||||
}
|
||||
cmd := os.Args[1]
|
||||
cmd := flag.Arg(0)
|
||||
|
||||
checkWD()
|
||||
requireTools("jq", "npx", "gh", "git")
|
||||
|
@ -48,15 +54,22 @@ func main() {
|
|||
|
||||
switch cmd {
|
||||
case "package":
|
||||
buildPackage(version, vsix)
|
||||
buildPackage(version, tagName, vsix)
|
||||
case "publish":
|
||||
requireEnvVars("VSCE_PAT", "GITHUB_TOKEN")
|
||||
publish(tagName, vsix, isRC)
|
||||
default:
|
||||
fatalf("usage: %s [package|publish]", os.Args[0])
|
||||
usage()
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func usage() {
|
||||
fmt.Fprintf(os.Stderr, "Usage: %s <flags> [package|publish]\n\n", os.Args[0])
|
||||
fmt.Fprintln(os.Stderr, "Flags:")
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
|
||||
func fatalf(format string, args ...any) {
|
||||
fmt.Fprintf(os.Stderr, format, args...)
|
||||
fmt.Fprintf(os.Stderr, "\n")
|
||||
|
@ -119,44 +132,73 @@ func releaseVersionInfo() (tagName, version string, isPrerelease bool) {
|
|||
|
||||
cmd := exec.Command("jq", "-r", ".version", "package.json")
|
||||
cmd.Stderr = os.Stderr
|
||||
versionInPackageJSON, err := cmd.Output()
|
||||
if err != nil {
|
||||
var buf bytes.Buffer
|
||||
cmd.Stdout = &buf
|
||||
if err := commandRun(cmd); err != nil {
|
||||
fatalf("failed to read package.json version")
|
||||
}
|
||||
versionInPackageJSON := buf.Bytes()
|
||||
if *flagN {
|
||||
return tagName, mmp + label, isPrerelease
|
||||
}
|
||||
if got := string(bytes.TrimSpace(versionInPackageJSON)); got != mmp {
|
||||
fatalf("package.json version %q does not match TAG_NAME %q", got, tagName)
|
||||
}
|
||||
|
||||
return tagName, mmp + label, isPrerelease
|
||||
}
|
||||
|
||||
func commandRun(cmd *exec.Cmd) error {
|
||||
if *flagN {
|
||||
if cmd.Dir != "" {
|
||||
fmt.Fprintf(os.Stderr, "cd %v\n", cmd.Dir)
|
||||
}
|
||||
fmt.Fprintf(os.Stderr, "%v\n", strings.Join(cmd.Args, " "))
|
||||
return nil
|
||||
}
|
||||
return cmd.Run()
|
||||
}
|
||||
|
||||
func copy(dst, src string) error {
|
||||
if *flagN {
|
||||
fmt.Fprintf(os.Stderr, "cp %s %s\n", src, dst)
|
||||
return nil
|
||||
}
|
||||
data, err := os.ReadFile(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(dst, data, 0644)
|
||||
}
|
||||
|
||||
// buildPackage builds the extension of the given version, using npx vsce package.
|
||||
func buildPackage(version, output string) {
|
||||
func buildPackage(version, tagName, output string) {
|
||||
if err := copy("README.md", filepath.Join("..", "README.md")); err != nil {
|
||||
fatalf("failed to copy README.md: %v", err)
|
||||
}
|
||||
// build the package.
|
||||
cmd := exec.Command("npx", "vsce", "package",
|
||||
"-o", output,
|
||||
"--baseContentUrl", "https://github.com/golang/vscode-go",
|
||||
"--baseImagesUrl", "https://github.com/golang/vscode-go",
|
||||
"--baseContentUrl", "https://github.com/golang/vscode-go/raw/"+tagName,
|
||||
"--baseImagesUrl", "https://github.com/golang/vscode-go/raw/"+tagName,
|
||||
"--no-update-package-json",
|
||||
"--no-git-tag-version",
|
||||
version)
|
||||
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
fatalf("failed to build package")
|
||||
}
|
||||
|
||||
cmd = exec.Command("git", "add", output)
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
fatalf("failed to build package")
|
||||
if err := commandRun(cmd); err != nil {
|
||||
fatalf("failed to build package: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// publish publishes the extension to the VS Code Marketplace and GitHub, using npx vsce and gh release create.
|
||||
func publish(tagName, packageFile string, isPrerelease bool) {
|
||||
// check if the package file exists.
|
||||
if _, err := os.Stat(packageFile); os.IsNotExist(err) {
|
||||
fatalf("package file %q does not exist. Did you run 'go run build/release.go package'?", packageFile)
|
||||
if *flagN {
|
||||
fmt.Fprintf(os.Stderr, "stat %s\n", packageFile)
|
||||
} else {
|
||||
if _, err := os.Stat(packageFile); os.IsNotExist(err) {
|
||||
fatalf("package file %q does not exist. Did you run 'go run build/release.go package'?", packageFile)
|
||||
}
|
||||
}
|
||||
|
||||
// publish release to GitHub. This will create a draft release - manually publish it after reviewing the draft.
|
||||
|
@ -170,23 +212,20 @@ func publish(tagName, packageFile string, isPrerelease bool) {
|
|||
ghArgs = append(ghArgs, tagName, packageFile)
|
||||
cmd := exec.Command("gh", ghArgs...)
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
fatalf("failed to publish release")
|
||||
if err := commandRun(cmd); err != nil {
|
||||
fatalf("failed to publish release: %v", err)
|
||||
}
|
||||
|
||||
if isPrerelease {
|
||||
return // TODO: release with the -pre-release flag if isPrerelease is set.
|
||||
}
|
||||
|
||||
/* TODO(hyangah): uncomment this to finalize the release workflow migration.
|
||||
npxVsceArgs := []string{"vsce", "publish", "-i", packageFile}
|
||||
|
||||
cmd2 := exec.Command("npx", npxVsceArgs...)
|
||||
cmd2.Stderr = os.Stderr
|
||||
if err := cmd2.Run(); err != nil {
|
||||
if err := commandRun(cmd2); err != nil {
|
||||
fatalf("failed to publish release")
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// commitSHA returns COMMIT_SHA environment variable, or the commit SHA of the current branch.
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package main_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"flag"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
)
|
||||
|
||||
var flagUpdate = flag.Bool("update", false, "update golden files")
|
||||
|
||||
func TestRelease(t *testing.T) {
|
||||
cmd := exec.Command("go", "list", "-m", "-f", "{{.Dir}}")
|
||||
cmd.Env = append(os.Environ(), "GOWORK=off")
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
t.Fatal("failed to get module root:", err)
|
||||
}
|
||||
moduleRoot := string(bytes.TrimSpace(out))
|
||||
|
||||
for _, command := range []string{"package", "publish"} {
|
||||
t.Run(command, func(t *testing.T) {
|
||||
testRelease(t, moduleRoot, command)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func testRelease(t *testing.T, moduleRoot, command string) {
|
||||
cmd := exec.Command("go", "run", "-C", moduleRoot, "tools/release/release.go", "-n", command)
|
||||
cmd.Env = append(os.Environ(),
|
||||
// Provide dummy environment variables required to run release.go commands.
|
||||
"TAG_NAME=v0.0.0", // release tag
|
||||
"GITHUB_TOKEN=dummy", // github token needed to post release notes
|
||||
"VSCE_PAT=dummy", // vsce token needed to publish the extension
|
||||
"COMMIT_SHA=4893cd984d190bdf2cd65e11c425b42819ae6f57", // bogus commit SHA used to post release notes
|
||||
)
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("failed to run release package: %v", err)
|
||||
}
|
||||
if *flagUpdate {
|
||||
if err := os.WriteFile(filepath.Join("testdata", command+".golden"), output, 0644); err != nil {
|
||||
t.Fatal("failed to write golden file:", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
golden, err := os.ReadFile(filepath.Join("testdata", command+".golden"))
|
||||
if err != nil {
|
||||
t.Fatal("failed to read golden file:", err)
|
||||
}
|
||||
if diff := cmp.Diff(golden, output); diff != "" {
|
||||
t.Error("release package output mismatch (-want +got):\n", diff)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
jq -r .version package.json
|
||||
cp ../README.md README.md
|
||||
npx vsce package -o go-0.0.0.vsix --baseContentUrl https://github.com/golang/vscode-go/raw/v0.0.0 --baseImagesUrl https://github.com/golang/vscode-go/raw/v0.0.0 --no-update-package-json --no-git-tag-version 0.0.0
|
|
@ -0,0 +1,5 @@
|
|||
jq -r .version package.json
|
||||
stat go-0.0.0.vsix
|
||||
release create --generate-notes --target 4893cd984d190bdf2cd65e11c425b42819ae6f57 --title Release v0.0.0 --draft
|
||||
gh release create --generate-notes --target 4893cd984d190bdf2cd65e11c425b42819ae6f57 --title Release v0.0.0 --draft -R github.com/golang/vscode-go v0.0.0 go-0.0.0.vsix
|
||||
npx vsce publish -i go-0.0.0.vsix
|
Загрузка…
Ссылка в новой задаче