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