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:
Hana (Hyang-Ah) Kim 2024-01-17 16:27:48 -05:00 коммит произвёл Hyang-Ah Hana Kim
Родитель 15be937e0f
Коммит bd87b3a981
7 изменённых файлов: 139 добавлений и 30 удалений

Просмотреть файл

@ -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)
}
}

3
extension/tools/release/testdata/package.golden поставляемый Normal file
Просмотреть файл

@ -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

5
extension/tools/release/testdata/publish.golden поставляемый Normal file
Просмотреть файл

@ -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