* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package gitee_common
import (
"encoding/json"
"fmt"
"fotff/utils"
"github.com/sirupsen/logrus"
"io"
"net/http"
"os"
"path/filepath"
"time"
)
type DailyBuildsQueryParam struct {
ProjectName string `json:"projectName"`
Branch string `json:"branch"`
Component string `json:"component"`
BuildStatus string `json:"buildStatus"`
StartTime string `json:"startTime"`
EndTime string `json:"endTime"`
PageNum int `json:"pageNum"`
PageSize int `json:"pageSize"`
}
type DailyBuildsResp struct {
Result struct {
DailyBuildVos []*DailyBuild `json:"dailyBuildVos"`
Total int `json:"total"`
} `json:"result"`
}
type DailyBuild struct {
CurrentStatus string `json:"currentStatus"`
BuildStartTime string `json:"buildStartTime"`
BuildFailReason string `json:"buildFailReason"`
Id string `json:"id"`
ObsPath string `json:"obsPath"`
ImgObsPath string `json:"imgObsPath"`
}
func (m *Manager) loopCI(param DailyBuildsQueryParam, cur string, getFn func(cur string, resp *DailyBuild) string) string {
for {
file := func() string {
data, err := json.Marshal(param)
if err != nil {
logrus.Errorf("can not marshal query param: %v", err)
return ""
}
resp, err := utils.DoSimpleHttpReq(http.MethodPost, "http://ci.openharmony.cn/api/ci-backend/ci-portal/v1/dailybuilds", data, map[string]string{"Content-Type": "application/json;charset=UTF-8"})
if err != nil {
logrus.Errorf("can not query builds: %v", err)
return ""
}
var dailyBuildsResp DailyBuildsResp
if err := json.Unmarshal(resp, &dailyBuildsResp); err != nil {
logrus.Errorf("can not unmarshal resp [%s]: %v", string(resp), err)
return ""
}
if len(dailyBuildsResp.Result.DailyBuildVos) == 0 {
return ""
}
if dailyBuildsResp.Result.DailyBuildVos[0].CurrentStatus != "end" {
return ""
}
return getFn(cur, dailyBuildsResp.Result.DailyBuildVos[0])
}()
if file != "" {
return file
}
time.Sleep(10 * time.Minute)
}
}
func (m *Manager) getNewerFromCI(cur string) string {
return m.loopCI(DailyBuildsQueryParam{
ProjectName: "openharmony",
Branch: m.ManifestBranch,
Component: m.Component,
BuildStatus: "success",
PageNum: 1,
PageSize: 1,
}, cur, m.getNewerDailyBuild)
}
func (m *Manager) getNewerDailyBuild(cur string, db *DailyBuild) string {
p := db.ImgObsPath
if p == "" {
p = db.ObsPath
}
if filepath.Base(p) == cur {
return ""
}
logrus.Infof("new package found, name: %s", filepath.Base(p))
file, err := m.downloadToWorkspace(p)
if err != nil {
logrus.Errorf("can not download package %s: %v", p, err)
return ""
}
return file
}
func (m *Manager) downloadToWorkspace(url string) (string, error) {
if _, err := parseTime(filepath.Base(url)); err != nil {
logrus.Errorf("can not get package time from %s, skipping", filepath.Base(url))
return "", fmt.Errorf("can not get package time from %s, skipping", filepath.Base(url))
}
logrus.Infof("downloading %s", url)
resp, err := utils.DoSimpleHttpReqRaw(http.MethodGet, url, nil, nil)
if err != nil {
return "", err
}
defer resp.Body.Close()
if err := os.MkdirAll(m.ArchiveDir, 0750); err != nil {
return "", err
}
f, err := os.Create(filepath.Join(m.ArchiveDir, filepath.Base(url)))
if err != nil {
return "", err
}
defer f.Close()
if _, err := io.CopyBuffer(f, resp.Body, make([]byte, 16*1024*1024)); err != nil {
return "", err
}
logrus.Infof("%s downloaded successfully", url)
return filepath.Base(url), nil
}