func (n *GitLabClient) UploadArtifacts(config common.BuildCredentials, artifactsFile string) common.UploadState { log := logrus.WithFields(logrus.Fields{ "id": config.ID, "token": helpers.ShortenToken(config.Token), }) file, err := os.Open(artifactsFile) if err != nil { log.WithError(err).Errorln("Uploading artifacts to coordinator...", "error") return common.UploadFailed } defer file.Close() fi, err := file.Stat() if err != nil { log.WithError(err).Errorln("Uploading artifacts to coordinator...", "error") return common.UploadFailed } if fi.IsDir() { log.WithField("error", "cannot upload directories").Errorln("Uploading artifacts to coordinator...", "error") return common.UploadFailed } baseName := filepath.Base(artifactsFile) return n.UploadRawArtifacts(config, file, baseName, "") }
func (n *GitLabClient) UploadRawArtifacts(config common.BuildCredentials, reader io.Reader, baseName string, expireIn string) common.UploadState { pr, pw := io.Pipe() defer pr.Close() mpw := multipart.NewWriter(pw) go func() { defer pw.Close() defer mpw.Close() err := n.createArtifactsForm(mpw, reader, baseName) if err != nil { pw.CloseWithError(err) } }() // TODO: Create proper interface for `doRaw` that can use other types than RunnerCredentials mappedConfig := common.RunnerCredentials{ URL: config.URL, Token: config.Token, TLSCAFile: config.TLSCAFile, } query := url.Values{} if expireIn != "" { query.Set("expire_in", expireIn) } headers := make(http.Header) headers.Set("BUILD-TOKEN", config.Token) res, err := n.doRaw(mappedConfig, "POST", fmt.Sprintf("builds/%d/artifacts?%s", config.ID, query.Encode()), pr, mpw.FormDataContentType(), headers) log := logrus.WithFields(logrus.Fields{ "id": config.ID, "token": helpers.ShortenToken(config.Token), "responseStatus": res.Status, }) if err != nil { log.WithError(err).Errorln("Uploading artifacts to coordinator...", "error") return common.UploadFailed } defer res.Body.Close() defer io.Copy(ioutil.Discard, res.Body) switch res.StatusCode { case 201: log.Println("Uploading artifacts to coordinator...", "ok") return common.UploadSucceeded case 403: log.WithField("status", res.Status).Errorln("Uploading artifacts to coordinator...", "forbidden") return common.UploadForbidden case 413: log.WithField("status", res.Status).Errorln("Uploading artifacts to coordinator...", "too large archive") return common.UploadTooLarge default: log.WithField("status", res.Status).Warningln("Uploading artifacts to coordinator...", "failed") return common.UploadFailed } }
func (n *GitLabClient) DownloadArtifacts(config common.BuildCredentials, artifactsFile string) common.DownloadState { // TODO: Create proper interface for `doRaw` that can use other types than RunnerCredentials mappedConfig := common.RunnerCredentials{ URL: config.URL, Token: config.Token, TLSCAFile: config.TLSCAFile, } headers := make(http.Header) headers.Set("BUILD-TOKEN", config.Token) res, err := n.doRaw(mappedConfig, "GET", fmt.Sprintf("builds/%d/artifacts", config.ID), nil, "", headers) log := logrus.WithFields(logrus.Fields{ "id": config.ID, "token": helpers.ShortenToken(config.Token), }) if err != nil { log.Errorln("Downloading artifacts from coordinator...", "error", err.Error()) return common.DownloadFailed } defer res.Body.Close() defer io.Copy(ioutil.Discard, res.Body) switch res.StatusCode { case 200: file, err := os.Create(artifactsFile) if err == nil { defer file.Close() _, err = io.Copy(file, res.Body) } if err != nil { file.Close() os.Remove(file.Name()) log.WithError(err).Errorln("Downloading artifacts from coordinator...", "error") return common.DownloadFailed } log.Println("Downloading artifacts from coordinator...", "ok") return common.DownloadSucceeded case 403: log.WithField("status", res.Status).Errorln("Downloading artifacts from coordinator...", "forbidden") return common.DownloadForbidden case 404: log.Errorln("Downloading artifacts from coordinator...", "not found") return common.DownloadNotFound default: log.WithField("status", res.Status).Warningln("Downloading artifacts from coordinator...", "failed") return common.DownloadFailed } }
func (c *RunnerCredentials) ShortDescription() string { return helpers.ShortenToken(c.Token) }