refactor
Signed-off-by: James Strong <james.strong@chainguard.dev>
This commit is contained in:
parent
e3f9743e65
commit
5b1c422208
3 changed files with 159 additions and 143 deletions
|
@ -61,7 +61,7 @@ func UpdateVersion(appVersion string) {
|
||||||
chart, err := chartutil.LoadChartfile(HelmChartPath)
|
chart, err := chartutil.LoadChartfile(HelmChartPath)
|
||||||
CheckIfError(err, "HELM Could not Load Chart")
|
CheckIfError(err, "HELM Could not Load Chart")
|
||||||
|
|
||||||
Info("HELM Ingress-Nginx App Version: %s Chart AppVersion: %s", appVersion, chart.AppVersion)
|
Info("HELM Ingress-Nginx NEW Chart App Version: %s Previous Chart AppVersion: %s", appVersion, chart.AppVersion)
|
||||||
if appVersion == chart.AppVersion {
|
if appVersion == chart.AppVersion {
|
||||||
Warning("HELM Ingress NGINX Version didnt change Ingress-Nginx App Version: %s Chart AppVersion: %s", appVersion, chart.AppVersion)
|
Warning("HELM Ingress NGINX Version didnt change Ingress-Nginx App Version: %s Chart AppVersion: %s", appVersion, chart.AppVersion)
|
||||||
return
|
return
|
||||||
|
@ -77,7 +77,7 @@ func UpdateVersion(appVersion string) {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
chart.Version = cTag.String()
|
chart.Version = cTag.String()
|
||||||
Debug("HELM Updated Chart Version: %v", chart.Version)
|
Info("HELM Updated Chart Version: %v", chart.Version)
|
||||||
|
|
||||||
err = chartutil.SaveChartfile(HelmChartPath, chart)
|
err = chartutil.SaveChartfile(HelmChartPath, chart)
|
||||||
CheckIfError(err, "HELM Saving new Chart")
|
CheckIfError(err, "HELM Saving new Chart")
|
||||||
|
@ -148,6 +148,7 @@ func HelmDocs() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Info("HELM - Running Helm Docs")
|
||||||
return sh.Command("helm-docs", fmt.Sprintf("--chart-search-root=%s", CHART_PATH)).Run()
|
return sh.Command("helm-docs", fmt.Sprintf("--chart-search-root=%s", CHART_PATH)).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,9 +30,7 @@ import (
|
||||||
"github.com/google/go-github/v48/github"
|
"github.com/google/go-github/v48/github"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -90,7 +88,7 @@ var controllerReleaseCmd = &cobra.Command{
|
||||||
Short: "Release Ingress-nginx Controller",
|
Short: "Release Ingress-nginx Controller",
|
||||||
Long: "Release a new version of ingress-nginx controller",
|
Long: "Release a new version of ingress-nginx controller",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
NewRelease(version)
|
ControllerNewRelease(version)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,19 +118,6 @@ type IngressRelease struct {
|
||||||
Release *github.RepositoryRelease
|
Release *github.RepositoryRelease
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReleaseNote - All the pieces of information/documents that get updated during a release
|
|
||||||
type ReleaseNote struct {
|
|
||||||
Version string //released version
|
|
||||||
NewControllerVersion string //the new controller version being release
|
|
||||||
PreviousControllerVersion string //the previous controller tag/release
|
|
||||||
ControllerImages []ControllerImage //the full image digests
|
|
||||||
DepUpdates []string //list of dependabot updates to put in the changelog
|
|
||||||
Updates []string //updates with no category
|
|
||||||
HelmUpdates []string //updates to the ingress-nginx helm chart
|
|
||||||
NewHelmChartVersion string //update to the helm chart version
|
|
||||||
PreviousHelmChartVersion string //previous helm chart version
|
|
||||||
}
|
|
||||||
|
|
||||||
// IMAGES_YAML returns this data structure
|
// IMAGES_YAML returns this data structure
|
||||||
type ImageYamls []ImageElement
|
type ImageYamls []ImageElement
|
||||||
|
|
||||||
|
@ -150,7 +135,7 @@ func PromoteImage(version, sha string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Release Create a new release of ingress nginx controller
|
// Release Create a new release of ingress nginx controller
|
||||||
func NewRelease(version string) {
|
func ControllerNewRelease(version string) {
|
||||||
|
|
||||||
//update ingress-nginx version
|
//update ingress-nginx version
|
||||||
//This is the step that kicks all the release process
|
//This is the step that kicks all the release process
|
||||||
|
@ -171,15 +156,10 @@ func NewRelease(version string) {
|
||||||
NewControllerTag(version)
|
NewControllerTag(version)
|
||||||
|
|
||||||
//make release notes
|
//make release notes
|
||||||
releaseNotes, err := ReleaseNotes(version)
|
releaseNotes, err := ControllerReleaseNotes(version)
|
||||||
CheckIfError(err, "RELEASE Creating Release Notes for version %s", version)
|
CheckIfError(err, "RELEASE Creating Release Notes for version %s", version)
|
||||||
Info("RELEASE Release Notes %s completed", releaseNotes.Version)
|
Info("RELEASE Release Notes %s completed", releaseNotes.Version)
|
||||||
|
|
||||||
//update chart values.yaml new controller tag and image digest
|
|
||||||
releaseNotes.PreviousHelmChartVersion = currentChartVersion()
|
|
||||||
|
|
||||||
//update the Helm Chart appVersion aka the controller tag
|
|
||||||
updateChartValue("controller.image.tag", fmt.Sprintf("v%s", releaseNotes.Version))
|
|
||||||
Debug("releaseNotes.ControllerImages[0].Name %s", releaseNotes.ControllerImages[0].Name)
|
Debug("releaseNotes.ControllerImages[0].Name %s", releaseNotes.ControllerImages[0].Name)
|
||||||
Debug("releaseNotes.ControllerImages[1].Name %s", releaseNotes.ControllerImages[1].Name)
|
Debug("releaseNotes.ControllerImages[1].Name %s", releaseNotes.ControllerImages[1].Name)
|
||||||
|
|
||||||
|
@ -195,6 +175,12 @@ func NewRelease(version string) {
|
||||||
updateChartValue("controller.image.digestChroot", releaseNotes.ControllerImages[1].Digest)
|
updateChartValue("controller.image.digestChroot", releaseNotes.ControllerImages[1].Digest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//update the Helm Chart appVersion aka the controller tag
|
||||||
|
updateChartValue("controller.image.tag", fmt.Sprintf("v%s", releaseNotes.Version))
|
||||||
|
|
||||||
|
//update chart values.yaml new controller tag and image digest
|
||||||
|
releaseNotes.PreviousHelmChartVersion = currentChartVersion()
|
||||||
|
|
||||||
//update helm chart app version
|
//update helm chart app version
|
||||||
UpdateVersion(version)
|
UpdateVersion(version)
|
||||||
|
|
||||||
|
@ -297,124 +283,6 @@ func commitsBetweenTags() []string {
|
||||||
return strings.Split(string(commitLog), "\n")
|
return strings.Split(string(commitLog), "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate Release Notes
|
|
||||||
func ReleaseNotes(newVersion string) (*ReleaseNote, error) {
|
|
||||||
var newReleaseNotes = ReleaseNote{}
|
|
||||||
|
|
||||||
newReleaseNotes.Version = newVersion
|
|
||||||
allControllerTags := getAllControllerTags()
|
|
||||||
|
|
||||||
//new version
|
|
||||||
newReleaseNotes.NewControllerVersion = allControllerTags[0]
|
|
||||||
newControllerVersion := fmt.Sprintf("controller-v%s", newVersion)
|
|
||||||
|
|
||||||
//the newControllerVersion should match the latest tag
|
|
||||||
if newControllerVersion != allControllerTags[0] {
|
|
||||||
return nil, errors.New(fmt.Sprintf("Generating release new version %s didnt match the current latest tag %s", newControllerVersion, allControllerTags[0]))
|
|
||||||
}
|
|
||||||
//previous version
|
|
||||||
newReleaseNotes.PreviousControllerVersion = allControllerTags[1]
|
|
||||||
|
|
||||||
Info("New Version: %s Old Version: %s", newReleaseNotes.NewControllerVersion, newReleaseNotes.PreviousControllerVersion)
|
|
||||||
|
|
||||||
commits := commitsBetweenTags()
|
|
||||||
|
|
||||||
//dependency_updates
|
|
||||||
//all_updates
|
|
||||||
var allUpdates []string
|
|
||||||
var depUpdates []string
|
|
||||||
var helmUpdates []string
|
|
||||||
prRegex := regexp.MustCompile("\\(#\\d+\\)")
|
|
||||||
depBot := regexp.MustCompile("^(\\w){1,10} Bump ")
|
|
||||||
helmRegex := regexp.MustCompile("helm|chart")
|
|
||||||
for i, s := range commits {
|
|
||||||
//matches on PR
|
|
||||||
if prRegex.Match([]byte(s)) {
|
|
||||||
//matches a dependant bot update
|
|
||||||
if depBot.Match([]byte(s)) { //
|
|
||||||
Debug("#%v DEPENDABOT %v", i, s)
|
|
||||||
u := strings.SplitN(s, " ", 2)
|
|
||||||
depUpdates = append(depUpdates, u[1])
|
|
||||||
} else { // add it to the all updates slice
|
|
||||||
Debug("#%v ALL UPDATES %v", i, s)
|
|
||||||
u := strings.SplitN(s, " ", 2)
|
|
||||||
allUpdates = append(allUpdates, u[1])
|
|
||||||
|
|
||||||
//helm chart updates
|
|
||||||
if helmRegex.Match([]byte(s)) {
|
|
||||||
u := strings.SplitN(s, " ", 2)
|
|
||||||
helmUpdates = append(helmUpdates, u[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
helmUpdates = append(helmUpdates, fmt.Sprintf("Update Ingress-Nginx version %s", newReleaseNotes.NewControllerVersion))
|
|
||||||
|
|
||||||
newReleaseNotes.Updates = allUpdates
|
|
||||||
newReleaseNotes.DepUpdates = depUpdates
|
|
||||||
newReleaseNotes.HelmUpdates = helmUpdates
|
|
||||||
|
|
||||||
// Get the latest controller image digests from k8s.io promoter
|
|
||||||
imagesYaml, err := downloadFile(IMAGES_YAML)
|
|
||||||
if err != nil {
|
|
||||||
ErrorF("Could not download file %s : %s", IMAGES_YAML, err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
Debug("%s", imagesYaml)
|
|
||||||
|
|
||||||
data := ImageYamls{}
|
|
||||||
|
|
||||||
err = yaml.Unmarshal([]byte(imagesYaml), &data)
|
|
||||||
if err != nil {
|
|
||||||
ErrorF("Could not unmarshal images yaml %s", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
//controller
|
|
||||||
controllerDigest := findImageDigest(data, "controller", newVersion)
|
|
||||||
if len(controllerDigest) == 0 {
|
|
||||||
ErrorF("Controller Digest could not be found")
|
|
||||||
return nil, errors.New("Controller digest could not be found")
|
|
||||||
}
|
|
||||||
|
|
||||||
controllerChrootDigest := findImageDigest(data, "controller-chroot", newVersion)
|
|
||||||
if len(controllerChrootDigest) == 0 {
|
|
||||||
ErrorF("Controller Chroot Digest could not be found")
|
|
||||||
return nil, errors.New("Controller Chroot digest could not be found")
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug("Latest Controller Digest %v", controllerDigest)
|
|
||||||
Debug("Latest Controller Chroot Digest %v", controllerChrootDigest)
|
|
||||||
c1 := ControllerImage{
|
|
||||||
Digest: controllerDigest,
|
|
||||||
Registry: INGRESS_REGISTRY,
|
|
||||||
Name: "ingress-nginx/controller",
|
|
||||||
Tag: fmt.Sprintf("v%s", newReleaseNotes.Version),
|
|
||||||
}
|
|
||||||
|
|
||||||
c2 := ControllerImage{
|
|
||||||
Digest: controllerChrootDigest,
|
|
||||||
Registry: INGRESS_REGISTRY,
|
|
||||||
Name: "ingress-nginx/controller-chroot",
|
|
||||||
Tag: fmt.Sprintf("v%s", newReleaseNotes.Version),
|
|
||||||
}
|
|
||||||
|
|
||||||
newReleaseNotes.ControllerImages = append(newReleaseNotes.ControllerImages, c1)
|
|
||||||
newReleaseNotes.ControllerImages = append(newReleaseNotes.ControllerImages, c2)
|
|
||||||
Debug("New Release Controller Images %s %s", newReleaseNotes.ControllerImages[0].Digest, newReleaseNotes.ControllerImages[1].Digest)
|
|
||||||
|
|
||||||
if DEBUG {
|
|
||||||
newReleaseNotes.printRelease()
|
|
||||||
}
|
|
||||||
|
|
||||||
//write it all out to the changelog file
|
|
||||||
newReleaseNotes.template()
|
|
||||||
|
|
||||||
return &newReleaseNotes, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i ControllerImage) print() string {
|
func (i ControllerImage) print() string {
|
||||||
return fmt.Sprintf("%s/%s:%s@%s", i.Registry, i.Name, i.Tag, i.Digest)
|
return fmt.Sprintf("%s/%s:%s@%s", i.Registry, i.Name, i.Tag, i.Digest)
|
||||||
}
|
}
|
||||||
|
|
147
ingressctl/cmd/releaseNotes.go
Normal file
147
ingressctl/cmd/releaseNotes.go
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ReleaseNote - All the pieces of information/documents that get updated during a release
|
||||||
|
type ReleaseNote struct {
|
||||||
|
Version string //released version
|
||||||
|
NewControllerVersion string //the new controller version being release
|
||||||
|
PreviousControllerVersion string //the previous controller tag/release
|
||||||
|
ControllerImages []ControllerImage //the full image digests
|
||||||
|
DepUpdates []string //list of dependabot updates to put in the changelog
|
||||||
|
Updates []string //updates with no category
|
||||||
|
HelmUpdates []string //updates to the ingress-nginx helm chart
|
||||||
|
NewHelmChartVersion string //update to the helm chart version
|
||||||
|
PreviousHelmChartVersion string //previous helm chart version
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate Release Notes
|
||||||
|
func ControllerReleaseNotes(newVersion string) (*ReleaseNote, error) {
|
||||||
|
var newReleaseNotes = ReleaseNote{}
|
||||||
|
|
||||||
|
newReleaseNotes.Version = newVersion
|
||||||
|
allControllerTags := getAllControllerTags()
|
||||||
|
|
||||||
|
//new version
|
||||||
|
newReleaseNotes.NewControllerVersion = allControllerTags[0]
|
||||||
|
newControllerVersion := fmt.Sprintf("controller-v%s", newVersion)
|
||||||
|
|
||||||
|
//the newControllerVersion should match the latest tag
|
||||||
|
if newControllerVersion != allControllerTags[0] {
|
||||||
|
return nil, errors.New(fmt.Sprintf("Generating release new version %s didnt match the current latest tag %s", newControllerVersion, allControllerTags[0]))
|
||||||
|
}
|
||||||
|
//previous version
|
||||||
|
newReleaseNotes.PreviousControllerVersion = allControllerTags[1]
|
||||||
|
|
||||||
|
Info("New Version: %s Old Version: %s", newReleaseNotes.NewControllerVersion, newReleaseNotes.PreviousControllerVersion)
|
||||||
|
|
||||||
|
allUpdates, depUpdates, helmUpdates := getCommitUpdates(newVersion)
|
||||||
|
|
||||||
|
newReleaseNotes.Updates = allUpdates
|
||||||
|
newReleaseNotes.DepUpdates = depUpdates
|
||||||
|
newReleaseNotes.HelmUpdates = helmUpdates
|
||||||
|
|
||||||
|
// Get the latest controller image digests from k8s.io promoter
|
||||||
|
imagesYaml, err := downloadFile(IMAGES_YAML)
|
||||||
|
if err != nil {
|
||||||
|
ErrorF("Could not download file %s : %s", IMAGES_YAML, err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
Debug("%s", imagesYaml)
|
||||||
|
|
||||||
|
data := ImageYamls{}
|
||||||
|
|
||||||
|
err = yaml.Unmarshal([]byte(imagesYaml), &data)
|
||||||
|
if err != nil {
|
||||||
|
ErrorF("Could not unmarshal images yaml %s", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
//controller
|
||||||
|
controllerDigest := findImageDigest(data, "controller", newVersion)
|
||||||
|
if len(controllerDigest) == 0 {
|
||||||
|
ErrorF("Controller Digest could not be found")
|
||||||
|
return nil, errors.New("Controller digest could not be found")
|
||||||
|
}
|
||||||
|
|
||||||
|
controllerChrootDigest := findImageDigest(data, "controller-chroot", newVersion)
|
||||||
|
if len(controllerChrootDigest) == 0 {
|
||||||
|
ErrorF("Controller Chroot Digest could not be found")
|
||||||
|
return nil, errors.New("Controller Chroot digest could not be found")
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug("Latest Controller Digest %v", controllerDigest)
|
||||||
|
Debug("Latest Controller Chroot Digest %v", controllerChrootDigest)
|
||||||
|
c1 := ControllerImage{
|
||||||
|
Digest: controllerDigest,
|
||||||
|
Registry: INGRESS_REGISTRY,
|
||||||
|
Name: "ingress-nginx/controller",
|
||||||
|
Tag: fmt.Sprintf("v%s", newReleaseNotes.Version),
|
||||||
|
}
|
||||||
|
|
||||||
|
c2 := ControllerImage{
|
||||||
|
Digest: controllerChrootDigest,
|
||||||
|
Registry: INGRESS_REGISTRY,
|
||||||
|
Name: "ingress-nginx/controller-chroot",
|
||||||
|
Tag: fmt.Sprintf("v%s", newReleaseNotes.Version),
|
||||||
|
}
|
||||||
|
|
||||||
|
newReleaseNotes.ControllerImages = append(newReleaseNotes.ControllerImages, c1)
|
||||||
|
newReleaseNotes.ControllerImages = append(newReleaseNotes.ControllerImages, c2)
|
||||||
|
Debug("New Release Controller Images %s %s", newReleaseNotes.ControllerImages[0].Digest, newReleaseNotes.ControllerImages[1].Digest)
|
||||||
|
|
||||||
|
if DEBUG {
|
||||||
|
newReleaseNotes.printRelease()
|
||||||
|
}
|
||||||
|
|
||||||
|
//write it all out to the changelog file
|
||||||
|
newReleaseNotes.template()
|
||||||
|
|
||||||
|
return &newReleaseNotes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getCommitUpdates(newVersion string) ([]string, []string, []string) {
|
||||||
|
|
||||||
|
commits := commitsBetweenTags()
|
||||||
|
|
||||||
|
//dependency_updates
|
||||||
|
//all_updates
|
||||||
|
var allUpdates []string
|
||||||
|
var depUpdates []string
|
||||||
|
var helmUpdates []string
|
||||||
|
prRegex := regexp.MustCompile("\\(#\\d+\\)")
|
||||||
|
depBot := regexp.MustCompile("^(\\w){1,10} Bump ")
|
||||||
|
helmRegex := regexp.MustCompile("helm|chart")
|
||||||
|
for i, s := range commits {
|
||||||
|
//matches on PR
|
||||||
|
if prRegex.Match([]byte(s)) {
|
||||||
|
//matches a dependant bot update
|
||||||
|
if depBot.Match([]byte(s)) { //
|
||||||
|
Debug("#%v DEPENDABOT %v", i, s)
|
||||||
|
u := strings.SplitN(s, " ", 2)
|
||||||
|
depUpdates = append(depUpdates, u[1])
|
||||||
|
} else { // add it to the all updates slice
|
||||||
|
Debug("#%v ALL UPDATES %v", i, s)
|
||||||
|
u := strings.SplitN(s, " ", 2)
|
||||||
|
allUpdates = append(allUpdates, u[1])
|
||||||
|
|
||||||
|
//helm chart updates
|
||||||
|
if helmRegex.Match([]byte(s)) {
|
||||||
|
u := strings.SplitN(s, " ", 2)
|
||||||
|
helmUpdates = append(helmUpdates, u[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
helmUpdates = append(helmUpdates, fmt.Sprintf("Update Ingress-Nginx version %s", newVersion))
|
||||||
|
return allUpdates, depUpdates, helmUpdates
|
||||||
|
}
|
Loading…
Reference in a new issue