Compare commits
9 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 366102b55b | |||
| 657104bf91 | |||
| 2ad19740fc | |||
| 16fd63b06f | |||
| 3f9c10c04b | |||
| 644390f59a | |||
| ec773bc57d | |||
| 7999a86f58 | |||
| 72607f2ee9 |
3 changed files with 74 additions and 12 deletions
25
README.md
25
README.md
|
|
@ -1,3 +1,26 @@
|
||||||
# push-to-dokku
|
# push-to-dokku
|
||||||
|
|
||||||
Action to push to Dokku
|
Action to push a remote repository to Dokku.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
uses: https://lmika.dev/actions/push-to-dokku@v1.1
|
||||||
|
with:
|
||||||
|
app: dokku-app-name
|
||||||
|
host: dokku-host
|
||||||
|
private-key: SSH key
|
||||||
|
```
|
||||||
|
|
||||||
|
Parameters are:
|
||||||
|
|
||||||
|
- `host`: hostname of the Dokku instance to push the application to.
|
||||||
|
- `app`: the Dokku application name.
|
||||||
|
- `private-key`: the private SSH key
|
||||||
|
- `source-branch`: the code branch to push (default = `main`)
|
||||||
|
- `target-branch`: the Dokku branch to push to (default = same as source-branch)
|
||||||
|
|
||||||
|
This action requires Go 1.22.4 or later.
|
||||||
|
|
||||||
|
This action will write the private key to the .ssh instance and will push to the remote repository as the `dokku`
|
||||||
|
user. Both the source and target branch must be `main`.
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ type config struct {
|
||||||
HostName string
|
HostName string
|
||||||
AppName string
|
AppName string
|
||||||
PrivateKey string
|
PrivateKey string
|
||||||
|
LocalBranch string
|
||||||
|
RemoteBranch string
|
||||||
}
|
}
|
||||||
|
|
||||||
func readConfig() config {
|
func readConfig() config {
|
||||||
|
|
@ -13,5 +15,7 @@ func readConfig() config {
|
||||||
HostName: os.Getenv("INPUT_HOST"),
|
HostName: os.Getenv("INPUT_HOST"),
|
||||||
AppName: os.Getenv("INPUT_APP"),
|
AppName: os.Getenv("INPUT_APP"),
|
||||||
PrivateKey: os.Getenv("INPUT_PRIVATE-KEY"),
|
PrivateKey: os.Getenv("INPUT_PRIVATE-KEY"),
|
||||||
|
LocalBranch: os.Getenv("INPUT_SOURCE-BRANCH"),
|
||||||
|
RemoteBranch: os.Getenv("INPUT_TARGET-BRANCH"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
43
services.go
43
services.go
|
|
@ -12,10 +12,11 @@ import (
|
||||||
|
|
||||||
type Services struct {
|
type Services struct {
|
||||||
cfg config
|
cfg config
|
||||||
|
keyFileName string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServices(cfg config) *Services {
|
func NewServices(cfg config) *Services {
|
||||||
return &Services{cfg: cfg}
|
return &Services{cfg: cfg, keyFileName: "id_ecdsa"}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Services) AddPrivateKey() error {
|
func (s *Services) AddPrivateKey() error {
|
||||||
|
|
@ -25,7 +26,8 @@ func (s *Services) AddPrivateKey() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := writeFile(`${HOME}/.ssh/id_rsa`, s.cfg.PrivateKey, 0400); err != nil {
|
privateKey := strings.TrimSpace(s.cfg.PrivateKey) + "\n"
|
||||||
|
if err := writeFile(`${HOME}/.ssh/` + s.keyFileName, privateKey, 0400); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -39,9 +41,11 @@ func (s *Services) ConfigureSSH() error {
|
||||||
if err := sshConfigTemplate.Execute(&bfr, struct {
|
if err := sshConfigTemplate.Execute(&bfr, struct {
|
||||||
Cfg config
|
Cfg config
|
||||||
Home string
|
Home string
|
||||||
|
KeyFileName string
|
||||||
}{
|
}{
|
||||||
Cfg: s.cfg,
|
Cfg: s.cfg,
|
||||||
Home: os.Getenv("HOME"),
|
Home: os.Getenv("HOME"),
|
||||||
|
KeyFileName: s.keyFileName,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -67,7 +71,27 @@ func (s *Services) PushRepository() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := runCmd("git", "push", "dokku", "main"); err != nil {
|
sourceBranch := s.cfg.LocalBranch
|
||||||
|
if sourceBranch == "" {
|
||||||
|
// Get the current ref
|
||||||
|
ref, err := runCmdExpectingOutput("git", "rev-parse", "HEAD")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceBranch = strings.TrimSpace(ref)
|
||||||
|
}
|
||||||
|
remoteBranch := s.cfg.RemoteBranch
|
||||||
|
if remoteBranch == "" {
|
||||||
|
remoteBranch = "main"
|
||||||
|
}
|
||||||
|
|
||||||
|
branchArg := sourceBranch
|
||||||
|
if sourceBranch != remoteBranch {
|
||||||
|
branchArg = fmt.Sprintf("%v:%v", sourceBranch, remoteBranch)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := runCmd("git", "push", "dokku", branchArg); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,6 +106,17 @@ func runCmd(cmd ...string) error {
|
||||||
return e.Run()
|
return e.Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func runCmdExpectingOutput(cmd ...string) (string, error) {
|
||||||
|
log.Printf(" .. [exec] %v", strings.Join(cmd, " "))
|
||||||
|
e := exec.Command(cmd[0], cmd[1:]...)
|
||||||
|
e.Stderr = os.Stderr
|
||||||
|
res, err := e.Output()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(res), nil
|
||||||
|
}
|
||||||
|
|
||||||
func writeFile(path string, content string, mode os.FileMode) error {
|
func writeFile(path string, content string, mode os.FileMode) error {
|
||||||
fullPath := os.ExpandEnv(path)
|
fullPath := os.ExpandEnv(path)
|
||||||
log.Printf(" .. [file] %v (%v bytes)", fullPath, len(content))
|
log.Printf(" .. [file] %v (%v bytes)", fullPath, len(content))
|
||||||
|
|
@ -97,6 +132,6 @@ Host *
|
||||||
Host {{.Cfg.HostName}}
|
Host {{.Cfg.HostName}}
|
||||||
HostName {{.Cfg.HostName}}
|
HostName {{.Cfg.HostName}}
|
||||||
User dokku
|
User dokku
|
||||||
IdentityFile {{.Home}}/.ssh/id_rsa
|
IdentityFile {{.Home}}/.ssh/{{.KeyFileName}}
|
||||||
`))
|
`))
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue