pr-deployer/pkgs/services/container.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
}