mirror of
https://github.com/F1bonacc1/process-compose.git
synced 2024-08-17 07:20:39 +03:00
Windows Support with CMD
This commit is contained in:
parent
93a1e6c59d
commit
65942f2fe4
16
Makefile
16
Makefile
@ -1,16 +1,26 @@
|
|||||||
BINARY_NAME=process-compose
|
BINARY_NAME=process-compose
|
||||||
|
EXT=''
|
||||||
|
RM=rm
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
EXT=.exe
|
||||||
|
RM = cmd /C del /Q /F
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: test run
|
.PHONY: test run
|
||||||
|
|
||||||
buildrun: build run
|
buildrun: build run
|
||||||
|
|
||||||
build:
|
build:
|
||||||
go build -o bin/${BINARY_NAME} ./src
|
go build -o bin/${BINARY_NAME}${EXT} ./src
|
||||||
compile:
|
compile:
|
||||||
|
#Linux
|
||||||
GOOS=linux GOARCH=386 go build -o bin/${BINARY_NAME}-linux-386 ./src
|
GOOS=linux GOARCH=386 go build -o bin/${BINARY_NAME}-linux-386 ./src
|
||||||
GOOS=linux GOARCH=amd64 go build -o bin/${BINARY_NAME}-linux-amd64 ./src
|
GOOS=linux GOARCH=amd64 go build -o bin/${BINARY_NAME}-linux-amd64 ./src
|
||||||
GOOS=linux GOARCH=arm64 go build -o bin/${BINARY_NAME}-linux-arm64 ./src
|
GOOS=linux GOARCH=arm64 go build -o bin/${BINARY_NAME}-linux-arm64 ./src
|
||||||
GOOS=linux GOARCH=arm go build -o bin/${BINARY_NAME}-linux-arm ./src
|
GOOS=linux GOARCH=arm go build -o bin/${BINARY_NAME}-linux-arm ./src
|
||||||
|
|
||||||
|
#Windows
|
||||||
|
GOOS=windows GOARCH=amd64 go build -o bin/${BINARY_NAME}-windows-amd64.exe ./src
|
||||||
test:
|
test:
|
||||||
go test -cover ./src
|
go test -cover ./src
|
||||||
coverhtml:
|
coverhtml:
|
||||||
@ -18,7 +28,7 @@ coverhtml:
|
|||||||
go tool cover -html=coverage.out
|
go tool cover -html=coverage.out
|
||||||
|
|
||||||
run:
|
run:
|
||||||
./bin/${BINARY_NAME}
|
./bin/${BINARY_NAME}${EXT}
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm bin/${BINARY_NAME}*
|
$(RM) bin\${BINARY_NAME}*
|
||||||
|
@ -64,7 +64,7 @@ processes:
|
|||||||
backoff_seconds: 2
|
backoff_seconds: 2
|
||||||
|
|
||||||
|
|
||||||
|
log_location: pc_tst.log
|
||||||
environment:
|
environment:
|
||||||
- 'ABC=222'
|
- 'ABC=222'
|
||||||
|
|
||||||
|
@ -8,9 +8,10 @@ processes:
|
|||||||
condition: process_completed_successfully
|
condition: process_completed_successfully
|
||||||
|
|
||||||
process2:
|
process2:
|
||||||
command: "echo 'process2 is removing the log' && rm ./pc.log-test.log"
|
command: "echo 'process2 is removing the log'"
|
||||||
availability:
|
availability:
|
||||||
restart: "on-failure"
|
restart: "on-failure"
|
||||||
|
# max_restarts: 3
|
||||||
depends_on:
|
depends_on:
|
||||||
process3:
|
process3:
|
||||||
condition: process_completed
|
condition: process_completed
|
||||||
@ -30,10 +31,11 @@ processes:
|
|||||||
condition: process_completed_successfully
|
condition: process_completed_successfully
|
||||||
|
|
||||||
process5:
|
process5:
|
||||||
command: "echo 'process5 is removing the process6 log' && rm ./pc.proc6.log-test.log"
|
command: "python -c print(str(4+5))"
|
||||||
availability:
|
availability:
|
||||||
restart: "on-failure"
|
restart: "on-failure"
|
||||||
backoff_seconds: 2
|
backoff_seconds: 1
|
||||||
|
# max_restarts: 3
|
||||||
depends_on:
|
depends_on:
|
||||||
process6:
|
process6:
|
||||||
condition: process_completed_successfully
|
condition: process_completed_successfully
|
||||||
@ -61,8 +63,6 @@ processes:
|
|||||||
restart: "on-failure"
|
restart: "on-failure"
|
||||||
backoff_seconds: 2
|
backoff_seconds: 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
- 'ABC=222'
|
- 'ABC=222'
|
||||||
|
|
||||||
|
58
process-compose-win.yaml
Normal file
58
process-compose-win.yaml
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
version: "0.5"
|
||||||
|
log_level: debug
|
||||||
|
processes:
|
||||||
|
process0:
|
||||||
|
command: "ls ddd"
|
||||||
|
|
||||||
|
process1:
|
||||||
|
command: "powershell.exe ./test_loop.ps1 ${PROC4}"
|
||||||
|
availability:
|
||||||
|
restart: "on-failure"
|
||||||
|
backoff_seconds: 2
|
||||||
|
depends_on:
|
||||||
|
process2:
|
||||||
|
condition: process_completed_successfully
|
||||||
|
process3:
|
||||||
|
condition: process_completed
|
||||||
|
# process4:
|
||||||
|
# condition: process_completed_successfully
|
||||||
|
environment:
|
||||||
|
- 'EXIT_CODE=0'
|
||||||
|
|
||||||
|
process2:
|
||||||
|
command: "powershell.exe ./test_loop.ps1 process2"
|
||||||
|
log_location: ./pc.proc2.log
|
||||||
|
availability:
|
||||||
|
restart: "on-failure"
|
||||||
|
# depends_on:
|
||||||
|
# process3:
|
||||||
|
# condition: process_completed_successfully
|
||||||
|
environment:
|
||||||
|
- 'ABC=2221'
|
||||||
|
- 'PRINT_ERR=111'
|
||||||
|
- 'EXIT_CODE=0'
|
||||||
|
|
||||||
|
process3:
|
||||||
|
command: "powershell.exe ./test_loop.ps1 process3"
|
||||||
|
availability:
|
||||||
|
restart: "on-failure"
|
||||||
|
backoff_seconds: 2
|
||||||
|
depends_on:
|
||||||
|
process4:
|
||||||
|
condition: process_completed_successfully
|
||||||
|
|
||||||
|
process4:
|
||||||
|
command: "powershell.exe ./test_loop.ps1 process4"
|
||||||
|
# availability:
|
||||||
|
# restart: on-failure
|
||||||
|
environment:
|
||||||
|
- 'ABC=2221'
|
||||||
|
- 'EXIT_CODE=1'
|
||||||
|
|
||||||
|
kcalc:
|
||||||
|
command: "calc"
|
||||||
|
disabled: true
|
||||||
|
|
||||||
|
environment:
|
||||||
|
- 'ABC=222'
|
||||||
|
log_location: ./pc.log
|
@ -6,6 +6,7 @@ processes:
|
|||||||
|
|
||||||
process1:
|
process1:
|
||||||
command: "./test_loop.bash ${PROC4}"
|
command: "./test_loop.bash ${PROC4}"
|
||||||
|
win_command: "powershell.exe ./test_loop.ps1 ${PROC4}"
|
||||||
availability:
|
availability:
|
||||||
restart: "on-failure"
|
restart: "on-failure"
|
||||||
backoff_seconds: 2
|
backoff_seconds: 2
|
||||||
@ -21,6 +22,7 @@ processes:
|
|||||||
|
|
||||||
process2:
|
process2:
|
||||||
command: "./test_loop.bash process2"
|
command: "./test_loop.bash process2"
|
||||||
|
win_command: "powershell.exe ./test_loop.ps1 process2"
|
||||||
log_location: ./pc.proc2.log
|
log_location: ./pc.proc2.log
|
||||||
availability:
|
availability:
|
||||||
restart: "on-failure"
|
restart: "on-failure"
|
||||||
@ -34,6 +36,7 @@ processes:
|
|||||||
|
|
||||||
process3:
|
process3:
|
||||||
command: "./test_loop.bash process3"
|
command: "./test_loop.bash process3"
|
||||||
|
win_command: "powershell.exe ./test_loop.ps1 process3"
|
||||||
availability:
|
availability:
|
||||||
restart: "on-failure"
|
restart: "on-failure"
|
||||||
backoff_seconds: 2
|
backoff_seconds: 2
|
||||||
@ -43,6 +46,7 @@ processes:
|
|||||||
|
|
||||||
process4:
|
process4:
|
||||||
command: "./test_loop.bash process4"
|
command: "./test_loop.bash process4"
|
||||||
|
win_command: "powershell.exe ./test_loop.ps1 process4"
|
||||||
# availability:
|
# availability:
|
||||||
# restart: on-failure
|
# restart: on-failure
|
||||||
environment:
|
environment:
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -50,7 +51,7 @@ func NewProcess(globalEnv []string, logger PcLogger, procConf ProcessConfig, rep
|
|||||||
|
|
||||||
func (p *Process) Run() error {
|
func (p *Process) Run() error {
|
||||||
for {
|
for {
|
||||||
cmd := exec.Command(getRunnerShell(), "-c", p.procConf.Command)
|
cmd := exec.Command(getRunnerShell(), getRunnerArg(), p.getCommand())
|
||||||
cmd.Env = p.getProcessEnvironment()
|
cmd.Env = p.getProcessEnvironment()
|
||||||
stdout, _ := cmd.StdoutPipe()
|
stdout, _ := cmd.StdoutPipe()
|
||||||
stderr, _ := cmd.StderrPipe()
|
stderr, _ := cmd.StderrPipe()
|
||||||
@ -149,6 +150,10 @@ func (p *Process) GetNameWithReplica() string {
|
|||||||
return fmt.Sprintf("%s_%d", p.procConf.Name, p.replica)
|
return fmt.Sprintf("%s_%d", p.procConf.Name, p.replica)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Process) getCommand() string {
|
||||||
|
return p.procConf.Command
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Process) handleOutput(pipe io.ReadCloser,
|
func (p *Process) handleOutput(pipe io.ReadCloser,
|
||||||
handler func(message string)) {
|
handler func(message string)) {
|
||||||
|
|
||||||
@ -172,8 +177,21 @@ func (p *Process) handleError(message string) {
|
|||||||
func getRunnerShell() string {
|
func getRunnerShell() string {
|
||||||
shell, ok := os.LookupEnv("SHELL")
|
shell, ok := os.LookupEnv("SHELL")
|
||||||
if !ok {
|
if !ok {
|
||||||
return "bash"
|
if runtime.GOOS == "windows" {
|
||||||
|
shell = "cmd"
|
||||||
|
} else {
|
||||||
|
shell = "bash"
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return shell
|
return shell
|
||||||
}
|
}
|
||||||
|
return shell
|
||||||
|
}
|
||||||
|
|
||||||
|
func getRunnerArg() string {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
return "/C"
|
||||||
|
} else {
|
||||||
|
return "-c"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -17,6 +19,11 @@ func TestSystem_TestFixtures(t *testing.T) {
|
|||||||
fixtures := getFixtures()
|
fixtures := getFixtures()
|
||||||
for _, fixture := range fixtures {
|
for _, fixture := range fixtures {
|
||||||
|
|
||||||
|
if strings.Contains(fixture, "process-compose-with-log.yaml") {
|
||||||
|
//there is a dedicated test for that TestSystem_TestComposeWithLog
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
t.Run(fixture, func(t *testing.T) {
|
t.Run(fixture, func(t *testing.T) {
|
||||||
project := createProject(fixture)
|
project := createProject(fixture)
|
||||||
project.Run()
|
project.Run()
|
||||||
@ -24,6 +31,29 @@ func TestSystem_TestFixtures(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSystem_TestComposeWithLog(t *testing.T) {
|
||||||
|
fixture := filepath.Join("..", "fixtures", "process-compose-with-log.yaml")
|
||||||
|
t.Run(fixture, func(t *testing.T) {
|
||||||
|
project := createProject(fixture)
|
||||||
|
project.Run()
|
||||||
|
if _, err := os.Stat(project.LogLocation); err != nil {
|
||||||
|
t.Errorf("log file %s not found", project.LogLocation)
|
||||||
|
}
|
||||||
|
if err := os.Remove(project.LogLocation); err != nil {
|
||||||
|
t.Errorf("failed to delete the log file %s, %s", project.LogLocation, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
proc6log := project.Processes["process6"].LogLocation
|
||||||
|
if _, err := os.Stat(proc6log); err != nil {
|
||||||
|
t.Errorf("log file %s not found", proc6log)
|
||||||
|
}
|
||||||
|
if err := os.Remove(proc6log); err != nil {
|
||||||
|
t.Errorf("failed to delete the log file %s, %s", proc6log, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func Test_autoDiscoverComposeFile(t *testing.T) {
|
func Test_autoDiscoverComposeFile(t *testing.T) {
|
||||||
type args struct {
|
type args struct {
|
||||||
pwd string
|
pwd string
|
||||||
@ -47,7 +77,7 @@ func Test_autoDiscoverComposeFile(t *testing.T) {
|
|||||||
args: args{
|
args: args{
|
||||||
pwd: "../",
|
pwd: "../",
|
||||||
},
|
},
|
||||||
want: "../process-compose.yaml",
|
want: filepath.Join("..", "process-compose.yaml"),
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
18
test_loop.ps1
Normal file
18
test_loop.ps1
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
$LOOPS=3
|
||||||
|
foreach($i in 1..$LOOPS)
|
||||||
|
{
|
||||||
|
Start-Sleep 1
|
||||||
|
|
||||||
|
if (Test-Path 'env:PRINT_ERR') {
|
||||||
|
|
||||||
|
# Write-Warning "test loop $i this is error $Args[0] $Env:PC_PROC_NAME"
|
||||||
|
$Host.UI.WriteErrorLine("test loop $i this is error " + $Args[0] + " " + $Env:PC_PROC_NAME)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Write-Host "test loop $i"$Args[0] [$Env:ABC]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit $Env:EXIT_CODE
|
Loading…
Reference in New Issue
Block a user