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  }