@@ -29,6 +29,8 @@ type config struct {
2929}
3030
3131const gitTrafficTagPrefix = "git-"
32+ const cloudRunServiceAndTagMaxLength = 46
33+ const minGitTrafficTagSHALength = 7
3234
3335func main () {
3436 cfg , err := parseConfig ()
@@ -255,6 +257,26 @@ func resolveGitSHA(dir string) (string, error) {
255257 return sha , nil
256258}
257259
260+ func buildGitTrafficTag (service , gitSHA string ) (string , bool ) {
261+ serviceName := strings .TrimSpace (service )
262+ sha := strings .TrimSpace (strings .ToLower (gitSHA ))
263+ if serviceName == "" || sha == "" {
264+ return "" , false
265+ }
266+
267+ maxTagLength := cloudRunServiceAndTagMaxLength - len (serviceName )
268+ minTagLength := len (gitTrafficTagPrefix ) + minGitTrafficTagSHALength
269+ if maxTagLength < minTagLength {
270+ return "" , false
271+ }
272+
273+ maxSHALength := maxTagLength - len (gitTrafficTagPrefix )
274+ if maxSHALength > len (sha ) {
275+ maxSHALength = len (sha )
276+ }
277+ return gitTrafficTagPrefix + sha [:maxSHALength ], true
278+ }
279+
258280func deployServices (cfg * config , image string ) error {
259281 var wg sync.WaitGroup
260282 errs := make (chan error , len (cfg .services ))
@@ -311,15 +333,24 @@ func deployService(cfg *config, service, image string) error {
311333 "--project=" + cfg .project ,
312334 }
313335 if cfg .gitSHA != "" {
314- gitTrafficTag := gitTrafficTagPrefix + cfg .gitSHA
315- oldGitTags , err := listServiceGitTags (cfg , service )
316- if err != nil {
317- return fmt .Errorf ("list git tags for %s: %w" , service , err )
318- }
319- if len (oldGitTags ) > 0 {
320- updateTrafficArgs = append (updateTrafficArgs , "--remove-tags=" + strings .Join (oldGitTags , "," ))
336+ gitTrafficTag , ok := buildGitTrafficTag (service , cfg .gitSHA )
337+ if ! ok {
338+ fmt .Fprintf (
339+ os .Stderr ,
340+ "warn: service %q is too long to fit a git traffic tag within %d characters, skipping git tag\n " ,
341+ service ,
342+ cloudRunServiceAndTagMaxLength ,
343+ )
344+ } else {
345+ oldGitTags , err := listServiceGitTags (cfg , service )
346+ if err != nil {
347+ return fmt .Errorf ("list git tags for %s: %w" , service , err )
348+ }
349+ if len (oldGitTags ) > 0 {
350+ updateTrafficArgs = append (updateTrafficArgs , "--remove-tags=" + strings .Join (oldGitTags , "," ))
351+ }
352+ updateTrafficArgs = append (updateTrafficArgs , "--update-tags=" + gitTrafficTag + "=LATEST" )
321353 }
322- updateTrafficArgs = append (updateTrafficArgs , "--update-tags=" + gitTrafficTag + "=LATEST" )
323354 }
324355 if err := runCommandStreaming (cfg .workdir , "gcloud" , updateTrafficArgs ... ); err != nil {
325356 return fmt .Errorf ("update traffic for %s: %w" , service , err )
0 commit comments