github.com/ssube/gitlab-ci-multi-runner@v1.2.1-0.20160607142738-b8d1285632e6/commands/helpers/artifacts_uploader.go (about) 1 package helpers 2 3 import ( 4 "errors" 5 "io" 6 "os" 7 "path" 8 "time" 9 10 "github.com/Sirupsen/logrus" 11 "github.com/codegangsta/cli" 12 13 "gitlab.com/gitlab-org/gitlab-ci-multi-runner/common" 14 "gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers/archives" 15 "gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers/formatter" 16 "gitlab.com/gitlab-org/gitlab-ci-multi-runner/network" 17 ) 18 19 type ArtifactsUploaderCommand struct { 20 common.BuildCredentials 21 fileArchiver 22 retryHelper 23 network common.Network 24 25 Name string `long:"name" description:"The name of the archive"` 26 } 27 28 func (c *ArtifactsUploaderCommand) createAndUpload() (bool, error) { 29 pr, pw := io.Pipe() 30 defer pr.Close() 31 32 // Create the archive 33 go func() { 34 err := archives.CreateZipArchive(pw, c.sortedFiles()) 35 pw.CloseWithError(err) 36 }() 37 38 artifactsName := path.Base(c.Name) + ".zip" 39 40 // Upload the data 41 switch c.network.UploadRawArtifacts(c.BuildCredentials, pr, artifactsName) { 42 case common.UploadSucceeded: 43 return false, nil 44 case common.UploadForbidden: 45 return false, os.ErrPermission 46 case common.UploadTooLarge: 47 return false, errors.New("Too large") 48 case common.UploadFailed: 49 return true, os.ErrInvalid 50 default: 51 return false, os.ErrInvalid 52 } 53 } 54 55 func (c *ArtifactsUploaderCommand) Execute(*cli.Context) { 56 formatter.SetRunnerFormatter() 57 58 if len(c.URL) == 0 || len(c.Token) == 0 { 59 logrus.Fatalln("Missing runner credentials") 60 } 61 if c.ID <= 0 { 62 logrus.Fatalln("Missing build ID") 63 } 64 65 // Enumerate files 66 err := c.enumerate() 67 if err != nil { 68 logrus.Fatalln(err) 69 } 70 71 // If the upload fails, exit with a non-zero exit code to indicate an issue? 72 err = c.doRetry(c.createAndUpload) 73 if err != nil { 74 logrus.Fatalln(err) 75 } 76 } 77 78 func init() { 79 common.RegisterCommand2("artifacts-uploader", "create and upload build artifacts (internal)", &ArtifactsUploaderCommand{ 80 network: &network.GitLabClient{}, 81 retryHelper: retryHelper{ 82 Retry: 2, 83 RetryTime: time.Second, 84 }, 85 Name: "artifacts", 86 }) 87 }