diff --git a/cmd/ci.go b/cmd/ci.go new file mode 100644 index 0000000000000000000000000000000000000000..576bfbe89491b55c627bfd1040bb7aa0edc5b8bb --- /dev/null +++ b/cmd/ci.go @@ -0,0 +1,55 @@ +// Copyright © 2019 NAME HERE +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "github.com/spf13/cobra" +) + +var dockerRegistry string +var dockerRegistryNamespace string +var imageTag string +var environmentSuffix string + +// configCmd represents the config command +var ciCmd = &cobra.Command{ + Use: "ci", + Short: "Build tools for the CI system", + // Run: func(cmd *cobra.Command, args []string) { + // fmt.Println("config called") + // }, +} + +func init() { + rootCmd.AddCommand(ciCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // configCmd.PersistentFlags().String("foo", "", "A help for foo") + ciCmd.PersistentFlags().StringVarP(&dockerRegistry, "registry", "r", "", "url of the docker registry") + ciCmd.PersistentFlags().StringVarP(&dockerRegistryNamespace, "registry-namespace", "n", "", "namespace in the docker registry") + ciCmd.PersistentFlags().StringVarP(&imageTag, "image", "i", "", "image tag for docker") + ciCmd.PersistentFlags().StringVarP(&environmentSuffix, "environment", "e", "", "environment suffix to append to helm release name") + + ciCmd.MarkPersistentFlagRequired("registry") + ciCmd.MarkPersistentFlagRequired("registry-namespace") + ciCmd.MarkPersistentFlagRequired("image") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // configCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/cmd/ci_build.go b/cmd/ci_build.go new file mode 100644 index 0000000000000000000000000000000000000000..b54d10d366cabf3a895eb0886e22f8282e7b47c8 --- /dev/null +++ b/cmd/ci_build.go @@ -0,0 +1,82 @@ +// Copyright © 2019 NAME HERE +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "git.psu.edu/k8s/devtool/config" + "git.psu.edu/k8s/devtool/environment" + "github.com/fatih/color" + "github.com/spf13/cobra" +) + +// buildCmd represents the build command +var ciBuildCmd = &cobra.Command{ + Use: "build", + Short: "build the application within the CI system", + RunE: func(cmd *cobra.Command, args []string) error { + conf, err := config.New(configFile) + if err != nil { + color.New(color.FgRed).PrintFunc()("Error reading configuration file: %s", configFile) + return err + } + + err = buildCiDocker(conf) + if err != nil { + color.Red("Failed to build docker image.") + return err + } + return nil + }, +} + +func init() { + ciCmd.AddCommand(ciBuildCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // buildCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // buildCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") + +} + +func buildCiDocker(config config.Config) error { + color.Blue("Building Docker Containers") + + for _, deployable := range config.Deployables { + dockerfile := deployable.Dockerfile + image := deployable.Name + + dockerImage := dockerRegistry + "/" + dockerRegistryNamespace + "/" + image + dockerTag := dockerImage + ":" + imageTag + + color.New(color.FgGreen).PrintFunc()("Building: ", dockerTag) + err := environment.Run(true, "docker", "build", "-t", dockerTag, "-f", dockerfile, ".") + if err != nil { + return err + } + + color.New(color.FgGreen).PrintFunc()("Pushing Docker image: ", dockerTag) + err = environment.Run(true, "docker", "push", dockerImage) + if err != nil { + return err + } + } + return nil +} diff --git a/cmd/ci_deploy.go b/cmd/ci_deploy.go new file mode 100644 index 0000000000000000000000000000000000000000..35e068f10df8bb33e58717ffcc13f753c458b56a --- /dev/null +++ b/cmd/ci_deploy.go @@ -0,0 +1,88 @@ +// Copyright © 2019 NAME HERE +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "os" + + "git.psu.edu/k8s/devtool/config" + "git.psu.edu/k8s/devtool/environment" + "github.com/fatih/color" + "github.com/spf13/cobra" +) + +// buildCmd represents the build command +var ciDeployCmd = &cobra.Command{ + Use: "deploy", + Short: "deploy the application within the CI system", + RunE: func(cmd *cobra.Command, args []string) error { + conf, err := config.New(configFile) + if err != nil { + color.New(color.FgRed).PrintFunc()("Error reading configuration file: %s", configFile) + return err + } + + err = fluxDeployCi(conf) + if err != nil { + color.Red("Failed to build docker image.") + return err + } + return nil + }, +} + +func init() { + ciCmd.AddCommand(ciDeployCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // buildCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // buildCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} + +func fluxDeployCi(config config.Config) error { + color.Blue("Updating Flux Releases") + + for _, deployable := range config.Deployables { + image := deployable.Name + + dockerImage := dockerRegistry + "/" + dockerRegistryNamespace + "/" + image + dockerTag := dockerImage + ":" + imageTag + + var releaseName string + if environmentSuffix == "" { + releaseName = deployable.Name + } else { + releaseName = deployable.Name + "-" + environmentSuffix + } + color.Blue("Updating Flux Release:", releaseName) + + os.Setenv("KUBE_SERVICE_NAME", releaseName) + os.Setenv("DOCKER_IMAGE_TAG", dockerTag) + os.Setenv("CI_PROJECT_NAME", image) + + err := environment.Run(true, "fluxhelmrelease") + if err != nil { + color.Red("fluxhelmrelease error.") + return err + } + } + return nil +}