Merge "Generate build_number.txt only once" into main

This commit is contained in:
Treehugger Robot 2023-09-29 00:12:01 +00:00 committed by Gerrit Code Review
commit b7dbc85485
3 changed files with 41 additions and 23 deletions

View file

@ -15,11 +15,13 @@
package build package build
import ( import (
"fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"sync" "sync"
"text/template" "text/template"
"time"
"android/soong/ui/metrics" "android/soong/ui/metrics"
) )
@ -56,6 +58,31 @@ func SetupOutDir(ctx Context, config Config) {
} else { } else {
ctx.Fatalln("Missing BUILD_DATETIME_FILE") ctx.Fatalln("Missing BUILD_DATETIME_FILE")
} }
// BUILD_NUMBER should be set to the source control value that
// represents the current state of the source code. E.g., a
// perforce changelist number or a git hash. Can be an arbitrary string
// (to allow for source control that uses something other than numbers),
// but must be a single word and a valid file name.
//
// If no BUILD_NUMBER is set, create a useful "I am an engineering build
// from this date/time" value. Make it start with a non-digit so that
// anyone trying to parse it as an integer will probably get "0".
buildNumber, ok := config.environ.Get("BUILD_NUMBER")
if ok {
writeValueIfChanged(ctx, config, config.OutDir(), "file_name_tag.txt", buildNumber)
} else {
var username string
if username, ok = config.environ.Get("BUILD_USERNAME"); !ok {
ctx.Fatalln("Missing BUILD_USERNAME")
}
buildNumber = fmt.Sprintf("eng.%.6s.%s", username, time.Now().Format("20060102.150405" /* YYYYMMDD.HHMMSS */))
writeValueIfChanged(ctx, config, config.OutDir(), "file_name_tag.txt", username)
}
// Write the build number to a file so it can be read back in
// without changing the command line every time. Avoids rebuilds
// when using ninja.
writeValueIfChanged(ctx, config, config.SoongOutDir(), "build_number.txt", buildNumber)
} }
var combinedBuildNinjaTemplate = template.Must(template.New("combined").Parse(` var combinedBuildNinjaTemplate = template.Must(template.New("combined").Parse(`

View file

@ -22,6 +22,7 @@ import (
"math/rand" "math/rand"
"os" "os"
"os/exec" "os/exec"
"os/user"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strconv" "strconv"
@ -455,6 +456,16 @@ func NewConfig(ctx Context, args ...string) Config {
ret.environ.Set("BUILD_DATETIME_FILE", buildDateTimeFile) ret.environ.Set("BUILD_DATETIME_FILE", buildDateTimeFile)
if _, ok := ret.environ.Get("BUILD_USERNAME"); !ok {
username := "unknown"
if u, err := user.Current(); err == nil {
username = u.Username
} else {
ctx.Println("Failed to get current user:", err)
}
ret.environ.Set("BUILD_USERNAME", username)
}
if ret.UseRBE() { if ret.UseRBE() {
for k, v := range getRBEVars(ctx, Config{ret}) { for k, v := range getRBEVars(ctx, Config{ret}) {
ret.environ.Set(k, v) ret.environ.Set(k, v)

View file

@ -15,6 +15,8 @@
package build package build
import ( import (
"android/soong/ui/metrics"
"android/soong/ui/status"
"crypto/md5" "crypto/md5"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
@ -22,10 +24,6 @@ import (
"os/user" "os/user"
"path/filepath" "path/filepath"
"strings" "strings"
"time"
"android/soong/ui/metrics"
"android/soong/ui/status"
) )
var spaceSlashReplacer = strings.NewReplacer("/", "_", " ", "_") var spaceSlashReplacer = strings.NewReplacer("/", "_", " ", "_")
@ -198,32 +196,14 @@ func runKati(ctx Context, config Config, extraSuffix string, args []string, envF
} }
} }
writeValueIfChanged(ctx, config, config.SoongOutDir(), "build_hostname.txt", hostname) writeValueIfChanged(ctx, config, config.SoongOutDir(), "build_hostname.txt", hostname)
_, ok = cmd.Environment.Get("BUILD_NUMBER")
// BUILD_NUMBER should be set to the source control value that
// represents the current state of the source code. E.g., a
// perforce changelist number or a git hash. Can be an arbitrary string
// (to allow for source control that uses something other than numbers),
// but must be a single word and a valid file name.
//
// If no BUILD_NUMBER is set, create a useful "I am an engineering build
// from this date/time" value. Make it start with a non-digit so that
// anyone trying to parse it as an integer will probably get "0".
cmd.Environment.Unset("HAS_BUILD_NUMBER")
buildNumber, ok := cmd.Environment.Get("BUILD_NUMBER")
// Unset BUILD_NUMBER during kati run to avoid kati rerun, kati will use BUILD_NUMBER from a file. // Unset BUILD_NUMBER during kati run to avoid kati rerun, kati will use BUILD_NUMBER from a file.
cmd.Environment.Unset("BUILD_NUMBER") cmd.Environment.Unset("BUILD_NUMBER")
if ok { if ok {
cmd.Environment.Set("HAS_BUILD_NUMBER", "true") cmd.Environment.Set("HAS_BUILD_NUMBER", "true")
writeValueIfChanged(ctx, config, config.OutDir(), "file_name_tag.txt", buildNumber)
} else { } else {
buildNumber = fmt.Sprintf("eng.%.6s.%s", username, time.Now().Format("20060102.150405" /* YYYYMMDD.HHMMSS */))
cmd.Environment.Set("HAS_BUILD_NUMBER", "false") cmd.Environment.Set("HAS_BUILD_NUMBER", "false")
writeValueIfChanged(ctx, config, config.OutDir(), "file_name_tag.txt", username)
} }
// Write the build number to a file so it can be read back in
// without changing the command line every time. Avoids rebuilds
// when using ninja.
writeValueIfChanged(ctx, config, config.SoongOutDir(), "build_number.txt", buildNumber)
// Apply the caller's function closure to mutate the environment variables. // Apply the caller's function closure to mutate the environment variables.
envFunc(cmd.Environment) envFunc(cmd.Environment)