деплой
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
AWS_ACCESS_KEY_ID=replace_with_access_key_id
|
||||||
|
AWS_SECRET_ACCESS_KEY=replace_with_secret_access_key
|
||||||
|
AWS_DEFAULT_REGION=ru-central1
|
||||||
|
AWS_BUCKET=warcraft-client
|
||||||
|
AWS_ENDPOINT=https://storage.yandexcloud.net
|
||||||
|
AWS_USE_PATH_STYLE_ENDPOINT=true
|
||||||
|
LAUNCHER_AUTH_KEY=replace_with_launcher_auth_key
|
||||||
@@ -49,3 +49,8 @@ app.*.map.json
|
|||||||
|
|
||||||
# Local launcher update signing material
|
# Local launcher update signing material
|
||||||
.moonwell_signing/
|
.moonwell_signing/
|
||||||
|
|
||||||
|
# Local production deployment credentials
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|||||||
@@ -112,6 +112,10 @@ Remove `-DryRun` only after reviewing the generated installer and AppCast.
|
|||||||
See `docs/production_deploy.md` for required environment variables, production
|
See `docs/production_deploy.md` for required environment variables, production
|
||||||
defaults, safety checks, and failure recovery.
|
defaults, safety checks, and failure recovery.
|
||||||
|
|
||||||
|
Local deploy credentials are read from the ignored root `.env`; use
|
||||||
|
`.env.example` as the safe template. Process and CI environment variables
|
||||||
|
override values from the file.
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
The UI lives in `lib/app`. Presentation-only design-system components live in
|
The UI lives in `lib/app`. Presentation-only design-system components live in
|
||||||
|
|||||||
@@ -41,10 +41,21 @@ Back up `.moonwell_signing\dsa_priv.pem` in the project secret store. Never
|
|||||||
commit it, upload it to Object Storage, or send it through chat. Losing this key
|
commit it, upload it to Object Storage, or send it through chat. Losing this key
|
||||||
prevents released launchers from accepting future updates.
|
prevents released launchers from accepting future updates.
|
||||||
|
|
||||||
## Required Environment
|
## Local `.env`
|
||||||
|
|
||||||
The script reads secrets and storage configuration only from environment
|
For local releases, copy `.env.example` to `.env` and fill in the real values.
|
||||||
variables:
|
The repository ignores `.env` and every `.env.*` variant except the safe
|
||||||
|
`.env.example` template.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Copy-Item .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
The deploy script loads `.env` automatically. Variables already present in the
|
||||||
|
current process or CI environment take precedence over the file. Use
|
||||||
|
`-EnvFile C:\secure\moonwell.env` to select a different local file.
|
||||||
|
|
||||||
|
The following values are supported:
|
||||||
|
|
||||||
| Variable | Required | Purpose |
|
| Variable | Required | Purpose |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
@@ -56,8 +67,8 @@ variables:
|
|||||||
| `AWS_BUCKET` | optional | Defaults to `warcraft-client` |
|
| `AWS_BUCKET` | optional | Defaults to `warcraft-client` |
|
||||||
| `AWS_USE_PATH_STYLE_ENDPOINT` | optional | Defaults to `true` |
|
| `AWS_USE_PATH_STYLE_ENDPOINT` | optional | Defaults to `true` |
|
||||||
|
|
||||||
Load secrets from the team secret manager into the current PowerShell process.
|
Production CI should load these values from the team secret manager instead of
|
||||||
Do not put real values in a tracked `.env` file or in the script.
|
creating `.env`. Never commit the real file or put its contents into logs.
|
||||||
|
|
||||||
## Prepare a Release
|
## Prepare a Release
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ Fails unless the X.Y.Z part of pubspec.yaml matches this value.
|
|||||||
.PARAMETER ReleaseNotes
|
.PARAMETER ReleaseNotes
|
||||||
Text written to the AppCast item description.
|
Text written to the AppCast item description.
|
||||||
|
|
||||||
|
.PARAMETER EnvFile
|
||||||
|
Local dotenv file used to fill environment variables that are not already set.
|
||||||
|
|
||||||
.PARAMETER DryRun
|
.PARAMETER DryRun
|
||||||
Builds, signs, and verifies local artifacts without changing production.
|
Builds, signs, and verifies local artifacts without changing production.
|
||||||
|
|
||||||
@@ -42,6 +45,7 @@ param(
|
|||||||
[string]$S3Endpoint,
|
[string]$S3Endpoint,
|
||||||
[string]$S3Bucket,
|
[string]$S3Bucket,
|
||||||
[string]$S3Key = 'moonwell_launcher_setup.exe',
|
[string]$S3Key = 'moonwell_launcher_setup.exe',
|
||||||
|
[string]$EnvFile = '.env',
|
||||||
[string]$PrivateKeyPath = '.moonwell_signing\dsa_priv.pem',
|
[string]$PrivateKeyPath = '.moonwell_signing\dsa_priv.pem',
|
||||||
[string]$PublicKeyPath = 'windows\runner\resources\dsa_pub.pem',
|
[string]$PublicKeyPath = 'windows\runner\resources\dsa_pub.pem',
|
||||||
[string]$FlutterCommand = 'flutter',
|
[string]$FlutterCommand = 'flutter',
|
||||||
@@ -101,6 +105,64 @@ function Get-FileSha256 {
|
|||||||
return (Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()
|
return (Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Import-DotEnv {
|
||||||
|
param([Parameter(Mandatory = $true)][string]$Path)
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$allowedNames = @(
|
||||||
|
'AWS_ACCESS_KEY_ID',
|
||||||
|
'AWS_SECRET_ACCESS_KEY',
|
||||||
|
'AWS_DEFAULT_REGION',
|
||||||
|
'AWS_BUCKET',
|
||||||
|
'AWS_ENDPOINT',
|
||||||
|
'AWS_USE_PATH_STYLE_ENDPOINT',
|
||||||
|
'LAUNCHER_AUTH_KEY'
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach ($line in Get-Content -LiteralPath $Path) {
|
||||||
|
$trimmed = $line.Trim()
|
||||||
|
if (
|
||||||
|
[string]::IsNullOrWhiteSpace($trimmed) -or
|
||||||
|
$trimmed.StartsWith('#')
|
||||||
|
) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
$separator = $trimmed.IndexOf('=')
|
||||||
|
if ($separator -le 0) {
|
||||||
|
throw "Invalid dotenv line in ${Path}: $line"
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $trimmed.Substring(0, $separator).Trim()
|
||||||
|
if ($allowedNames -notcontains $name) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $trimmed.Substring($separator + 1).Trim()
|
||||||
|
if (
|
||||||
|
$value.Length -ge 2 -and
|
||||||
|
(
|
||||||
|
($value.StartsWith('"') -and $value.EndsWith('"')) -or
|
||||||
|
($value.StartsWith("'") -and $value.EndsWith("'"))
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
$value = $value.Substring(1, $value.Length - 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
$existing = [Environment]::GetEnvironmentVariable($name)
|
||||||
|
if ([string]::IsNullOrWhiteSpace($existing)) {
|
||||||
|
[Environment]::SetEnvironmentVariable(
|
||||||
|
$name,
|
||||||
|
$value,
|
||||||
|
[EnvironmentVariableTarget]::Process
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Get-AppcastVersion {
|
function Get-AppcastVersion {
|
||||||
param([Parameter(Mandatory = $true)][string]$Path)
|
param([Parameter(Mandatory = $true)][string]$Path)
|
||||||
|
|
||||||
@@ -282,6 +344,14 @@ $previousLocation = Get-Location
|
|||||||
try {
|
try {
|
||||||
Set-Location $repositoryRoot
|
Set-Location $repositoryRoot
|
||||||
|
|
||||||
|
$resolvedEnvFile = if ([IO.Path]::IsPathRooted($EnvFile)) {
|
||||||
|
$EnvFile
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Join-Path $repositoryRoot $EnvFile
|
||||||
|
}
|
||||||
|
Import-DotEnv -Path $resolvedEnvFile
|
||||||
|
|
||||||
if ([string]::IsNullOrWhiteSpace($S3Endpoint)) {
|
if ([string]::IsNullOrWhiteSpace($S3Endpoint)) {
|
||||||
$S3Endpoint = $env:AWS_ENDPOINT
|
$S3Endpoint = $env:AWS_ENDPOINT
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user