# This test checks that VCS information is stamped into Go binaries even when # the current commit is signed and the use has configured git to display commit # signatures. [!exec:git] skip [!exec:gpg] skip [short] skip env GOBIN=$GOPATH/bin env GNUPGHOME=$WORK/.gpupg mkdir $GNUPGHOME chmod 0700 $GNUPGHOME # Create GPG key exec gpg --batch --passphrase '' --quick-generate-key gopher@golang.org exec gpg --list-secret-keys --with-colons gopher@golang.org cp stdout keyinfo.txt go run extract_key_id.go keyinfo.txt cp stdout keyid.txt # Initialize repo cd repo/ exec git init exec git config user.email gopher@golang.org exec git config user.name 'J.R. Gopher' exec git config --add log.showSignature true go run ../configure_signing_key.go ../keyid.txt # Create signed commit cd a exec git add -A exec git commit -m 'initial commit' --gpg-sign exec git log # Verify commit signature does not interfere with versioning go install go version -m $GOBIN/a stdout '^\tbuild\tvcs\.revision=' stdout '^\tbuild\tvcs\.time=' stdout '^\tbuild\tvcs\.modified=false$' -- repo/README -- Far out in the uncharted backwaters of the unfashionable end of the western spiral arm of the Galaxy lies a small, unregarded yellow sun. -- repo/a/go.mod -- module example.com/a go 1.18 -- repo/a/a.go -- package main func main() {} -- extract_key_id.go -- package main import "fmt" import "io/ioutil" import "os" import "strings" func main() { err := run(os.Args[1]) if err != nil { panic(err) } } func run(keyInfoFilePath string) error { contents, err := ioutil.ReadFile(keyInfoFilePath) if err != nil { return err } lines := strings.Split(string(contents), "\n") for _, line := range lines { fields := strings.Split(line, ":") if fields[0] == "sec" { fmt.Print(fields[4]) return nil } } return fmt.Errorf("key ID not found in: %s", keyInfoFilePath) } -- configure_signing_key.go -- package main import "io/ioutil" import "os" import "os/exec" func main() { err := run(os.Args[1]) if err != nil { panic(err) } } func run(keyIdFilePath string) error { keyId, err := ioutil.ReadFile(keyIdFilePath) if err != nil { return err } gitCmd := exec.Command("git", "config", "user.signingKey", string(keyId)) return gitCmd.Run() }