72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package services
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
|
|
"gitea.com/gitea/pr-deployer/pkgs/settings"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func getImageTag(number int) string {
|
|
return fmt.Sprintf("pr-%d", number)
|
|
}
|
|
|
|
// buildImage build the docker image via Dockerfile
|
|
func buildImage(ctx context.Context, number int) (string, error) {
|
|
p := getPRGitDir(number)
|
|
tagName := fmt.Sprintf("%s/%s:%s", settings.RepoOwner, settings.RepoName, getImageTag(number))
|
|
cmd := exec.Command("docker", "build", "-t",
|
|
tagName,
|
|
".",
|
|
)
|
|
if err := WithDir(cmd, p).Run(); err != nil {
|
|
return "", errors.Wrap(err, "docker build")
|
|
}
|
|
|
|
return tagName, nil
|
|
}
|
|
|
|
func contractErr(errs ...error) error {
|
|
var errContent string
|
|
for _, e := range errs {
|
|
if e != nil {
|
|
errContent += e.Error() + ";"
|
|
}
|
|
}
|
|
return errors.New(errContent)
|
|
}
|
|
|
|
func runImage(ctx context.Context, number int, image string) (string, error) {
|
|
p := getPRRuntimeDir(number)
|
|
if err := os.MkdirAll(p, os.ModePerm); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
composeDir := filepath.Dir(settings.DockerComposeTemplateFile)
|
|
|
|
var buf bytes.Buffer
|
|
var errBuf bytes.Buffer
|
|
cmd := exec.Command("docker-compose", "up", "-d")
|
|
cmd.Env = append(os.Environ(),
|
|
"DEMO_CONTAINER="+image,
|
|
"DEMO_DOMAIN="+getFullSubDomain(number),
|
|
"DEMO_SSH=22",
|
|
"DEMO_DATA_DIR="+p,
|
|
)
|
|
cmd.Stdout = &buf
|
|
cmd.Stderr = &errBuf
|
|
err := WithDir(cmd, composeDir).Run()
|
|
if err != nil || errBuf.String() != "" {
|
|
err = contractErr(err, errors.New(errBuf.String()))
|
|
return "", errors.Wrap(err, "docker run")
|
|
}
|
|
|
|
return buf.String(), nil
|
|
}
|