[REV] change copy file code

This commit is contained in:
barnettZQG 2018-09-14 14:01:34 +08:00
parent ec5113e284
commit d56a7dea31
4 changed files with 47 additions and 15 deletions

View File

@ -252,16 +252,16 @@ func (i *ExportApp) parseApps() ([]gjson.Result, error) {
return arr, nil return arr, nil
} }
//exportImage export image of app
func (i *ExportApp) exportImage(serviceDir string, app gjson.Result) error { func (i *ExportApp) exportImage(serviceDir string, app gjson.Result) error {
serviceName := app.Get("service_cname").String() serviceName := app.Get("service_cname").String()
serviceName = unicode2zh(serviceName) serviceName = unicode2zh(serviceName)
os.MkdirAll(serviceDir, 0755) os.MkdirAll(serviceDir, 0755)
// 处理掉文件名中冒号等不合法字符
image := app.Get("share_image").String() image := app.Get("share_image").String()
tarFileName := buildToLinuxFileName(image) tarFileName := buildToLinuxFileName(image)
user := app.Get("service_image.hub_user").String() user := app.Get("service_image.hub_user").String()
pass := app.Get("service_image.hub_password").String() pass := app.Get("service_image.hub_password").String()
// 如果是runner镜像则跳过 // ignore runner image
if checkIsRunner(image) { if checkIsRunner(image) {
logrus.Debug("Skip the runner image: ", image) logrus.Debug("Skip the runner image: ", image)
return nil return nil
@ -296,14 +296,14 @@ func (i *ExportApp) exportSlug(serviceDir string, app gjson.Result) error {
_, err := os.Stat(shareSlugPath) _, err := os.Stat(shareSlugPath)
if shareSlugPath != "" && err == nil { if shareSlugPath != "" && err == nil {
logrus.Debug("The slug file was exist already, direct copy to service dir: ", shareSlugPath) logrus.Debug("The slug file was exist already, direct copy to service dir: ", shareSlugPath)
err = exec.Command("cp", shareSlugPath, fmt.Sprintf("%s/%s", serviceDir, tarFileName)).Run() err = util.CopyFile(shareSlugPath, fmt.Sprintf("%s/%s", serviceDir, tarFileName))
if err == nil { if err == nil {
return nil return nil
} }
// 如果copy失败则忽略在下一步中下载该slug包 // if local copy failure, try download it
logrus.Debugf("Failed to copy the slug file to service dir %s: %v", shareSlugPath, err) logrus.Debugf("Failed to copy the slug file to service dir %s: %v", shareSlugPath, err)
} }
// 提取tfp服务器信息 // get slug save server (ftp) info
ftpHost := app.Get("service_slug.ftp_host").String() ftpHost := app.Get("service_slug.ftp_host").String()
ftpPort := app.Get("service_slug.ftp_port").String() ftpPort := app.Get("service_slug.ftp_port").String()
ftpUsername := app.Get("service_slug.ftp_username").String() ftpUsername := app.Get("service_slug.ftp_username").String()
@ -314,15 +314,14 @@ func (i *ExportApp) exportSlug(serviceDir string, app gjson.Result) error {
logrus.Error("Failed to create ftp client: ", err) logrus.Error("Failed to create ftp client: ", err)
return err return err
} }
// 开始下载文件 // download slug file
i.Logger.Info(fmt.Sprintf("获取应用源码:%s", serviceName), map[string]string{"step": "get-slug", "status": "failure"}) i.Logger.Info(fmt.Sprintf("Download service %s slug file", serviceName), map[string]string{"step": "get-slug", "status": "failure"})
err = ftpClient.DownloadFile(shareSlugPath, fmt.Sprintf("%s/%s", serviceDir, tarFileName), i.Logger) err = ftpClient.DownloadFile(shareSlugPath, fmt.Sprintf("%s/%s", serviceDir, tarFileName), i.Logger)
ftpClient.Close() ftpClient.Close()
if err != nil { if err != nil {
logrus.Errorf("Failed to download slug file for group %s: %v", i.SourceDir, err) logrus.Errorf("Failed to download slug file for group %s: %v", i.SourceDir, err)
return err return err
} }
logrus.Debug("Successful download slug file: ", shareSlugPath) logrus.Debug("Successful download slug file: ", shareSlugPath)
return nil return nil
} }

View File

@ -498,13 +498,9 @@ func (i *ImportApp) loadApps() error {
} }
} else { } else {
os.MkdirAll(filepath.Base(shareSlugPath), 0755) os.MkdirAll(filepath.Base(shareSlugPath), 0755)
cmd := exec.Command("cp", fileName, shareSlugPath) err := util.CopyFile(fileName, shareSlugPath)
var out bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &out
err = cmd.Run()
if err != nil { if err != nil {
logrus.Error("Failed to copy slug file to local directory: ", out.String()) logrus.Error("Failed to copy slug file to local directory: ", shareSlugPath)
return err return err
} }
} }

View File

@ -166,7 +166,7 @@ func CmdRunWithTimeout(cmd *exec.Cmd, timeout time.Duration) (bool, error) {
go func() { go func() {
<-done // allow goroutine to exit <-done // allow goroutine to exit
}() }()
logrus.Info("process:%s killed", cmd.Path) logrus.Infof("process:%s killed", cmd.Path)
return true, err return true, err
case err = <-done: case err = <-done:
return false, err return false, err
@ -564,6 +564,37 @@ func Unzip(archive, target string) error {
return nil return nil
} }
// CopyFile copy source file to target
// direct io read and write file
// Keep the permissions user and group
func CopyFile(source, target string) error {
sfi, err := os.Stat(source)
if err != nil {
return err
}
elem := reflect.ValueOf(sfi.Sys()).Elem()
uid := elem.FieldByName("Uid").Uint()
gid := elem.FieldByName("Gid").Uint()
sf, err := directio.OpenFile(source, os.O_RDONLY, 0)
if err != nil {
return err
}
defer sf.Close()
tf, err := directio.OpenFile(target, os.O_RDONLY|os.O_CREATE|os.O_WRONLY, sfi.Mode())
if err != nil {
return err
}
defer tf.Close()
_, err = io.Copy(tf, sf)
if err != nil {
return err
}
if err := os.Chown(target, int(uid), int(gid)); err != nil {
return err
}
return nil
}
//GetParentDirectory GetParentDirectory //GetParentDirectory GetParentDirectory
func GetParentDirectory(dirctory string) string { func GetParentDirectory(dirctory string) string {
return substr(dirctory, 0, strings.LastIndex(dirctory, "/")) return substr(dirctory, 0, strings.LastIndex(dirctory, "/"))

View File

@ -99,3 +99,9 @@ func TestDiskUsage(t *testing.T) {
func TestGetCurrentDir(t *testing.T) { func TestGetCurrentDir(t *testing.T) {
t.Log(GetCurrentDir()) t.Log(GetCurrentDir())
} }
func TestCopyFile(t *testing.T) {
if err := CopyFile("/tmp/test2.zip", "/tmp/test4.zip"); err != nil {
t.Fatal(err)
}
}