re-written for 0.5

This commit is contained in:
Ivan Pedrazas
2016-12-09 16:00:57 +00:00
parent 641b474e58
commit 27a5d8b194
7 changed files with 163 additions and 117 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ pipeline:
environment:
- CGO_ENABLED=0
commands:
- go get
- go vet
- go test -cover -coverprofile=coverage.out
- go build -ldflags "-s -w -X main.build=$DRONE_BUILD_NUMBER" -a -tags netgo
+1 -1
View File
@@ -1 +1 @@
eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9nbwoKcGlwZWxpbmU6CiAgdGVzdDoKICAgIGltYWdlOiBnb2xhbmc6MS42CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBDR09fRU5BQkxFRD0wCiAgICBjb21tYW5kczoKICAgICAgLSBnbyBnZXQKICAgICAgLSBnbyB0ZXN0IC1jb3ZlciAtY292ZXJwcm9maWxlPWNvdmVyYWdlLm91dAogICAgICAtIGdvIGJ1aWxkIC1sZGZsYWdzICItcyAtdyAtWCBtYWluLmJ1aWxkPSREUk9ORV9CVUlMRF9OVU1CRVIiIC1hIC10YWdzIG5ldGdvCgoKICBidWlsZF9kb2NrZXJfaW1hZ2U6CiAgICBpbWFnZTogZG9ja2VyOjEuMTIKICAgIGVudmlyb25tZW50OgogICAgICAtIERPQ0tFUl9IT1NUPXRjcDovLzEyNy4wLjAuMToyMzc1CiAgICAgIC0gVEFHPSR7RFJPTkVfQlJBTkNIfS0ke0RST05FX0NPTU1JVF9TSEE6MDo3fQogICAgY29tbWFuZHM6CiAgICAgIC0gZG9ja2VyIGxvZ2luIC11PSIke1FVQVlfVVNFUk5BTUV9IiAtcD0iJHtRVUFZX1BBU1NXT1JEfSIgcXVheS5pbwogICAgICAtIGRvY2tlciBidWlsZCAtdCBpbWFnZSAuICAgICAgCiAgICAgIC0gZG9ja2VyIHRhZyBpbWFnZSBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtOmxhdGVzdAogICAgICAtIGRvY2tlciB0YWcgaW1hZ2UgcXVheS5pby9pcGVkcmF6YXMvZHJvbmUtaGVsbToke1RBR30KICAgICAgLSBkb2NrZXIgcHVzaCBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgICAgICAgCnNlcnZpY2VzOgogIGRpbmQ6CiAgICBpbWFnZTogZG9ja2VyOjEuMTItZGluZAogICAgcHJpdmlsZWdlZDogdHJ1ZQogICAgY29tbWFuZDoKICAgICAgLSAiLXMiCiAgICAgIC0gIm92ZXJsYXkiCiAgCnBsdWdpbjoKICBuYW1lOiBkcm9uZS1oZWxtCiAgZGVzYzogRXhlY3V0ZSBoZWxtIHRvIAogIHR5cGU6IGRlcGxveQogIGltYWdlOiBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgbGFiZWxzOgogICAgLSBkZXBsb3kKICAgIC0ga3ViZXJuZXRlcwogICAgLSBoZWxt.JjzQKfmPjoGJq56ZeiB--ZLF9nYwAFFkXdY6PtcFJmc
eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9nbwoKcGlwZWxpbmU6CiAgdGVzdDoKICAgIGltYWdlOiBnb2xhbmc6MS42CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBDR09fRU5BQkxFRD0wCiAgICBjb21tYW5kczoKICAgICAgLSBnbyB2ZXQKICAgICAgLSBnbyB0ZXN0IC1jb3ZlciAtY292ZXJwcm9maWxlPWNvdmVyYWdlLm91dAogICAgICAtIGdvIGJ1aWxkIC1sZGZsYWdzICItcyAtdyAtWCBtYWluLmJ1aWxkPSREUk9ORV9CVUlMRF9OVU1CRVIiIC1hIC10YWdzIG5ldGdvCgoKICBidWlsZF9kb2NrZXJfaW1hZ2U6CiAgICBpbWFnZTogZG9ja2VyOjEuMTIKICAgIGVudmlyb25tZW50OgogICAgICAtIERPQ0tFUl9IT1NUPXRjcDovLzEyNy4wLjAuMToyMzc1CiAgICAgIC0gVEFHPSR7RFJPTkVfQlJBTkNIfS0ke0RST05FX0NPTU1JVF9TSEE6MDo3fQogICAgY29tbWFuZHM6CiAgICAgIC0gZG9ja2VyIGxvZ2luIC11PSIke1FVQVlfVVNFUk5BTUV9IiAtcD0iJHtRVUFZX1BBU1NXT1JEfSIgcXVheS5pbwogICAgICAtIGRvY2tlciBidWlsZCAtdCBpbWFnZSAuICAgICAgCiAgICAgIC0gZG9ja2VyIHRhZyBpbWFnZSBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtOmxhdGVzdAogICAgICAtIGRvY2tlciB0YWcgaW1hZ2UgcXVheS5pby9pcGVkcmF6YXMvZHJvbmUtaGVsbToke1RBR30KICAgICAgLSBkb2NrZXIgcHVzaCBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgICAgICAgCnNlcnZpY2VzOgogIGRpbmQ6CiAgICBpbWFnZTogZG9ja2VyOjEuMTItZGluZAogICAgcHJpdmlsZWdlZDogdHJ1ZQogICAgY29tbWFuZDoKICAgICAgLSAiLXMiCiAgICAgIC0gIm92ZXJsYXkiCiAgCnBsdWdpbjoKICBuYW1lOiBkcm9uZS1oZWxtCiAgZGVzYzogRXhlY3V0ZSBoZWxtIHRvIAogIHR5cGU6IGRlcGxveQogIGltYWdlOiBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgbGFiZWxzOgogICAgLSBkZXBsb3kKICAgIC0ga3ViZXJuZXRlcwogICAgLSBoZWxt.JtmNeLEps3kdW3aOA2Rde5sYan53yZ67vwYCZlAYsKY
+11 -37
View File
@@ -7,17 +7,11 @@ For example, this configuration will deploy Jenkins using the [stable/jenkins ch
pipeline:
deploy:
image: ipedrazas/drone-helm
helm_command:
- "install"
- "--name"
- "my-release"
- "stable/jenkins"
- "--debug"
- "--dry-run"
image: quay.io/ipedrazas/drone-helm
helm_command: "install --name my-release stable/jenkins --debug --dry-run"
api_server: "http://my_api_server"
kubernetes_token: "secret token"
skip_tls_verify: "true"
skip_tls_verify: true
If you don't know where to get a token from, you can execute the following command:
@@ -31,36 +25,16 @@ For example, in a cluster where there's a pod called `nginx-1212390922-fdz1x` we
To test the plugin, you can run `minikube` and just run the docker image as follows:
docker run -i ipedrazas/drone-helm /bin/drone-helm <<EOF
{
"vargs": {
"helm_command": ["version"],
"api_server":"https://192.168.64.5:8443",
"kubernetes_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tcnloeTciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjU5ZWQzYjM1LWI0MmUtMTFlNi05ZDI3LTFlZGZkMzA0MTNhNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.aGX19xTFJdxC6d5hObKUms9Kaq0wR8fMypXTnsfjC6XjiA3_QWX9LJdRFl6wvZTRoIAjuOhAJKNAKhLQ3sK0aKrddNxn2is-HCb88BXma3BrHWOtkwajvZ1dyAhZOe2fY1I77t_mrbvTMqJ4udsom6roHf-KL8j29DJWsV0nFh6VKyvqN8f7FsNG3WuH3SFZX_LfcE0HfZxrDaVEi-CkDo0sGCqIefDk2sn4IQD6b1Ng-grJWSN-YtrcDDduEKlUHPSRMmMtWa3-Q61-yQqlyqATGbxC3UwqwaLfjCrTkg1Uikv4jWDP3-eNmuQCqG9PHKulA1riTFAgxbr09zoYxg",
"namespace": "default",
"kubeconfig": "/root/.kube/config",
"skip_tls_verify": "true"
}
}
EOF
This will display the helm version in the plugin and the helm version in the cluster. The following example will test
the previous `.drone.yml` configuration:
docker run --rm \
-e PLUGIN_HELM_COMMAND="install --name my-release stable/jenkins --debug --dry-run" \
-e PLUGIN_API_SERVER=https://192.168.64.5:8443 \
-e PLUGIN_TOKEN="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tcnloeTciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjU5ZWQzYjM1LWI0MmUtMTFlNi05ZDI3LTFlZGZkMzA0MTNhNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.aGX19xTFJdxC6d5hObKUms9Kaq0wR8fMypXTnsfjC6XjiA3_QWX9LJdRFl6wvZTRoIAjuOhAJKNAKhLQ3sK0aKrddNxn2is-HCb88BXma3BrHWOtkwajvZ1dyAhZOe2fY1I77t_mrbvTMqJ4udsom6roHf-KL8j29DJWsV0nFh6VKyvqN8f7FsNG3WuH3SFZX_LfcE0HfZxrDaVEi-CkDo0sGCqIefDk2sn4IQD6b1Ng-grJWSN-YtrcDDduEKlUHPSRMmMtWa3-Q61-yQqlyqATGbxC3UwqwaLfjCrTkg1Uikv4jWDP3-eNmuQCqG9PHKulA1riTFAgxbr09zoYxg" \
-e PLUGIN_NAMESPACE=default \
-e PLUGIN_SKIP_TLS_VERIFY=true \
quay.io/ipedrazas/drone-helm
docker run -i ipedrazas/drone-helm <<EOF
{
"vargs": {
"helm_command": ["install", "--name", "my-release", "stable/jenkins", "--debug", "--dry-run"],
"api_server":"https://192.168.64.5:8443",
"kubernetes_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tcnloeTciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjU5ZWQzYjM1LWI0MmUtMTFlNi05ZDI3LTFlZGZkMzA0MTNhNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.aGX19xTFJdxC6d5hObKUms9Kaq0wR8fMypXTnsfjC6XjiA3_QWX9LJdRFl6wvZTRoIAjuOhAJKNAKhLQ3sK0aKrddNxn2is-HCb88BXma3BrHWOtkwajvZ1dyAhZOe2fY1I77t_mrbvTMqJ4udsom6roHf-KL8j29DJWsV0nFh6VKyvqN8f7FsNG3WuH3SFZX_LfcE0HfZxrDaVEi-CkDo0sGCqIefDk2sn4IQD6b1Ng-grJWSN-YtrcDDduEKlUHPSRMmMtWa3-Q61-yQqlyqATGbxC3UwqwaLfjCrTkg1Uikv4jWDP3-eNmuQCqG9PHKulA1riTFAgxbr09zoYxg",
"namespace": "default",
"kubeconfig": "/root/.kube/config",
"skip_tls_verify": "true"
}
}
EOF
Happy Helming!
+1 -1
View File
@@ -20,4 +20,4 @@ preferences: {}
users:
- name: helm
user:
token: {{ .KubernetesToken }}
token: {{ .Token }}
+53 -77
View File
@@ -2,89 +2,65 @@ package main
import (
"fmt"
"html/template"
"log"
"os"
"os/exec"
"github.com/drone/drone-go/drone"
"github.com/drone/drone-plugin-go/plugin"
"github.com/Sirupsen/logrus"
"github.com/joho/godotenv"
"github.com/urfave/cli"
)
var build = "0" // build number set at compile-time
// PluginParams to execute Helm
type PluginParams struct {
Command []string `json:"helm_command"`
APIServer string `json:"api_server"`
KubernetesToken string `json:"kubernetes_token"`
Namespace string `json:"namespace"`
Debug string `json:"debug"`
Kubeconfig string `json:"kubeconfig"`
SkipTLSVerify string `json:"skip_tls_verify"`
}
func isValidConfig(params *PluginParams) bool {
if params.APIServer == "" {
return false
}
if params.KubernetesToken == "" {
return false
}
return true
}
func initialiseKubeconfig(params *PluginParams) {
fmt.Println(params)
if params.Kubeconfig == "" {
params.Kubeconfig = "/root/.kube/config"
}
if isValidConfig(params) {
t, _ := template.ParseFiles("/root/.kube/kubeconfig")
f, err := os.Create(params.Kubeconfig)
if err != nil {
log.Println("create file: ", err)
return
}
err = t.Execute(f, params)
if err != nil {
log.Print("execute: ", err)
return
}
f.Close()
}
}
func main() {
var (
repo = new(drone.Repo)
build = new(drone.Build)
sys = new(drone.System)
pluginParams = new(PluginParams)
)
plugin.Param("build", build)
plugin.Param("repo", repo)
plugin.Param("system", sys)
plugin.Param("vargs", pluginParams)
plugin.MustParse()
initialiseKubeconfig(pluginParams)
init := make([]string, 1)
init[0] = "init"
runCommand("/bin/helm", init)
runCommand("/bin/helm", pluginParams.Command)
}
func runCommand(command string, params []string) {
cmd := new(exec.Cmd)
cmd = exec.Command(command, params...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Printf("%s\n", err)
app := cli.NewApp()
app.Name = "helm plugin"
app.Usage = "helm plugin"
app.Action = run
app.Version = fmt.Sprintf("1.0.%s", build)
app.Flags = []cli.Flag{
cli.StringSliceFlag{
Name: "helm_command",
Usage: "add the command Helm has to execute",
EnvVar: "PLUGIN_HELM_COMMAND",
},
cli.StringFlag{
Name: "api_server",
Usage: "Api Server url",
EnvVar: "PLUGIN_API_SERVER",
},
cli.StringFlag{
Name: "token",
Usage: "Kubernetes Token",
EnvVar: "PLUGIN_TOKEN",
},
cli.StringFlag{
Name: "namespace",
Usage: "Kubernetes namespace",
EnvVar: "PLUGIN_NAMESPACE",
},
cli.BoolFlag{
Name: "skip_tls_verify",
Usage: "Skip TLS verification",
EnvVar: "PLUGIN_SKIP_TLS_VERIFY",
},
}
if err := app.Run(os.Args); err != nil {
logrus.Fatal(err)
}
}
func run(c *cli.Context) error {
if c.String("env-file") != "" {
_ = godotenv.Load(c.String("env-file"))
}
plugin := Plugin{
Config: Config{
APIServer: c.String("api_server"),
Token: c.String("token"),
HelmCommand: c.StringSlice("helm_command"),
Namespace: c.String("namespace"),
SkipTLSVerify: c.Bool("skip_tls_verify"),
},
}
return plugin.Exec()
}
+73
View File
@@ -0,0 +1,73 @@
package main
import (
"fmt"
"os"
"os/exec"
"strings"
"github.com/alecthomas/template"
)
var HELM_BIN = "/bin/helm"
var KUBECONFIG = "/root/.kube/kubeconfig"
var CONFIG = "/root/.kube/config"
type (
// Config maps the params we need to run Helm
Config struct {
APIServer string `json:"api_server"`
Token string `json:"token"`
HelmCommand []string `json:"helm_command"`
SkipTLSVerify bool `json:"tls_skip_verify"`
Namespace string `json:"namespace"`
}
// Plugin default
Plugin struct {
Config Config
}
)
// Exec default method
func (p Plugin) Exec() error {
if p.Config.APIServer == "" {
return fmt.Errorf("Error: API Server is needed to deploy.")
}
if p.Config.Token == "" {
return fmt.Errorf("Error: Token is needed to deploy.")
}
initialiseKubeconfig(&p.Config, KUBECONFIG, CONFIG)
fmt.Println(p)
init := make([]string, 1)
init[0] = "init"
err := runCommand(init)
if err != nil {
return fmt.Errorf("Error running helm comand: " + strings.Join(init[:], " "))
}
cmd := p.Config.HelmCommand
err = runCommand(cmd)
if err != nil {
return fmt.Errorf("Error running helm comand: " + strings.Join(cmd[:], " "))
}
return nil
}
func initialiseKubeconfig(params *Config, source string, target string) error {
fmt.Println(params)
t, _ := template.ParseFiles(source)
f, err := os.Create(target)
err = t.Execute(f, params)
f.Close()
return err
}
func runCommand(params []string) error {
cmd := new(exec.Cmd)
cmd = exec.Command(HELM_BIN, params...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
return err
}
+23
View File
@@ -0,0 +1,23 @@
package main
import "testing"
func TestInitialiseKubeconfig(t *testing.T) {
cmd := make([]string, 2)
cmd[0] = "install"
cmd[1] = "--debug"
plugin := Plugin{
Config: Config{
APIServer: "http://myapiserver",
Token: "secret-token",
HelmCommand: cmd,
Namespace: "default",
SkipTLSVerify: true,
},
}
initialiseKubeconfig(&plugin.Config, "kubeconfig", "config3.test")
}