Skip to content

Update api_sqs_lambda_stack.py -- fix the python 3.7 unsupported problem #1840

Update api_sqs_lambda_stack.py -- fix the python 3.7 unsupported problem

Update api_sqs_lambda_stack.py -- fix the python 3.7 unsupported problem #1840

# Name of the workflow
name: Build Pull Request
# Trigger the workflow on pull requests
on:
pull_request:
# Only run the workflow when non-Markdown files are changed
paths:
- '**'
jobs:
build:
# Run the job on the latest Ubuntu runner
runs-on: ubuntu-latest
# Define a matrix strategy to run the job for multiple languages
strategy:
matrix:
language: ['csharp', 'go', 'python', 'java', 'typescript']
steps:
# Checkout the code from the repository
- name: Checkout code
uses: actions/checkout@v4
# Set up the required environment for the specified language
- name: Setup Language
uses: ./.github/actions/setup-language
with:
language: ${{ matrix.language }}
# Get the list of changed files, excluding Markdown files and deleted files
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@115870536a85eaf050e369291c7895748ff12aea
with:
files: ${{ matrix.language }}/**
files_ignore: '**/*.md'
files_separator: ' '
# Build the changed files for the specified language
- name: Build changed files
if: steps.changed-files.outputs.any_changed == 'true'
run: |
# Create a temporary directory for build logs
mkdir -p /tmp/build_logs
yarn global add eslint@latest
yarn global add aws-cdk@latest
# Function to build a single file
build_file() {
echo "Build File $1"
local file="$1"
local log_file="/tmp/build_logs/$(basename "$file" | sed 's/\//_/g').log"
IFS="/" read -ra path_parts <<< "$file"
language=${path_parts[0]}
# Skip files that don't belong to the current language
if [[ $language != ${{ matrix.language }} ]]; then
return 0
fi
echo "Build Path $file"
# Run the build script for the current language, passing the project directory and extra path
echo "::group::Building $file"
# Run the build command and capture output to both the log file and stdout
../scripts/build-${language}.sh "$file" 2>&1 | tee "$log_file"
local exit_code=${PIPESTATUS[0]}
if [ $exit_code -eq 0 ]; then
echo "✅ Build succeeded for $file"
# Clean up node_modules and cdk.out for this project immediately after successful build
echo "Cleaning up build artifacts for $(dirname "$file")"
local project_dir=$(dirname "$file")
# Remove node_modules directory if it exists
if [ -d "$project_dir/node_modules" ]; then
echo "Removing $project_dir/node_modules"
rm -rf "$project_dir/node_modules"
fi
# Remove cdk.out directory if it exists
if [ -d "$project_dir/cdk.out" ]; then
echo "Removing $project_dir/cdk.out"
rm -rf "$project_dir/cdk.out"
fi
else
echo "❌ Build failed for $file with exit code $exit_code"
echo "::error::Build failed for $file with exit code $exit_code"
fi
echo "::endgroup::"
return $exit_code
}
# Export the build_file function for use in parallel
export -f build_file
# Create an array to store directories to be built
apps_to_build=()
# Use only added and modified files, ignoring deleted files
files=(${{ steps.changed-files.outputs.added_files }} ${{ steps.changed-files.outputs.modified_files }})
# Check the directories of each changed file for cdk.json
for file in "${files[@]}"; do
IFS="/" read -ra path_parts <<< "$file"
language=${path_parts[0]}
dir="${path_parts[0]}/${path_parts[1]}"
# Skip files that don't belong to the current language
if [[ $language != ${{ matrix.language }} ]]; then
continue
fi
apps_to_build+=("$(find "$dir" -name 'cdk.json')")
done
# Remove duplicate projects
apps_to_build=($(printf "%s\n" "${apps_to_build[@]}" | sort -u))
# Print the projects to be built
echo "projects to build:"
for dir in "${apps_to_build[@]}"; do
echo "- $dir"
done
# Change to language directory
cd ./${{ matrix.language }}
# Run the build_file function for each project to be built
echo "::group::Build Output"
echo "Starting builds for all projects..."
# Track failed builds
failed_builds=()
# Process each project one by one with clear grouping
for app in "${apps_to_build[@]}"; do
echo "::group::Building $app"
# Run the build directly
set +e # Don't exit on error
../scripts/build-${language}.sh "$app"
build_exit=$?
set -e # Re-enable exit on error
if [ $build_exit -ne 0 ]; then
echo "❌ BUILD FAILED: $app (exit code $build_exit)"
failed_builds+=("$app")
else
echo "✅ BUILD SUCCEEDED: $app"
fi
echo "::endgroup::"
done
echo "::endgroup::"
# Print summary outside of any group
echo ""
echo "====== BUILD SUMMARY ======"
if [ ${#failed_builds[@]} -gt 0 ]; then
echo "❌ FAILED BUILDS:"
for failed in "${failed_builds[@]}"; do
echo " - $failed"
done
parallel_exit=1
else
echo "✅ ALL BUILDS SUCCEEDED"
parallel_exit=0
fi
echo "=========================="
echo ""
# If parallel failed, make sure the workflow fails too
if [ $parallel_exit -ne 0 ]; then
echo "::error::One or more builds failed. See build summary above for details."
exit $parallel_exit
else
echo "✅ All builds completed successfully!"
fi