2017-02-16 10:49:58 -08:00
Param (
2017-05-16 12:13:49 +02:00
[ parameter ( Mandatory = $false ) ] [ string ] $registry ,
[ parameter ( Mandatory = $false ) ] [ string ] $dockerUser ,
[ parameter ( Mandatory = $false ) ] [ string ] $dockerPassword ,
[ parameter ( Mandatory = $false ) ] [ string ] $execPath ,
2017-06-16 17:40:27 +02:00
[ parameter ( Mandatory = $false ) ] [ string ] $kubeconfigPath ,
2017-06-16 20:44:11 +02:00
[ parameter ( Mandatory = $true ) ] [ string ] $configFile ,
2017-06-19 19:01:00 +02:00
[ parameter ( Mandatory = $false ) ] [ string ] $imageTag ,
2017-06-20 16:47:42 +02:00
[ parameter ( Mandatory = $false ) ] [ string ] $externalDns ,
[ parameter ( Mandatory = $false ) ] [ bool ] $deployCI = $false ,
2017-06-30 16:16:00 +02:00
[ parameter ( Mandatory = $false ) ] [ bool ] $buildImages = $true ,
[ parameter ( Mandatory = $false ) ] [ bool ] $buildBits = $false ,
[ parameter ( Mandatory = $false ) ] [ bool ] $deployInfrastructure = $true ,
[ parameter ( Mandatory = $false ) ] [ string ] $dockerOrg = " eshop "
2017-02-16 10:49:58 -08:00
)
2017-05-16 12:13:49 +02:00
function ExecKube($cmd ) {
if ( $deployCI ) {
$kubeconfig = $kubeconfigPath + 'config' ;
$exp = $execPath + 'kubectl ' + $cmd + ' --kubeconfig=' + $kubeconfig
Invoke-Expression $exp
}
else {
$exp = $execPath + 'kubectl ' + $cmd
Invoke-Expression $exp
2017-02-16 10:49:58 -08:00
}
}
2017-06-20 16:47:42 +02:00
# Initialization
$debugMode = $PSCmdlet . MyInvocation . BoundParameters [ " Debug " ] . IsPresent
$useDockerHub = [ string ] :: IsNullOrEmpty ( $registry )
2017-06-16 17:40:27 +02:00
2017-06-20 16:47:42 +02:00
# Check required commands (only if not in CI environment)
2017-05-16 12:13:49 +02:00
if ( -not $deployCI ) {
$requiredCommands = ( " docker " , " docker-compose " , " kubectl " )
foreach ( $command in $requiredCommands ) {
if ( ( Get-Command $command -ErrorAction SilentlyContinue ) -eq $null ) {
Write-Host " $command must be on path " -ForegroundColor Red
exit
}
}
2017-02-16 10:49:58 -08:00
}
2017-06-20 16:47:42 +02:00
else {
2017-06-30 16:16:00 +02:00
$buildBits = false ;
2017-06-20 16:47:42 +02:00
$buildImages = false ; # Never build images through CI, as they previously built
}
# Get tag to use from current branch if no tag is passed
if ( [ string ] :: IsNullOrEmpty ( $imageTag ) ) {
$imageTag = $ ( git rev-parse - -abbrev -ref HEAD )
}
Write-Host " Docker image Tag: $imageTag " -ForegroundColor Yellow
# building and publishing docker images if needed
2017-06-30 16:16:00 +02:00
if ( $buildBits ) {
2017-06-20 16:47:42 +02:00
Write-Host " Building and publishing eShopOnContainers... " -ForegroundColor Yellow
dotnet publish -c Release -o obj / Docker / publish . . / eShopOnContainers-ServicesAndWebApps . sln
2017-06-30 16:16:00 +02:00
}
if ( $buildImages ) {
2017-06-20 16:47:42 +02:00
Write-Host " Building Docker images tagged with ' $imageTag ' " -ForegroundColor Yellow
$env:TAG = $imageTag
docker-compose -p . . -f . . / docker-compose . yml build
2017-06-30 16:16:00 +02:00
Write-Host " Pushing images to $registry / $dockerOrg ... " -ForegroundColor Yellow
2017-07-18 18:24:57 +02:00
$services = ( " basket.api " , " catalog.api " , " identity.api " , " ordering.api " , " marketing.api " , " payment.api " , " locations.api " , " webmvc " , " webspa " , " webstatus " , " graceperiodmanager " )
2017-06-30 16:16:00 +02:00
2017-06-20 16:47:42 +02:00
foreach ( $service in $services ) {
2017-06-30 16:16:00 +02:00
$imageFqdn = if ( $useDockerHub ) { " $dockerOrg / ${service} " } else { " $registry / $dockerOrg / ${service} " }
docker tag eshop / $ { service } : $imageTag $ { imageFqdn } : $imageTag
docker push $ { imageFqdn } : $imageTag
2017-06-20 16:47:42 +02:00
}
}
2017-02-16 10:49:58 -08:00
2017-06-30 16:16:00 +02:00
# if we have login/pwd add the secret to k8s
if ( -not [ string ] :: IsNullOrEmpty ( $dockerUser ) ) {
$registryFDQN = if ( -not $useDockerHub ) { $registry } else { " index.docker.io/v1/ " }
Write-Host " Logging in to $registryFDQN as user $dockerUser " -ForegroundColor Yellow
if ( $useDockerHub ) {
docker login -u $dockerUser -p $dockerPassword
}
else {
docker login -u $dockerUser -p $dockerPassword $registryFDQN
}
2017-05-16 12:13:49 +02:00
if ( -not $LastExitCode -eq 0 ) {
Write-Host " Login failed " -ForegroundColor Red
exit
}
# create registry key secret
ExecKube -cmd ' create secret docker-registry registry-key `
2017-06-30 16:16:00 +02:00
- -docker -server = $registryFDQN `
2017-02-16 10:49:58 -08:00
- -docker -username = $dockerUser `
- -docker -password = $dockerPassword `
2017-05-16 12:13:49 +02:00
- -docker -email = not @used . com '
}
2017-02-16 10:49:58 -08:00
2017-05-16 12:13:49 +02:00
# Removing previous services & deployments
Write-Host " Removing existing services & deployments.. " -ForegroundColor Yellow
2017-05-25 09:24:37 +02:00
ExecKube -cmd 'delete deployments --all'
ExecKube -cmd 'delete services --all'
2017-05-16 12:13:49 +02:00
ExecKube -cmd 'delete configmap config-files'
ExecKube -cmd 'delete configmap urls'
2017-06-16 17:40:27 +02:00
ExecKube -cmd 'delete configmap externalcfg'
2017-02-16 10:49:58 -08:00
2017-05-16 12:13:49 +02:00
# start sql, rabbitmq, frontend deploymentsExecKube -cmd 'delete configmap config-files'
ExecKube -cmd 'create configmap config-files --from-file=nginx-conf=nginx.conf'
ExecKube -cmd 'label configmap config-files app=eshop'
2017-06-16 20:44:11 +02:00
if ( $deployInfrastructure ) {
Write-Host 'Deploying infrastructure deployments (databases, redis, ...)' -ForegroundColor Yellow
ExecKube -cmd 'create -f sql-data.yaml -f basket-data.yaml -f keystore-data.yaml -f rabbitmq.yaml -f nosql-data.yaml'
}
Write-Host 'Deploying code deployments (databases, redis, ...)' -ForegroundColor Yellow
2017-06-16 17:40:27 +02:00
ExecKube -cmd 'create -f services.yaml -f frontend.yaml'
2017-02-16 10:49:58 -08:00
2017-06-20 16:47:42 +02:00
if ( [ string ] :: IsNullOrEmpty ( $externalDns ) ) {
Write-Host " Waiting for frontend's external ip... " -ForegroundColor Yellow
while ( $true ) {
$frontendUrl = & ExecKube -cmd 'get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"'
if ( [ bool ] ( $frontendUrl -as [ ipaddress ] ) ) {
break
}
Start-Sleep -s 15
}
$externalDns = $frontendUrl
2017-02-16 10:49:58 -08:00
}
2017-06-20 16:47:42 +02:00
Write-Host " Using $externalDns as the external DNS/IP of the k8s cluster "
2017-02-16 10:49:58 -08:00
2017-05-16 12:13:49 +02:00
ExecKube -cmd ' create configmap urls `
2017-05-24 17:32:39 +02:00
- -from -literal = BasketUrl = http : / / basket `
- -from -literal = BasketHealthCheckUrl = http : / / basket / hc `
2017-07-05 16:01:14 +02:00
- -from -literal = CatalogUrl = http : / / $ ( $externalDns ) / catalog-api `
2017-05-24 17:32:39 +02:00
- -from -literal = CatalogHealthCheckUrl = http : / / catalog / hc `
2017-07-31 14:14:52 +02:00
- -from -literal = PicBaseUrl = http : / / $ ( $externalDns ) / catalog-api / api / v1 / catalog / items / [ 0 ] / pic / `
- -from -literal = Marketing_PicBaseUrl = http : / / $ ( $externalDns ) / marketing-api / api / v1 / campaigns / [ 0 ] / pic / `
2017-07-05 16:01:14 +02:00
- -from -literal = IdentityUrl = http : / / $ ( $externalDns ) / identity `
2017-05-24 17:32:39 +02:00
- -from -literal = IdentityHealthCheckUrl = http : / / identity / hc `
- -from -literal = OrderingUrl = http : / / ordering `
- -from -literal = OrderingHealthCheckUrl = http : / / ordering / hc `
2017-07-05 16:01:14 +02:00
- -from -literal = MvcClientExternalUrl = http : / / $ ( $externalDns ) / webmvc `
2017-05-24 17:32:39 +02:00
- -from -literal = WebMvcHealthCheckUrl = http : / / webmvc / hc `
- -from -literal = MvcClientOrderingUrl = http : / / ordering `
- -from -literal = MvcClientCatalogUrl = http : / / catalog `
- -from -literal = MvcClientBasketUrl = http : / / basket `
2017-07-31 14:14:52 +02:00
- -from -literal = MvcClientMarketingUrl = http : / / marketing `
2017-07-14 15:12:30 +02:00
- -from -literal = MarketingHealthCheckUrl = http : / / marketing / hc `
2017-07-31 14:14:52 +02:00
- -from -literal = WebSpaHealthCheckUrl = http : / / webspa / hc `
- -from -literal = SpaClientMarketingExternalUrl = http : / / $ ( $externalDns ) / marketing-api `
2017-06-20 16:47:42 +02:00
- -from -literal = SpaClientOrderingExternalUrl = http : / / $ ( $externalDns ) / ordering-api `
- -from -literal = SpaClientCatalogExternalUrl = http : / / $ ( $externalDns ) / catalog-api `
- -from -literal = SpaClientBasketExternalUrl = http : / / $ ( $externalDns ) / basket-api `
- -from -literal = SpaClientIdentityExternalUrl = http : / / $ ( $externalDns ) / identity `
2017-07-18 18:24:57 +02:00
- -from -literal = LocationsHealthCheckUrl = http : / / locations / hc `
2017-07-31 14:14:52 +02:00
- -from -literal = SpaClientExternalUrl = http : / / $ ( $externalDns ) `
- -from -literal = LocationApiClient = http : / / $ ( $externalDns ) / locations-api `
- -from -literal = MarketingApiClient = http : / / $ ( $externalDns ) / marketing-api `
- -from -literal = BasketApiClient = http : / / $ ( $externalDns ) / basket-api `
- -from -literal = OrderingApiClient = http : / / $ ( $externalDns ) / ordering-api '
2017-05-16 12:13:49 +02:00
ExecKube -cmd 'label configmap urls app=eshop'
2017-02-16 10:49:58 -08:00
2017-07-03 16:57:10 +02:00
Write-Host " Deploying configuration from $configFile " -ForegroundColor Yellow
ExecKube -cmd " create -f $configFile "
2017-06-16 17:40:27 +02:00
2017-05-24 17:32:39 +02:00
Write-Host " Creating deployments... " -ForegroundColor Yellow
2017-05-16 12:13:49 +02:00
ExecKube -cmd 'create -f deployments.yaml'
2017-06-20 16:47:42 +02:00
# update deployments with the correct image (with tag and/or registry)
$registryPath = " "
if ( -not [ string ] :: IsNullOrEmpty ( $registry ) ) {
$registryPath = " $registry / "
2017-05-16 12:13:49 +02:00
}
2017-06-30 16:16:00 +02:00
Write-Host " Update Image containers to use prefix ' $registry $dockerOrg ' and tag ' $imageTag ' " -ForegroundColor Yellow
ExecKube -cmd 'set image deployments/basket basket=${registryPath}${dockerOrg}/basket.api:$imageTag'
ExecKube -cmd 'set image deployments/catalog catalog=${registryPath}${dockerOrg}/catalog.api:$imageTag'
ExecKube -cmd 'set image deployments/identity identity=${registryPath}${dockerOrg}/identity.api:$imageTag'
ExecKube -cmd 'set image deployments/ordering ordering=${registryPath}${dockerOrg}/ordering.api:$imageTag'
ExecKube -cmd 'set image deployments/marketing marketing=${registryPath}${dockerOrg}/marketing.api:$imageTag'
ExecKube -cmd 'set image deployments/locations locations=${registryPath}${dockerOrg}/locations.api:$imageTag'
ExecKube -cmd 'set image deployments/payment payment=${registryPath}${dockerOrg}/payment.api:$imageTag'
ExecKube -cmd 'set image deployments/webmvc webmvc=${registryPath}${dockerOrg}/webmvc:$imageTag'
ExecKube -cmd 'set image deployments/webstatus webstatus=${registryPath}${dockerOrg}/webstatus:$imageTag'
ExecKube -cmd 'set image deployments/webspa webspa=${registryPath}${dockerOrg}/webspa:$imageTag'
2017-07-18 18:24:57 +02:00
ExecKube -cmd 'set image deployments/graceperiodmanager graceperiodmanager=${registryPath}${dockerOrg}/graceperiodmanager:$imageTag'
2017-06-20 16:47:42 +02:00
2017-05-25 09:24:37 +02:00
Write-Host " Execute rollout... " -ForegroundColor Yellow
ExecKube -cmd 'rollout resume deployments/basket'
ExecKube -cmd 'rollout resume deployments/catalog'
ExecKube -cmd 'rollout resume deployments/identity'
ExecKube -cmd 'rollout resume deployments/ordering'
2017-06-19 19:01:00 +02:00
ExecKube -cmd 'rollout resume deployments/marketing'
ExecKube -cmd 'rollout resume deployments/locations'
ExecKube -cmd 'rollout resume deployments/payment'
2017-05-25 09:24:37 +02:00
ExecKube -cmd 'rollout resume deployments/webmvc'
ExecKube -cmd 'rollout resume deployments/webstatus'
ExecKube -cmd 'rollout resume deployments/webspa'
2017-07-18 18:24:57 +02:00
ExecKube -cmd 'rollout resume deployments/graceperiodmanager'
2017-02-16 10:49:58 -08:00
2017-07-05 16:01:14 +02:00
Write-Host " WebSPA is exposed at http:// $externalDns , WebMVC at http:// $externalDns /webmvc, WebStatus at http:// $externalDns /webstatus " -ForegroundColor Yellow
2017-05-19 17:19:29 -07:00