diff --git a/.gitignore b/.gitignore index 0703bf3..2385ba2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,6 @@ node_modules/ dist/ +*.bak .DS_Store .*.sw* diff --git a/README.md b/README.md index 3f8bd57..d6fb499 100644 --- a/README.md +++ b/README.md @@ -67,15 +67,37 @@ curl -sS https://webinstall.dev/gitdeploy | bash curl -A MS https://webinstall.dev/gitdeploy | powershell ``` +## Git SSH Deploy Keys and Tokens + +All of the clone URLs are HTTPS clone URLs. + +To use SSH clone URLs, you should update your git credentials: + +```bash +git config --global url."ssh://git@github.com/example-org/".insteadOf "https://github.com/example-org/" +``` + +This will add an entry like this to your `.gitconfig`: + +```ini +[url "ssh://git@github.com/example-org/"] + insteadOf = https://github.com/example-org/ +``` + +For more info see +[The Git Credentials Cheat Sheet](https://coolaj86.com/articles/vanilla-devops-git-credentials-cheatsheet/) +at . + ## Setup with Deploy Scripts -Start by initializing your `./scripts` directory. +Start by initializing your `.env` and `./scripts` directory. ```bash gitdeploy init ``` ```txt +.env scripts/ ├── deploy.sh ├── git.example.com/org/go-project/deploy.sh diff --git a/examples/dotenv b/examples/dotenv index ea93d32..e834b5c 100644 --- a/examples/dotenv +++ b/examples/dotenv @@ -1,5 +1,5 @@ # PORT only listens on localhost -PORT=4483 +#PORT=4483 # LISTEN lets you choose the interface also #LISTEN=0.0.0.0:4483 @@ -7,12 +7,13 @@ PORT=4483 # List promotions in descending order PROMOTIONS="production staging master" +# Whether to trust X-Forward-* headers TRUST_PROXY=false # These repos will be trusted to run .gitdeploy/deploy.sh -TRUST_REPOS=git.example.com/org/project,git.example.com/org/other-project +#TRUST_REPOS=git.example.com/org/project,git.example.com/org/other-project # List your various webhook secrets -GITHUB_SECRET=xxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyyyy -GITEA_SECRET=xxxxxxxxxxxxxxxxxxxxxx -BITBUCKET_SECRET=xxxxxxxxxxxxxxxxxxxxxx +#GITHUB_SECRET=xxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyyyy +#GITEA_SECRET=xxxxxxxxxxxxxxxxxxxxxx +#BITBUCKET_SECRET=xxxxxxxxxxxxxxxxxxxxxx diff --git a/main.go b/main.go index 14ec3b0..3c00860 100644 --- a/main.go +++ b/main.go @@ -14,11 +14,11 @@ import ( "strings" "time" - "git.rootprojects.org/root/vfscopy" - "git.rootprojects.org/root/gitdeploy/assets/public" "git.rootprojects.org/root/gitdeploy/assets/examples" + "git.rootprojects.org/root/gitdeploy/assets/public" "git.rootprojects.org/root/gitdeploy/internal/options" "git.rootprojects.org/root/gitdeploy/internal/webhooks" + "git.rootprojects.org/root/vfscopy" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" @@ -124,29 +124,7 @@ func main() { return case "init": _ = initFlags.Parse(args[2:]) - vfs := vfscopy.NewVFS(examples.Assets) - _, err := os.Open("scripts") - if nil == err { - fmt.Fprintf(os.Stderr, "./scripts already exists\n") - os.Exit(1) - return - } - fmt.Println("Copying ...") - if err := vfscopy.CopyAll(vfs, ".", "./scripts", vfscopy.Options { - Skip: func (path string) (bool, error) { - f, _ := vfs.Open(path) - fi, _ := f.Stat() - if !fi.IsDir() { - fmt.Println(" scripts/" + path) - } - return false, nil - }, - }); nil != err { - fmt.Fprintf(os.Stderr, "error initializing ./scripts directory\n") - os.Exit(1) - return - } - fmt.Println("Done.") + gdInit() os.Exit(0) return case "run": @@ -171,6 +149,12 @@ func main() { if 0 == len(runOpts.Addr) { runOpts.Addr = os.Getenv("LISTEN") } + if 0 == len(runOpts.Addr) { + port := os.Getenv("PORT") + if len(port) > 0 { + runOpts.Addr = "localhost:" + port + } + } if 0 == len(runOpts.Addr) { runOpts.Addr = "localhost:4483" } @@ -219,6 +203,50 @@ type KillMsg struct { Kill bool `json:"kill"` } +func gdInit() { + vfs := vfscopy.NewVFS(examples.Assets) + _, err := os.Open("scripts") + fmt.Println("Initiazing ...") + if !os.IsNotExist(err) { + fmt.Fprintf(os.Stderr, " skip: ./scripts already exists\n") + } else { + if err := vfscopy.CopyAll(vfs, ".", "./scripts", vfscopy.Options{ + AddPermission: os.FileMode(0600), + Skip: func(path string) (bool, error) { + if strings.HasSuffix(path, "/dotenv") { + return true, nil + } + + f, _ := vfs.Open(path) + fi, _ := f.Stat() + if !fi.IsDir() { + fmt.Println(" copy: scripts/" + path) + } + return false, nil + }, + }); nil != err { + fmt.Fprintf(os.Stderr, "error initializing ./scripts directory: %v\n", err) + os.Exit(1) + return + } + } + _, err = os.Open(".env") + if !os.IsNotExist(err) { + fmt.Fprintf(os.Stderr, " skip: ./.env already exists\n") + } else { + if err := vfscopy.CopyAll(vfs, "dotenv", ".env", vfscopy.Options{ + AddPermission: os.FileMode(0600), + }); nil != err { + fmt.Fprintf(os.Stderr, "error initializing ./.env file: %v\n", err) + os.Exit(1) + return + } + _ = os.Chmod(".env", 0600) + fmt.Println(" copy: .env") + } + fmt.Println("Done.") +} + func serve() { r := chi.NewRouter()