mirror of
https://github.com/ipedrazas/drone-helm.git
synced 2026-06-04 18:24:13 +08:00
re-written for 0.5
This commit is contained in:
+1
-1
@@ -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
@@ -1 +1 @@
|
||||
eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9nbwoKcGlwZWxpbmU6CiAgdGVzdDoKICAgIGltYWdlOiBnb2xhbmc6MS42CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBDR09fRU5BQkxFRD0wCiAgICBjb21tYW5kczoKICAgICAgLSBnbyBnZXQKICAgICAgLSBnbyB0ZXN0IC1jb3ZlciAtY292ZXJwcm9maWxlPWNvdmVyYWdlLm91dAogICAgICAtIGdvIGJ1aWxkIC1sZGZsYWdzICItcyAtdyAtWCBtYWluLmJ1aWxkPSREUk9ORV9CVUlMRF9OVU1CRVIiIC1hIC10YWdzIG5ldGdvCgoKICBidWlsZF9kb2NrZXJfaW1hZ2U6CiAgICBpbWFnZTogZG9ja2VyOjEuMTIKICAgIGVudmlyb25tZW50OgogICAgICAtIERPQ0tFUl9IT1NUPXRjcDovLzEyNy4wLjAuMToyMzc1CiAgICAgIC0gVEFHPSR7RFJPTkVfQlJBTkNIfS0ke0RST05FX0NPTU1JVF9TSEE6MDo3fQogICAgY29tbWFuZHM6CiAgICAgIC0gZG9ja2VyIGxvZ2luIC11PSIke1FVQVlfVVNFUk5BTUV9IiAtcD0iJHtRVUFZX1BBU1NXT1JEfSIgcXVheS5pbwogICAgICAtIGRvY2tlciBidWlsZCAtdCBpbWFnZSAuICAgICAgCiAgICAgIC0gZG9ja2VyIHRhZyBpbWFnZSBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtOmxhdGVzdAogICAgICAtIGRvY2tlciB0YWcgaW1hZ2UgcXVheS5pby9pcGVkcmF6YXMvZHJvbmUtaGVsbToke1RBR30KICAgICAgLSBkb2NrZXIgcHVzaCBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgICAgICAgCnNlcnZpY2VzOgogIGRpbmQ6CiAgICBpbWFnZTogZG9ja2VyOjEuMTItZGluZAogICAgcHJpdmlsZWdlZDogdHJ1ZQogICAgY29tbWFuZDoKICAgICAgLSAiLXMiCiAgICAgIC0gIm92ZXJsYXkiCiAgCnBsdWdpbjoKICBuYW1lOiBkcm9uZS1oZWxtCiAgZGVzYzogRXhlY3V0ZSBoZWxtIHRvIAogIHR5cGU6IGRlcGxveQogIGltYWdlOiBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgbGFiZWxzOgogICAgLSBkZXBsb3kKICAgIC0ga3ViZXJuZXRlcwogICAgLSBoZWxt.JjzQKfmPjoGJq56ZeiB--ZLF9nYwAFFkXdY6PtcFJmc
|
||||
eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9nbwoKcGlwZWxpbmU6CiAgdGVzdDoKICAgIGltYWdlOiBnb2xhbmc6MS42CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBDR09fRU5BQkxFRD0wCiAgICBjb21tYW5kczoKICAgICAgLSBnbyB2ZXQKICAgICAgLSBnbyB0ZXN0IC1jb3ZlciAtY292ZXJwcm9maWxlPWNvdmVyYWdlLm91dAogICAgICAtIGdvIGJ1aWxkIC1sZGZsYWdzICItcyAtdyAtWCBtYWluLmJ1aWxkPSREUk9ORV9CVUlMRF9OVU1CRVIiIC1hIC10YWdzIG5ldGdvCgoKICBidWlsZF9kb2NrZXJfaW1hZ2U6CiAgICBpbWFnZTogZG9ja2VyOjEuMTIKICAgIGVudmlyb25tZW50OgogICAgICAtIERPQ0tFUl9IT1NUPXRjcDovLzEyNy4wLjAuMToyMzc1CiAgICAgIC0gVEFHPSR7RFJPTkVfQlJBTkNIfS0ke0RST05FX0NPTU1JVF9TSEE6MDo3fQogICAgY29tbWFuZHM6CiAgICAgIC0gZG9ja2VyIGxvZ2luIC11PSIke1FVQVlfVVNFUk5BTUV9IiAtcD0iJHtRVUFZX1BBU1NXT1JEfSIgcXVheS5pbwogICAgICAtIGRvY2tlciBidWlsZCAtdCBpbWFnZSAuICAgICAgCiAgICAgIC0gZG9ja2VyIHRhZyBpbWFnZSBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtOmxhdGVzdAogICAgICAtIGRvY2tlciB0YWcgaW1hZ2UgcXVheS5pby9pcGVkcmF6YXMvZHJvbmUtaGVsbToke1RBR30KICAgICAgLSBkb2NrZXIgcHVzaCBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgICAgICAgCnNlcnZpY2VzOgogIGRpbmQ6CiAgICBpbWFnZTogZG9ja2VyOjEuMTItZGluZAogICAgcHJpdmlsZWdlZDogdHJ1ZQogICAgY29tbWFuZDoKICAgICAgLSAiLXMiCiAgICAgIC0gIm92ZXJsYXkiCiAgCnBsdWdpbjoKICBuYW1lOiBkcm9uZS1oZWxtCiAgZGVzYzogRXhlY3V0ZSBoZWxtIHRvIAogIHR5cGU6IGRlcGxveQogIGltYWdlOiBxdWF5LmlvL2lwZWRyYXphcy9kcm9uZS1oZWxtCiAgbGFiZWxzOgogICAgLSBkZXBsb3kKICAgIC0ga3ViZXJuZXRlcwogICAgLSBoZWxt.JtmNeLEps3kdW3aOA2Rde5sYan53yZ67vwYCZlAYsKY
|
||||
@@ -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
@@ -20,4 +20,4 @@ preferences: {}
|
||||
users:
|
||||
- name: helm
|
||||
user:
|
||||
token: {{ .KubernetesToken }}
|
||||
token: {{ .Token }}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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")
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user