Eliminate spurious blue/green cutovers
This commit is contained in:
parent
b05a388e41
commit
f8589c7ed4
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/sha1"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
@ -58,6 +59,7 @@ type supervisor struct {
|
||||||
blueProxyHandler http.Handler
|
blueProxyHandler http.Handler
|
||||||
greenProxyHandler http.Handler
|
greenProxyHandler http.Handler
|
||||||
isGreen bool // blue-green deployment
|
isGreen bool // blue-green deployment
|
||||||
|
deployConfigHash string
|
||||||
|
|
||||||
awsAccountNumber string
|
awsAccountNumber string
|
||||||
awsRegion string
|
awsRegion string
|
||||||
|
@ -314,6 +316,18 @@ func (sv *supervisor) reload() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
h := sha1.New()
|
||||||
|
h.Write([]byte(deployCfgStr))
|
||||||
|
deployCfgHash := fmt.Sprintf("%x", h.Sum(nil))
|
||||||
|
if deployCfgHash == sv.deployConfigHash {
|
||||||
|
sv.status(fmt.Sprintf("config hash remains at %s", deployCfgHash))
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
sv.status(fmt.Sprintf(
|
||||||
|
"config hash updated %s => %s",
|
||||||
|
sv.deployConfigHash, deployCfgHash,
|
||||||
|
))
|
||||||
|
}
|
||||||
var port int
|
var port int
|
||||||
var name string
|
var name string
|
||||||
var oldName string
|
var oldName string
|
||||||
|
@ -334,6 +348,7 @@ func (sv *supervisor) reload() error {
|
||||||
"-p", fmt.Sprintf("127.0.0.1:%d:6119", port),
|
"-p", fmt.Sprintf("127.0.0.1:%d:6119", port),
|
||||||
"-e", "RIJU_DEPLOY_CONFIG",
|
"-e", "RIJU_DEPLOY_CONFIG",
|
||||||
"-e", "ANALYTICS=1",
|
"-e", "ANALYTICS=1",
|
||||||
|
"--label", fmt.Sprintf("riju.deploy-config-hash=%s", deployCfgHash),
|
||||||
"--name", name,
|
"--name", name,
|
||||||
fmt.Sprintf("riju:%s", deployCfg.AppImageTag),
|
fmt.Sprintf("riju:%s", deployCfg.AppImageTag),
|
||||||
)
|
)
|
||||||
|
@ -366,6 +381,8 @@ func (sv *supervisor) reload() error {
|
||||||
if err := dockerRm.Run(); err != nil {
|
if err := dockerRm.Run(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
sv.status("saving updated config hash")
|
||||||
|
sv.deployConfigHash = deployCfgHash
|
||||||
sv.status("reload complete")
|
sv.status("reload complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -439,15 +456,19 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var isGreen bool
|
var isGreen bool
|
||||||
|
var isRunning bool
|
||||||
if blueRunningSince == nil && greenRunningSince == nil {
|
if blueRunningSince == nil && greenRunningSince == nil {
|
||||||
log.Println("did not detect any existing containers")
|
log.Println("did not detect any existing containers")
|
||||||
isGreen = false
|
isGreen = false
|
||||||
|
isRunning = true
|
||||||
} else if blueRunningSince != nil && greenRunningSince == nil {
|
} else if blueRunningSince != nil && greenRunningSince == nil {
|
||||||
log.Println("detected existing blue container")
|
log.Println("detected existing blue container")
|
||||||
isGreen = false
|
isGreen = false
|
||||||
|
isRunning = true
|
||||||
} else if greenRunningSince != nil && blueRunningSince == nil {
|
} else if greenRunningSince != nil && blueRunningSince == nil {
|
||||||
log.Println("detected existing green container")
|
log.Println("detected existing green container")
|
||||||
isGreen = true
|
isGreen = true
|
||||||
|
isRunning = true
|
||||||
} else {
|
} else {
|
||||||
log.Println("detected existing blue and green containers")
|
log.Println("detected existing blue and green containers")
|
||||||
isGreen = greenRunningSince.Before(*blueRunningSince)
|
isGreen = greenRunningSince.Before(*blueRunningSince)
|
||||||
|
@ -467,6 +488,32 @@ func main() {
|
||||||
if err := dockerRm.Run(); err != nil {
|
if err := dockerRm.Run(); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
isRunning = true
|
||||||
|
}
|
||||||
|
|
||||||
|
deployCfgHash := "none"
|
||||||
|
|
||||||
|
if isRunning {
|
||||||
|
var name string
|
||||||
|
if isGreen {
|
||||||
|
name = greenName
|
||||||
|
} else {
|
||||||
|
name = blueName
|
||||||
|
}
|
||||||
|
dockerInspect := exec.Command(
|
||||||
|
"docker", "inspect", name,
|
||||||
|
`{{ index .Config.Labels "riju.deploy-config-hash" }}`,
|
||||||
|
)
|
||||||
|
dockerInspect.Stderr = os.Stderr
|
||||||
|
out, err := dockerInspect.Output()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
if hash := strings.TrimSpace(string(out)); hash != "" {
|
||||||
|
deployCfgHash = hash
|
||||||
|
} else {
|
||||||
|
deployCfgHash = "unknown"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sv := &supervisor{
|
sv := &supervisor{
|
||||||
|
@ -474,6 +521,7 @@ func main() {
|
||||||
blueProxyHandler: httputil.NewSingleHostReverseProxy(blueUrl),
|
blueProxyHandler: httputil.NewSingleHostReverseProxy(blueUrl),
|
||||||
greenProxyHandler: httputil.NewSingleHostReverseProxy(greenUrl),
|
greenProxyHandler: httputil.NewSingleHostReverseProxy(greenUrl),
|
||||||
isGreen: isGreen,
|
isGreen: isGreen,
|
||||||
|
deployConfigHash: deployCfgHash,
|
||||||
s3: s3.NewFromConfig(awsCfg),
|
s3: s3.NewFromConfig(awsCfg),
|
||||||
ecr: ecr.NewFromConfig(awsCfg),
|
ecr: ecr.NewFromConfig(awsCfg),
|
||||||
awsRegion: awsCfg.Region,
|
awsRegion: awsCfg.Region,
|
||||||
|
|
|
@ -33,10 +33,14 @@ data "aws_iam_policy_document" "deploy" {
|
||||||
actions = [
|
actions = [
|
||||||
"ecr:BatchGetImage",
|
"ecr:BatchGetImage",
|
||||||
"ecr:BatchCheckLayerAvailability",
|
"ecr:BatchCheckLayerAvailability",
|
||||||
|
"ecr:CompleteLayerUpload",
|
||||||
"ecr:DescribeImages",
|
"ecr:DescribeImages",
|
||||||
"ecr:DescribeRepositories",
|
"ecr:DescribeRepositories",
|
||||||
"ecr:GetDownloadUrlForLayer",
|
"ecr:GetDownloadUrlForLayer",
|
||||||
|
"ecr:InitiateLayerUpload",
|
||||||
"ecr:ListImages",
|
"ecr:ListImages",
|
||||||
|
"ecr:PutImage",
|
||||||
|
"ecr:UploadLayerPart",
|
||||||
]
|
]
|
||||||
|
|
||||||
resources = [
|
resources = [
|
||||||
|
|
Loading…
Reference in New Issue