AppRunner: Clone specific branch instead of always running master

Change-Id: I262d232f5fa1648474eb8bb55ce13f986507b0d4
diff --git a/apps/app-runner/main.go b/apps/app-runner/main.go
index 3d1e397..9296749 100644
--- a/apps/app-runner/main.go
+++ b/apps/app-runner/main.go
@@ -12,6 +12,7 @@
 
 	"github.com/go-git/go-billy/v5/osfs"
 	"github.com/go-git/go-git/v5"
+	"github.com/go-git/go-git/v5/plumbing"
 	gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
 	"github.com/go-git/go-git/v5/storage/memory"
 )
@@ -19,6 +20,7 @@
 var port = flag.Int("port", 3000, "Port to listen on")
 var appId = flag.String("app-id", "", "Application ID")
 var repoAddr = flag.String("repo-addr", "", "Git repository address")
+var branch = flag.String("branch", "", "Name of the branch to process")
 var sshKey = flag.String("ssh-key", "", "Private SSH key to access Git repository")
 var appDir = flag.String("app-dir", "", "Path to store application repository locally")
 var runCfg = flag.String("run-cfg", "", "Run configuration")
@@ -30,7 +32,8 @@
 	Env  []string `json:"env"`
 }
 
-func CloneRepository(addr string, signer ssh.Signer, path string) error {
+func CloneRepositoryBranch(addr, branch string, signer ssh.Signer, path string) error {
+	ref := fmt.Sprintf("refs/heads/%s", branch)
 	c, err := git.Clone(memory.NewStorage(), osfs.New(path, osfs.WithBoundOS()), &git.CloneOptions{
 		URL: addr,
 		Auth: &gitssh.PublicKeys{
@@ -45,7 +48,7 @@
 			},
 		},
 		RemoteName:      "origin",
-		ReferenceName:   "refs/heads/master",
+		ReferenceName:   plumbing.ReferenceName(ref),
 		SingleBranch:    true,
 		Depth:           1,
 		InsecureSkipTLS: true,
@@ -87,7 +90,7 @@
 	if err != nil {
 		panic(err)
 	}
-	if err := CloneRepository(*repoAddr, signer, *appDir); err != nil {
+	if err := CloneRepositoryBranch(*repoAddr, *branch, signer, *appDir); err != nil {
 		panic(err)
 	}
 	r, err := os.Open(*runCfg)
@@ -99,7 +102,7 @@
 	if err := json.NewDecoder(r).Decode(&cmds); err != nil {
 		panic(err)
 	}
-	s := NewServer(*port, *appId, *repoAddr, signer, *appDir, cmds, self, *managerAddr)
+	s := NewServer(*port, *appId, *repoAddr, *branch, signer, *appDir, cmds, self, *managerAddr)
 	if err := s.Start(); err != nil {
 		log.Fatal(err)
 	}
diff --git a/apps/app-runner/server.go b/apps/app-runner/server.go
index b906e7b..ffc5709 100644
--- a/apps/app-runner/server.go
+++ b/apps/app-runner/server.go
@@ -22,6 +22,7 @@
 	ready       bool
 	cmd         *exec.Cmd
 	repoAddr    string
+	branch      string
 	signer      ssh.Signer
 	appDir      string
 	runCommands []Command
@@ -30,13 +31,14 @@
 	logs        *Log
 }
 
-func NewServer(port int, appId string, repoAddr string, signer ssh.Signer, appDir string, runCommands []Command, self string, manager string) *Server {
+func NewServer(port int, appId string, repoAddr, branch string, signer ssh.Signer, appDir string, runCommands []Command, self string, manager string) *Server {
 	return &Server{
 		l:           &sync.Mutex{},
 		port:        port,
 		ready:       false,
 		appId:       appId,
 		repoAddr:    repoAddr,
+		branch:      branch,
 		signer:      signer,
 		appDir:      appDir,
 		runCommands: runCommands,
@@ -100,7 +102,7 @@
 }
 
 func (s *Server) run() error {
-	if err := CloneRepository(s.repoAddr, s.signer, s.appDir); err != nil {
+	if err := CloneRepositoryBranch(s.repoAddr, s.branch, s.signer, s.appDir); err != nil {
 		return err
 	}
 	logM := io.MultiWriter(os.Stdout, s.logs)
diff --git a/charts/app-runner/templates/install.yaml b/charts/app-runner/templates/install.yaml
index f3b2a00..b9ecdbb 100644
--- a/charts/app-runner/templates/install.yaml
+++ b/charts/app-runner/templates/install.yaml
@@ -100,6 +100,7 @@
         - --app-id={{ .Values.appId }}
         - --app-dir={{ .Values.appDir }}
         - --repo-addr={{ .Values.repoAddr }}
+        - --branch={{ .Values.branch }}
         - --ssh-key=/pcloud/ssh-key/private
         - --run-cfg=/pcloud/config/run
         - --manager-addr={{ .Values.managerAddr }}
diff --git a/charts/app-runner/values.yaml b/charts/app-runner/values.yaml
index 9145c47..88958ae 100644
--- a/charts/app-runner/values.yaml
+++ b/charts/app-runner/values.yaml
@@ -3,6 +3,7 @@
   tag: latest
   pullPolicy: Always
 repoAddr: 192.168.0.11
+branch: "master"
 sshPrivateKey: key
 appId: ""
 runCfg: ""
diff --git a/core/installer/app_configs/dodo_app.cue b/core/installer/app_configs/dodo_app.cue
index cb172bb..aa3b527 100644
--- a/core/installer/app_configs/dodo_app.cue
+++ b/core/installer/app_configs/dodo_app.cue
@@ -349,6 +349,7 @@
 						appDir: _app.rootDir
 						appId: input.appId
 						repoAddr: "\(input.repoPublicAddr)/\(input.appId)"
+						branch: input.branch
 						sshPrivateKey: base64.Encode(null, input.sshPrivateKey)
 						runCfg: base64.Encode(null, json.Marshal(_app.runConfiguration))
 						managerAddr: input.managerAddr