feat: updated docker auth secret creation

This commit is contained in:
eding 2025-10-23 11:56:50 +02:00
parent 972646295a
commit b2b43a98fd
2 changed files with 87 additions and 21 deletions

21
main.go
View file

@ -40,10 +40,16 @@ func main() {
var createDockerSecretCmd = &cobra.Command{ var createDockerSecretCmd = &cobra.Command{
Use: "create-docker-secret", Use: "create-docker-secret",
Short: "Creates a Docker registry secret in Vault for GHCR authentication.", Short: "Creates a Docker registry secret in Vault for Docker Hub.",
Run: runCreateDockerSecret, Run: runCreateDockerSecret,
} }
var createGhcrSecretCmd = &cobra.Command{
Use: "create-ghcr-secret",
Short: "Creates a Docker registry secret in Vault for GHCR.",
Run: runCreateGhcrSecret,
}
var createGithubSecretCmd = &cobra.Command{ var createGithubSecretCmd = &cobra.Command{
Use: "create-github-secret", Use: "create-github-secret",
Short: "Creates or updates a GitHub authentication secret in Vault.", Short: "Creates or updates a GitHub authentication secret in Vault.",
@ -60,6 +66,7 @@ func main() {
// Add commands to their parent commands // Add commands to their parent commands
repoCmd.AddCommand(initCmd) repoCmd.AddCommand(initCmd)
vaultCmd.AddCommand(createDockerSecretCmd) vaultCmd.AddCommand(createDockerSecretCmd)
vaultCmd.AddCommand(createGhcrSecretCmd)
vaultCmd.AddCommand(createGithubSecretCmd) vaultCmd.AddCommand(createGithubSecretCmd)
rootCmd.AddCommand(repoCmd) rootCmd.AddCommand(repoCmd)
rootCmd.AddCommand(vaultCmd) rootCmd.AddCommand(vaultCmd)
@ -96,11 +103,17 @@ func runInitRepo(cmd *cobra.Command, args []string) {
} }
func runCreateDockerSecret(cmd *cobra.Command, args []string) { func runCreateDockerSecret(cmd *cobra.Command, args []string) {
if err := createAndStoreSecrets(); err != nil { if err := createDockerHubSecretWorkflow(); err != nil {
fmt.Printf("[ERROR] Failed to create Docker registry secret: %v\n", err) fmt.Printf("[ERROR] Failed to create Docker Hub secret: %v\n", err)
os.Exit(1)
}
}
func runCreateGhcrSecret(cmd *cobra.Command, args []string) {
if err := createGhcrSecretWorkflow(); err != nil {
fmt.Printf("[ERROR] Failed to create GHCR secret: %v\n", err)
os.Exit(1) os.Exit(1)
} }
fmt.Println("[SUCCESS] Docker registry secret created successfully in Vault!")
} }
func runCreateGithubSecret(cmd *cobra.Command, args []string) { func runCreateGithubSecret(cmd *cobra.Command, args []string) {

View file

@ -20,11 +20,13 @@ const (
vaultRootTokenSecretName = "vault-unseal-keys" vaultRootTokenSecretName = "vault-unseal-keys"
vaultRootTokenSecretKey = "vault-root" vaultRootTokenSecretKey = "vault-root"
ghcrSecretPath = "secret/ghcr-auth" ghcrSecretPath = "secret/ghcr-auth"
dockerHubSecretPath = "secret/dockerhub-auth"
githubAuthSecretPath = "secret/github-auth" githubAuthSecretPath = "secret/github-auth"
orgManagementSecretPath = "secret/org-management-pat" orgManagementSecretPath = "secret/org-management-pat"
dockerConfigJSONKey = ".dockerconfigjson" dockerConfigJSONKey = ".dockerconfigjson"
orgManagementPATKey = "ORG_MANAGEMENT_PAT" orgManagementPATKey = "ORG_MANAGEMENT_PAT"
ghcrRegistry = "ghcr.io" ghcrRegistry = "ghcr.io"
dockerHubRegistry = "docker.io"
defaultVaultAddress = "https://127.0.0.1:8200" defaultVaultAddress = "https://127.0.0.1:8200"
) )
@ -161,33 +163,41 @@ func (vm *VaultManager) StoreSecret(path string, data map[string]string) error {
return nil return nil
} }
// --- Main Workflow Function --- // --- Main Workflow Functions ---
func createAndStoreSecrets() error { func createDockerHubSecretWorkflow() error {
// 1. Get User Input
username, registryToken, orgToken, err := getUserInput()
if err != nil {
return err
}
// 2. Initialize Vault Manager
// This handles kubectl checks, pod discovery, and token retrieval.
vm, err := NewVaultManager() vm, err := NewVaultManager()
if err != nil { if err != nil {
return fmt.Errorf("failed to initialize Vault manager: %w", err) return fmt.Errorf("failed to initialize Vault manager: %w", err)
} }
// 3. Create and Store Docker Registry Secret return createDockerHubSecret(vm)
dockerConfigJSON, err := createDockerConfig(username, registryToken) }
func createGhcrSecretWorkflow() error {
vm, err := NewVaultManager()
if err != nil {
return fmt.Errorf("failed to initialize Vault manager: %w", err)
}
return createGhcrSecrets(vm)
}
func createGhcrSecrets(vm *VaultManager) error {
fmt.Println("\n[INFO] Configuring secret for GitHub Container Registry (GHCR)...")
username, registryToken, orgToken, err := getGHCRUserInput()
if err != nil {
return err
}
dockerConfigJSON, err := createDockerConfig(ghcrRegistry, username, registryToken)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Docker config: %w", err) return fmt.Errorf("failed to create Docker config: %w", err)
} }
dockerSecretData := map[string]string{dockerConfigJSONKey: dockerConfigJSON} dockerSecretData := map[string]string{dockerConfigJSONKey: dockerConfigJSON}
if err := vm.StoreSecret(ghcrSecretPath, dockerSecretData); err != nil { if err := vm.StoreSecret(ghcrSecretPath, dockerSecretData); err != nil {
return fmt.Errorf("failed to store Docker registry secret: %w", err) return fmt.Errorf("failed to store Docker registry secret: %w", err)
} }
// 4. Create and Store Organization Management PAT
orgSecretData := map[string]string{orgManagementPATKey: orgToken} orgSecretData := map[string]string{orgManagementPATKey: orgToken}
if err := vm.StoreSecret(orgManagementSecretPath, orgSecretData); err != nil { if err := vm.StoreSecret(orgManagementSecretPath, orgSecretData); err != nil {
return fmt.Errorf("failed to store organization management PAT: %w", err) return fmt.Errorf("failed to store organization management PAT: %w", err)
@ -196,6 +206,26 @@ func createAndStoreSecrets() error {
return nil return nil
} }
func createDockerHubSecret(vm *VaultManager) error {
fmt.Println("\n[INFO] Configuring secret for Docker Hub...")
username, password, err := getUserInputForDockerHub()
if err != nil {
return err
}
dockerConfigJSON, err := createDockerConfig(dockerHubRegistry, username, password)
if err != nil {
return fmt.Errorf("failed to create Docker config: %w", err)
}
dockerSecretData := map[string]string{dockerConfigJSONKey: dockerConfigJSON}
if err := vm.StoreSecret(dockerHubSecretPath, dockerSecretData); err != nil {
return fmt.Errorf("failed to store Docker Hub secret: %w", err)
}
return nil
}
func createAndStoreGithubAuthSecret() error { func createAndStoreGithubAuthSecret() error {
username, token, err := getUserInputForGithubAuth() username, token, err := getUserInputForGithubAuth()
if err != nil { if err != nil {
@ -219,7 +249,7 @@ func createAndStoreGithubAuthSecret() error {
} }
// --- User Input and Helper Functions --- // --- User Input and Helper Functions ---
func getUserInput() (username, registryToken, orgToken string, err error) { func getGHCRUserInput() (username, registryToken, orgToken string, err error) {
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter your GitHub username: ") fmt.Print("Enter your GitHub username: ")
@ -246,6 +276,29 @@ func getUserInput() (username, registryToken, orgToken string, err error) {
return return
} }
func getUserInputForDockerHub() (username, password string, err error) {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter your Docker Hub username: ")
username, err = reader.ReadString('\n')
if err != nil {
return
}
username = strings.TrimSpace(username)
fmt.Print("Enter your Docker Hub password or access token: ")
passwordBytes, err := term.ReadPassword(int(syscall.Stdin))
fmt.Println()
if err != nil {
return "", "", err
}
password = string(passwordBytes)
if username == "" || password == "" {
err = fmt.Errorf("username and password cannot be empty")
}
return
}
func getUserInputForGithubAuth() (username, token string, err error) { func getUserInputForGithubAuth() (username, token string, err error) {
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)
@ -304,11 +357,11 @@ func promptForToken(reader *bufio.Reader, prompt string) (string, error) {
} }
// createDockerConfig creates a Docker config JSON string. // createDockerConfig creates a Docker config JSON string.
func createDockerConfig(username, token string) (string, error) { func createDockerConfig(registry, username, token string) (string, error) {
auth := base64.StdEncoding.EncodeToString([]byte(username + ":" + token)) auth := base64.StdEncoding.EncodeToString([]byte(username + ":" + token))
config := DockerConfig{ config := DockerConfig{
Auths: map[string]DockerAuth{ Auths: map[string]DockerAuth{
ghcrRegistry: { registry: {
Username: username, Username: username,
Password: token, Password: token,
Auth: auth, Auth: auth,