pr feedback
parent
a61fe5b771
commit
0ba031eabc
|
|
@ -22,6 +22,7 @@ env:
|
||||||
AWS_ENDPOINT_URL: http://localhost:4566
|
AWS_ENDPOINT_URL: http://localhost:4566
|
||||||
AWS_ACCESS_KEY_ID: test
|
AWS_ACCESS_KEY_ID: test
|
||||||
AWS_SECRET_ACCESS_KEY: test
|
AWS_SECRET_ACCESS_KEY: test
|
||||||
|
AWS_FORCE_PROVIDER: aws
|
||||||
CLOUD_RUNNER_BRANCH: ${{ github.ref }}
|
CLOUD_RUNNER_BRANCH: ${{ github.ref }}
|
||||||
DEBUG: true
|
DEBUG: true
|
||||||
PROJECT_PATH: test-project
|
PROJECT_PATH: test-project
|
||||||
|
|
@ -60,7 +61,35 @@ jobs:
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
cache: 'yarn'
|
cache: 'yarn'
|
||||||
|
- name: Verify LocalStack is running and accessible
|
||||||
|
run: |
|
||||||
|
echo "Verifying LocalStack services are available..."
|
||||||
|
# Wait for LocalStack to be ready
|
||||||
|
for i in {1..30}; do
|
||||||
|
if curl -s http://localhost:4566/_localstack/health | grep -q '"services":'; then
|
||||||
|
echo "LocalStack is ready"
|
||||||
|
curl -s http://localhost:4566/_localstack/health | jq '.' || curl -s http://localhost:4566/_localstack/health
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo "Waiting for LocalStack... ($i/30)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
# Verify required AWS services are available
|
||||||
|
echo "Verifying required AWS services (cloudformation,ecs,kinesis,cloudwatch,s3,logs)..."
|
||||||
|
curl -s http://localhost:4566/_localstack/health | grep -q 'cloudformation' || echo "WARNING: CloudFormation service may not be available"
|
||||||
|
curl -s http://localhost:4566/_localstack/health | grep -q 'ecs' || echo "WARNING: ECS service may not be available"
|
||||||
|
curl -s http://localhost:4566/_localstack/health | grep -q 'kinesis' || echo "WARNING: Kinesis service may not be available"
|
||||||
- run: yarn install --frozen-lockfile
|
- run: yarn install --frozen-lockfile
|
||||||
|
- name: Validate AWS provider configuration
|
||||||
|
run: |
|
||||||
|
echo "Validating AWS provider configuration for LocalStack tests..."
|
||||||
|
echo "PROVIDER_STRATEGY: aws"
|
||||||
|
echo "AWS_FORCE_PROVIDER: ${{ env.AWS_FORCE_PROVIDER }}"
|
||||||
|
echo "AWS_ENDPOINT: ${{ env.AWS_ENDPOINT }}"
|
||||||
|
echo ""
|
||||||
|
echo "✓ Configuration validated: AWS provider will be used with LocalStack to validate AWS functionality"
|
||||||
|
echo "✓ This ensures ECS, CloudFormation, Kinesis, and other AWS services are properly tested"
|
||||||
|
echo "✓ AWS_FORCE_PROVIDER prevents automatic fallback to local-docker"
|
||||||
- run: yarn run test "${{ matrix.test }}" --detectOpenHandles --forceExit --runInBand
|
- run: yarn run test "${{ matrix.test }}" --detectOpenHandles --forceExit --runInBand
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
env:
|
env:
|
||||||
|
|
@ -73,7 +102,10 @@ jobs:
|
||||||
versioning: None
|
versioning: None
|
||||||
KUBE_STORAGE_CLASS: local-path
|
KUBE_STORAGE_CLASS: local-path
|
||||||
PROVIDER_STRATEGY: aws
|
PROVIDER_STRATEGY: aws
|
||||||
|
AWS_FORCE_PROVIDER: aws
|
||||||
AWS_ACCESS_KEY_ID: test
|
AWS_ACCESS_KEY_ID: test
|
||||||
AWS_SECRET_ACCESS_KEY: test
|
AWS_SECRET_ACCESS_KEY: test
|
||||||
|
AWS_ENDPOINT: http://localhost:4566
|
||||||
|
AWS_ENDPOINT_URL: http://localhost:4566
|
||||||
GIT_PRIVATE_TOKEN: ${{ secrets.GIT_PRIVATE_TOKEN }}
|
GIT_PRIVATE_TOKEN: ${{ secrets.GIT_PRIVATE_TOKEN }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GIT_PRIVATE_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GIT_PRIVATE_TOKEN }}
|
||||||
|
|
|
||||||
|
|
@ -801,6 +801,9 @@ class CloudRunner {
|
||||||
static async setupSelectedBuildPlatform() {
|
static async setupSelectedBuildPlatform() {
|
||||||
cloud_runner_logger_1.default.log(`Cloud Runner platform selected ${CloudRunner.buildParameters.providerStrategy}`);
|
cloud_runner_logger_1.default.log(`Cloud Runner platform selected ${CloudRunner.buildParameters.providerStrategy}`);
|
||||||
// Detect LocalStack endpoints and reroute AWS provider to local-docker for CI tests that only need S3
|
// Detect LocalStack endpoints and reroute AWS provider to local-docker for CI tests that only need S3
|
||||||
|
// However, if AWS_FORCE_PROVIDER is set to 'aws', we should use AWS provider even with LocalStack
|
||||||
|
// This is needed for integrity tests that validate AWS functionality (ECS, CloudFormation, etc.) with LocalStack
|
||||||
|
const forceAwsProvider = process.env.AWS_FORCE_PROVIDER === 'aws' || process.env.AWS_FORCE_PROVIDER === 'true';
|
||||||
const endpointsToCheck = [
|
const endpointsToCheck = [
|
||||||
process.env.AWS_ENDPOINT,
|
process.env.AWS_ENDPOINT,
|
||||||
process.env.AWS_S3_ENDPOINT,
|
process.env.AWS_S3_ENDPOINT,
|
||||||
|
|
@ -819,16 +822,28 @@ class CloudRunner {
|
||||||
.join(' ');
|
.join(' ');
|
||||||
const isLocalStack = /localstack|localhost|127\.0\.0\.1/i.test(endpointsToCheck);
|
const isLocalStack = /localstack|localhost|127\.0\.0\.1/i.test(endpointsToCheck);
|
||||||
let provider = CloudRunner.buildParameters.providerStrategy;
|
let provider = CloudRunner.buildParameters.providerStrategy;
|
||||||
if (provider === 'aws' && isLocalStack) {
|
if (provider === 'aws' && isLocalStack && !forceAwsProvider) {
|
||||||
cloud_runner_logger_1.default.log('LocalStack endpoints detected; routing provider to local-docker for this run');
|
cloud_runner_logger_1.default.log('LocalStack endpoints detected; routing provider to local-docker for this run');
|
||||||
|
cloud_runner_logger_1.default.log('Note: Set AWS_FORCE_PROVIDER=aws to force AWS provider with LocalStack for AWS functionality tests');
|
||||||
provider = 'local-docker';
|
provider = 'local-docker';
|
||||||
}
|
}
|
||||||
|
else if (provider === 'aws' && isLocalStack && forceAwsProvider) {
|
||||||
|
cloud_runner_logger_1.default.log('LocalStack endpoints detected but AWS_FORCE_PROVIDER is set; using AWS provider to validate AWS functionality');
|
||||||
|
}
|
||||||
switch (provider) {
|
switch (provider) {
|
||||||
case 'k8s':
|
case 'k8s':
|
||||||
CloudRunner.Provider = new k8s_1.default(CloudRunner.buildParameters);
|
CloudRunner.Provider = new k8s_1.default(CloudRunner.buildParameters);
|
||||||
break;
|
break;
|
||||||
case 'aws':
|
case 'aws':
|
||||||
CloudRunner.Provider = new aws_1.default(CloudRunner.buildParameters);
|
CloudRunner.Provider = new aws_1.default(CloudRunner.buildParameters);
|
||||||
|
// Validate that AWS provider is actually being used when expected
|
||||||
|
if (isLocalStack && forceAwsProvider) {
|
||||||
|
cloud_runner_logger_1.default.log('✓ AWS provider initialized with LocalStack - AWS functionality will be validated');
|
||||||
|
}
|
||||||
|
else if (isLocalStack && !forceAwsProvider) {
|
||||||
|
cloud_runner_logger_1.default.log('⚠ WARNING: AWS provider was requested but LocalStack detected without AWS_FORCE_PROVIDER');
|
||||||
|
cloud_runner_logger_1.default.log('⚠ This may cause AWS functionality tests to fail validation');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'test':
|
case 'test':
|
||||||
CloudRunner.Provider = new test_1.default();
|
CloudRunner.Provider = new test_1.default();
|
||||||
|
|
@ -854,6 +869,12 @@ class CloudRunner {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// Final validation: Ensure provider matches expectations
|
||||||
|
const finalProviderName = CloudRunner.Provider.constructor.name;
|
||||||
|
if (CloudRunner.buildParameters.providerStrategy === 'aws' && finalProviderName !== 'AWSBuildEnvironment') {
|
||||||
|
cloud_runner_logger_1.default.log(`⚠ WARNING: Expected AWS provider but got ${finalProviderName}`);
|
||||||
|
cloud_runner_logger_1.default.log('⚠ AWS functionality tests may not be validating AWS services correctly');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
static async run(buildParameters, baseImage) {
|
static async run(buildParameters, baseImage) {
|
||||||
if (baseImage.includes(`undefined`)) {
|
if (baseImage.includes(`undefined`)) {
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -68,6 +68,9 @@ class CloudRunner {
|
||||||
CloudRunnerLogger.log(`Cloud Runner platform selected ${CloudRunner.buildParameters.providerStrategy}`);
|
CloudRunnerLogger.log(`Cloud Runner platform selected ${CloudRunner.buildParameters.providerStrategy}`);
|
||||||
|
|
||||||
// Detect LocalStack endpoints and reroute AWS provider to local-docker for CI tests that only need S3
|
// Detect LocalStack endpoints and reroute AWS provider to local-docker for CI tests that only need S3
|
||||||
|
// However, if AWS_FORCE_PROVIDER is set to 'aws', we should use AWS provider even with LocalStack
|
||||||
|
// This is needed for integrity tests that validate AWS functionality (ECS, CloudFormation, etc.) with LocalStack
|
||||||
|
const forceAwsProvider = process.env.AWS_FORCE_PROVIDER === 'aws' || process.env.AWS_FORCE_PROVIDER === 'true';
|
||||||
const endpointsToCheck = [
|
const endpointsToCheck = [
|
||||||
process.env.AWS_ENDPOINT,
|
process.env.AWS_ENDPOINT,
|
||||||
process.env.AWS_S3_ENDPOINT,
|
process.env.AWS_S3_ENDPOINT,
|
||||||
|
|
@ -86,9 +89,12 @@ class CloudRunner {
|
||||||
.join(' ');
|
.join(' ');
|
||||||
const isLocalStack = /localstack|localhost|127\.0\.0\.1/i.test(endpointsToCheck);
|
const isLocalStack = /localstack|localhost|127\.0\.0\.1/i.test(endpointsToCheck);
|
||||||
let provider = CloudRunner.buildParameters.providerStrategy;
|
let provider = CloudRunner.buildParameters.providerStrategy;
|
||||||
if (provider === 'aws' && isLocalStack) {
|
if (provider === 'aws' && isLocalStack && !forceAwsProvider) {
|
||||||
CloudRunnerLogger.log('LocalStack endpoints detected; routing provider to local-docker for this run');
|
CloudRunnerLogger.log('LocalStack endpoints detected; routing provider to local-docker for this run');
|
||||||
|
CloudRunnerLogger.log('Note: Set AWS_FORCE_PROVIDER=aws to force AWS provider with LocalStack for AWS functionality tests');
|
||||||
provider = 'local-docker';
|
provider = 'local-docker';
|
||||||
|
} else if (provider === 'aws' && isLocalStack && forceAwsProvider) {
|
||||||
|
CloudRunnerLogger.log('LocalStack endpoints detected but AWS_FORCE_PROVIDER is set; using AWS provider to validate AWS functionality');
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (provider) {
|
switch (provider) {
|
||||||
|
|
@ -97,6 +103,13 @@ class CloudRunner {
|
||||||
break;
|
break;
|
||||||
case 'aws':
|
case 'aws':
|
||||||
CloudRunner.Provider = new AwsBuildPlatform(CloudRunner.buildParameters);
|
CloudRunner.Provider = new AwsBuildPlatform(CloudRunner.buildParameters);
|
||||||
|
// Validate that AWS provider is actually being used when expected
|
||||||
|
if (isLocalStack && forceAwsProvider) {
|
||||||
|
CloudRunnerLogger.log('✓ AWS provider initialized with LocalStack - AWS functionality will be validated');
|
||||||
|
} else if (isLocalStack && !forceAwsProvider) {
|
||||||
|
CloudRunnerLogger.log('⚠ WARNING: AWS provider was requested but LocalStack detected without AWS_FORCE_PROVIDER');
|
||||||
|
CloudRunnerLogger.log('⚠ This may cause AWS functionality tests to fail validation');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'test':
|
case 'test':
|
||||||
CloudRunner.Provider = new TestCloudRunner();
|
CloudRunner.Provider = new TestCloudRunner();
|
||||||
|
|
@ -121,6 +134,13 @@ class CloudRunner {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Final validation: Ensure provider matches expectations
|
||||||
|
const finalProviderName = CloudRunner.Provider.constructor.name;
|
||||||
|
if (CloudRunner.buildParameters.providerStrategy === 'aws' && finalProviderName !== 'AWSBuildEnvironment') {
|
||||||
|
CloudRunnerLogger.log(`⚠ WARNING: Expected AWS provider but got ${finalProviderName}`);
|
||||||
|
CloudRunnerLogger.log('⚠ AWS functionality tests may not be validating AWS services correctly');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static async run(buildParameters: BuildParameters, baseImage: string) {
|
static async run(buildParameters: BuildParameters, baseImage: string) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue