• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16package gitee_common
17
18import (
19	"code.cloudfoundry.org/archiver/compressor"
20	"code.cloudfoundry.org/archiver/extractor"
21	"fmt"
22	"fotff/utils"
23	"github.com/sirupsen/logrus"
24	"net/http"
25	"os"
26	"path/filepath"
27	"strings"
28	"time"
29)
30
31func (m *Manager) GetNewerOrFail(cur string) (string, error) {
32	newFile := m.getNewerOrFailFromCI(cur + ".tar.gz")
33	ex := extractor.NewTgz()
34	dirName := strings.TrimSuffix(newFile, ".tar.gz")
35	dir := filepath.Join(m.Workspace, dirName)
36	if _, err := os.Stat(dir); err == nil {
37		return dirName, nil
38	}
39	logrus.Infof("extracting %s to %s...", filepath.Join(m.ArchiveDir, newFile), dir)
40	if err := ex.Extract(filepath.Join(m.ArchiveDir, newFile), dir); err != nil {
41		return dirName, err
42	}
43	return dirName, nil
44}
45
46func (m *Manager) getNewerOrFailFromCI(cur string) string {
47	return m.loopCI(DailyBuildsQueryParam{
48		ProjectName: "openharmony",
49		Branch:      m.ManifestBranch,
50		Component:   m.Component,
51		PageNum:     1,
52		PageSize:    1,
53	}, cur, m.getNewerDailyBuildOrFail)
54}
55
56func (m *Manager) getNewerDailyBuildOrFail(cur string, db *DailyBuild) string {
57	switch db.BuildFailReason {
58	case "":
59		return m.getNewerDailyBuild(cur, db)
60	case "compile_failed":
61		lastSuccessTime, err := parseTime(cur)
62		if err != nil {
63			logrus.Errorf("can not get package time from %s, skipping", cur)
64			return ""
65		}
66		nowFailTime, err := parseTime(db.BuildStartTime)
67		if err != nil {
68			logrus.Errorf("can not get time from %s, skipping", cur)
69			return ""
70		}
71		if lastSuccessTime == nowFailTime {
72			return ""
73		}
74		return m.genFailedPackage(lastSuccessTime, nowFailTime)
75	default:
76		return ""
77	}
78}
79
80func (m *Manager) genFailedPackage(lastSuccessTime, failedBuildStartTime time.Time) string {
81	pkg := fmt.Sprintf("%s_%s_build_fail", m.Component, failedBuildStartTime.Format("20060102_150405"))
82	logrus.Infof("getting failed package manifest for %s(%s) at %s", m.Component, m.ManifestBranch, failedBuildStartTime)
83	tags, err := m.getAllTags(lastSuccessTime, failedBuildStartTime)
84	if err != nil {
85		logrus.Errorf("can not get latest tag from ci, err: %v", err)
86		return ""
87	}
88	if len(tags) == 0 {
89		logrus.Error("can not get latest tag from ci, tag list is empty")
90		return ""
91	}
92	if err := os.MkdirAll(filepath.Join(m.Workspace, pkg), 0750); err != nil {
93		logrus.Errorf("can not mkdir %s, err: %v", pkg, err)
94		return ""
95	}
96	resp, err := utils.DoSimpleHttpReq(http.MethodGet, tags[len(tags)-1].TagFileURL, nil, nil)
97	if err != nil {
98		logrus.Errorf("can not get latest tag file from ci, err: %v", err)
99		return ""
100	}
101	err = os.WriteFile(filepath.Join(m.Workspace, pkg, "manifest_tag.xml"), resp, 0640)
102	if err != nil {
103		logrus.Errorf("can not write latest tag file, err: %v", err)
104		return ""
105	}
106	if err := compressor.NewTgz().Compress(filepath.Join(m.Workspace, pkg), filepath.Join(m.ArchiveDir, pkg+".tar.gz")); err != nil {
107		logrus.Errorf("can not write latest tag file, err: %v", err)
108		return ""
109	}
110	return pkg + ".tar.gz"
111}
112