gitlab.com/zaquestion/lab@v0.14.0/internal/config/config.go (about)

     1  package config
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"fmt"
     7  	"io"
     8  	"net/url"
     9  	"os"
    10  	"strings"
    11  	"syscall"
    12  
    13  	"github.com/spf13/viper"
    14  	"golang.org/x/crypto/ssh/terminal"
    15  )
    16  
    17  const defaultGitLabHost = "https://gitlab.com"
    18  
    19  // New prompts the user for the default config values to use with lab, and save
    20  // them to the provided confpath (default: ~/.config/lab.hcl)
    21  func New(confpath string, r io.Reader) error {
    22  	var (
    23  		reader            = bufio.NewReader(r)
    24  		host, user, token string
    25  		err               error
    26  	)
    27  	fmt.Printf("Enter default GitLab host (default: %s): ", defaultGitLabHost)
    28  	host, err = reader.ReadString('\n')
    29  	host = strings.TrimSpace(host)
    30  	if err != nil {
    31  		return err
    32  	}
    33  	if host == "" {
    34  		host = defaultGitLabHost
    35  	}
    36  
    37  	fmt.Print("Enter default GitLab user: ")
    38  	user, err = reader.ReadString('\n')
    39  	user = strings.TrimSpace(user)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	if user == "" {
    44  		return errors.New("lab.hcl config core.user must be set")
    45  	}
    46  
    47  	tokenURL, err := url.Parse(host)
    48  	if err != nil {
    49  		return err
    50  	}
    51  	tokenURL.Path = "profile/personal_access_tokens"
    52  
    53  	fmt.Printf("Create a token here: %s\nEnter default GitLab token (scope: api): ", tokenURL.String())
    54  	token, err = readPassword()
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	viper.Set("core.host", host)
    60  	viper.Set("core.user", user)
    61  	viper.Set("core.token", token)
    62  	if err := viper.WriteConfigAs(confpath); err != nil {
    63  		return err
    64  	}
    65  	fmt.Printf("\nConfig saved to %s\n", confpath)
    66  	return nil
    67  }
    68  
    69  var readPassword = func() (string, error) {
    70  	byteToken, err := terminal.ReadPassword(int(syscall.Stdin))
    71  	if err != nil {
    72  		return "", err
    73  	}
    74  	return strings.TrimSpace(string(byteToken)), nil
    75  }
    76  
    77  // CI returns credentials suitable for use within GitLab CI or empty strings if
    78  // none found.
    79  func CI() (string, string, string) {
    80  	ciToken := os.Getenv("CI_JOB_TOKEN")
    81  	if ciToken == "" {
    82  		return "", "", ""
    83  	}
    84  	ciHost := strings.TrimSuffix(os.Getenv("CI_PROJECT_URL"), os.Getenv("CI_PROJECT_PATH"))
    85  	if ciHost == "" {
    86  		return "", "", ""
    87  	}
    88  	ciUser := os.Getenv("CI_REGISTRY_USER")
    89  	if ciUser == "" {
    90  		ciUser = "gitlab-ci-token"
    91  	}
    92  	return ciHost, ciUser, ciToken
    93  }