Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/bap-builder/AppMode.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (

// BuildApp
func BuildApp(cmdLine *BuildAppCmdLineArgs, contextPath string) error {
platformString, err := determinePlatformString(*cmdLine.DockerImageName, uint16(*cmdLine.Port))
platformString, err := checkDockerEnvironmentAndDeterminePlatformString(*cmdLine.DockerImageName, uint16(*cmdLine.Port))
if err != nil {
return err
}
Expand Down
83 changes: 77 additions & 6 deletions cmd/bap-builder/PackageMode.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"fmt"
"strconv"
"slices"
"time"
)

type buildDepList struct {
Expand Down Expand Up @@ -122,7 +123,7 @@ func performPreBuildChecks(
// BuildPackage
// process Package mode of the program
func BuildPackage(cmdLine *BuildPackageCmdLineArgs, contextPath string) error {
platformString, err := determinePlatformString(*cmdLine.DockerImageName, uint16(*cmdLine.Port))
platformString, err := checkDockerEnvironmentAndDeterminePlatformString(*cmdLine.DockerImageName, uint16(*cmdLine.Port))
if err != nil {
return err
}
Expand Down Expand Up @@ -401,26 +402,96 @@ func buildAndCopyPackage(
return err
}

// determinePlatformString
// Will construct platform string suitable for sysroot.
func determinePlatformString(dockerImageName string, dockerPort uint16) (*bacpack_package.PlatformString, error) {
// checkDockerEnvironment
// Checks if the Docker environment is valid. Checks for read/write permissions and volume read
// permissions.
func checkDockerEnvironment(credentials ssh.SSHCredentials) error {
testDir := "/packager-test-dir-" + strconv.Itoa(time.Now().Nanosecond())

logger := log.GetLogger()

shellEvaluator := ssh.ShellEvaluator{
Commands: []string{"mkdir " + testDir + " && test -r " + testDir + " && test -w " + testDir + " && rmdir " + testDir},
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

err := shellEvaluator.RunOverSSH(credentials)
if err != nil {
logger.ErrorIndent("Cannot create directories, or read or write to them inside Docker container")
return fmt.Errorf("invalid Docker environment")
}

shellEvaluator.Commands = []string{"test -r " + constants.ContainerSysrootPath}

err = shellEvaluator.RunOverSSH(credentials)
if err != nil {
logger.ErrorIndent("Cannot read volume directory inside Docker container")
return fmt.Errorf("invalid Docker environment")
}

return nil
}

// prepareDockerEnvironmentCheck
// Prepares Docker environment for check and returns Docker struct to be used for check.
func prepareDockerEnvironmentCheck(dockerImageName string, dockerPort uint16) (*docker.Docker, error) {
defaultDocker, err := prerequisites.CreateAndInitialize[docker.Docker](dockerImageName, dockerPort)
if err != nil {
return nil, err
}
defaultDocker.ImageName = dockerImageName

err = sysroot.CreateBaseSysrootDir()
if err != nil {
return nil, err
}

sysrootPath, err := sysroot.GetBaseSysrootPath()
if err != nil {
return nil, err
}

err = defaultDocker.SetVolume(sysrootPath, constants.ContainerSysrootPath)
if err != nil {
return nil, err
}

return defaultDocker, nil
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

// checkDockerEnvironmentAndDeterminePlatformString
// Checks if the Docker environment is valid and constructs platform string suitable for sysroot.
func checkDockerEnvironmentAndDeterminePlatformString(dockerImageName string, dockerPort uint16) (*bacpack_package.PlatformString, error) {
logger := log.GetLogger()
logger.Info("Checking Docker environment")

defaultDocker, err := prepareDockerEnvironmentCheck(dockerImageName, dockerPort)
if err != nil {
return nil, err
}

dockerRun := (*docker.DockerRun)(defaultDocker)
err = dockerRun.Run()
if err != nil {
return nil, err
}
removeHandler := dockerRun.GetUndoHandler()
defer removeHandler()

sshCreds, err := prerequisites.CreateAndInitialize[ssh.SSHCredentials]()
if err != nil {
return nil, err
}
sshCreds.Port = uint16(defaultDocker.Port)

err = checkDockerEnvironment(*sshCreds)
if err != nil {
return nil, err
}

platformString := bacpack_package.PlatformString{
Mode: bacpack_package.ModeAuto,
}

err = prerequisites.Initialize[bacpack_package.PlatformString](&platformString, sshCreds, defaultDocker)
err = prerequisites.Initialize(&platformString, sshCreds, defaultDocker)
return &platformString, err
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/bap-builder/SysrootMode.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func CreateSysroot(cmdLine *CreateSysrootCmdLineArgs, contextPath string) error
if err != nil {
return err
}
platformString, err := determinePlatformString(*cmdLine.ImageName, uint16(*cmdLine.Port))
platformString, err := checkDockerEnvironmentAndDeterminePlatformString(*cmdLine.ImageName, uint16(*cmdLine.Port))
if err != nil {
return err
}
Expand Down
21 changes: 1 addition & 20 deletions internal/bacpack_package/PlatformString.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ import (
"github.com/bacpack-system/packager/internal/docker"
"github.com/bacpack-system/packager/internal/log"
"github.com/bacpack-system/packager/internal/prerequisites"
"github.com/bacpack-system/packager/internal/process"
"github.com/bacpack-system/packager/internal/ssh"
"fmt"
"os"
"regexp"
"strings"
"time"
)

// PlatformStringMode is a fill-up mode of the platform-string.
Expand Down Expand Up @@ -111,30 +109,13 @@ func (pstr *PlatformString) CheckPrerequisites(args *prerequisites.Args) error {
}

// determinePlatformString
// Computes platform string for ModeAuto.
// Gets PlatformString for ModeAuto from container using credentials The container must be already running.
// If the PlatformString is in ModeExplicit the panic raise.
func (pstr *PlatformString) determinePlatformString(credentials ssh.SSHCredentials, dock *docker.Docker) error {
if pstr.Mode == ModeExplicit {
panic(fmt.Errorf("cannot determine PlatformString for explicit mode"))
}

dockerRun := (*docker.DockerRun)(dock)
removeHandler := process.SignalHandlerAddHandler(func() error {
dockerStop := (*docker.DockerStop)(dock)
dockerRm := (*docker.DockerRm)(dock)
// Waiting for docker run command to get container id
time.Sleep(200 * time.Millisecond)
dockerStop.Stop()
return dockerRm.RemoveContainer()
})
defer removeHandler()

err := dockerRun.Run()
if err != nil {
return err
}
credentials.Port = dock.Port

distroName, distroRelease := getDistroIdAndReleaseFromDockerContainer(dock)
if distroName == "" || distroRelease == "" {
return fmt.Errorf("can't get distro name and id from os-release file")
Expand Down
45 changes: 14 additions & 31 deletions internal/build/Build.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"github.com/bacpack-system/packager/internal/log"
"github.com/bacpack-system/packager/internal/bacpack_package"
"github.com/bacpack-system/packager/internal/prerequisites"
"github.com/bacpack-system/packager/internal/process"
"github.com/bacpack-system/packager/internal/ssh"
"github.com/bacpack-system/packager/internal/sysroot"
"bufio"
Expand All @@ -16,7 +15,6 @@ import (
"os"
"path/filepath"
"regexp"
"time"
"strconv"
)

Expand Down Expand Up @@ -159,13 +157,19 @@ func (build *Build) prepareForBuild() error {
build.BuildSystem.InstallPrefix = constants.DockerInstallDirConst

if build.sysroot != nil {
build.sysroot.CreateSysrootDir()
sysPath := build.sysroot.GetSysrootPath()
err = build.Docker.SetVolume(sysPath, "/sysroot")
err := build.sysroot.CreateSysrootDir()
if err != nil {
return err
}
build.BuildSystem.PrefixPath = "/sysroot"
sysPath, err := build.sysroot.GetSysrootPath()
if err != nil {
return err
}
err = build.Docker.SetVolume(sysPath, constants.ContainerSysrootPath)
if err != nil {
Comment thread
coderabbitai[bot] marked this conversation as resolved.
return err
}
build.BuildSystem.PrefixPath = constants.ContainerSysrootPath
}

return nil
Expand Down Expand Up @@ -198,20 +202,16 @@ func (build *Build) RunBuild() (error, bool) { // Long function - it is hard to
shellEvaluator.StdOut = file
}

dockerRun := (*docker.DockerRun)(build.Docker)
removeHandler := process.SignalHandlerAddHandler(func() error {
// Waiting for docker run command to get container id
time.Sleep(300 * time.Millisecond)
return build.stopAndRemoveContainer()
})
defer removeHandler()

logger.InfoIndent("Starting docker container")

dockerRun := (*docker.DockerRun)(build.Docker)
err = dockerRun.Run()
if err != nil {
return err, false
}
removeHandler := dockerRun.GetUndoHandler()
defer removeHandler()

build.SSHCredentials.Port = build.Docker.Port

logger.InfoIndent("Cloning Package git repository inside docker container")
Expand Down Expand Up @@ -286,23 +286,6 @@ func (build *Build) GetLocalInstallDirPath() string {
return copyBaseDir
}

func (build *Build) stopAndRemoveContainer() error {
var err error

dockerStop := (*docker.DockerStop)(build.Docker)
dockerRm := (*docker.DockerRm)(build.Docker)
logger := log.GetLogger()
err = dockerStop.Stop()
if err != nil {
logger.Error("Can't stop container - %s", err)
}
err = dockerRm.RemoveContainer()
if err != nil {
logger.Error("Can't remove container - %s", err)
}
return nil
}

func (build *Build) CleanUp() error {
var err error
copyDir := build.GetLocalInstallDirPath()
Expand Down
2 changes: 2 additions & 0 deletions internal/constants/Constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@ const (
EmptyGitCommitHash = ""
// Absolute path of Package Repository inside docker container
ContainerPackageRepoPath = "/lfsrepo"
// Absolute path of sysroot inside docker container
ContainerSysrootPath = "/sysroot"
)
24 changes: 23 additions & 1 deletion internal/docker/DockerRun.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package docker

import (
"github.com/bacpack-system/packager/internal/process"
"github.com/bacpack-system/packager/internal/log"
"bytes"
"fmt"
"regexp"
Expand Down Expand Up @@ -37,6 +38,27 @@ func (args *DockerRun) Run() error {
return nil
}

func (args *DockerRun) GetUndoHandler() func() {
return process.SignalHandlerAddHandler(func() error {
if args.containerId == "" {
return nil
}
dockerStop := (*DockerStop)(args)
dockerRm := (*DockerRm)(args)

logger := log.GetLogger()
err := dockerStop.Stop()
if err != nil {
logger.Error("Can't stop container - %s", err)
}
err = dockerRm.RemoveContainer()
if err != nil {
logger.Error("Can't remove container - %s", err)
}
return nil
})
}

func (runArgs *DockerRun) GenerateCmdLine() ([]string, error) {
cmdArgs := make([]string, 0)
cmdArgs = append(cmdArgs, "run")
Expand All @@ -47,7 +69,7 @@ func (runArgs *DockerRun) GenerateCmdLine() ([]string, error) {
cmdArgs = append(cmdArgs, "-p")
cmdArgs = append(cmdArgs, portPair)
for key, value := range runArgs.Volumes {
volumePair := key + ":" + value
volumePair := key + ":" + value + ":Z" // :Z is for SELinux relabeling
cmdArgs = append(cmdArgs, "-v", volumePair)
}

Expand Down
Loading