Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/test-matrix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{
"arch": [
{
"runner": "ubuntu-latest",
"rie": "aws-lambda-rie",
"label": "x64"
},
{
"runner": "ubuntu-24.04-arm",
"rie": "aws-lambda-rie-arm64",
"label": "arm64"
}
],
"distro_config": [
{
"distro": "al2023",
"distro_version": "al2023",
"runtime_version": "3.4",
"executable": "/usr/local/bin/aws_lambda_ric"
},
{
"distro": "al2023",
"distro_version": "al2023",
"runtime_version": "3.3",
"executable": "/usr/local/bin/aws_lambda_ric"
},
{
"distro": "alpine",
"distro_version": "3.23",
"runtime_version": "3.4",
"executable": "/usr/local/bundle/bin/aws_lambda_ric"
},
{
"distro": "alpine",
"distro_version": "3.23",
"runtime_version": "3.3",
"executable": "/usr/local/bundle/bin/aws_lambda_ric"
},
{
"distro": "debian",
"distro_version": "bookworm",
"runtime_version": "3.4",
"executable": "/usr/local/bundle/bin/aws_lambda_ric"
},
{
"distro": "debian",
"distro_version": "bookworm",
"runtime_version": "3.3",
"executable": "/usr/local/bundle/bin/aws_lambda_ric"
},
{
"distro": "ubuntu",
"distro_version": "24.04",
"runtime_version": "3.4",
"executable": "/usr/local/bin/aws_lambda_ric"
},
{
"distro": "ubuntu",
"distro_version": "24.04",
"runtime_version": "3.3",
"executable": "/usr/local/bin/aws_lambda_ric"
}
]
}
107 changes: 107 additions & 0 deletions .github/workflows/bootstrap-alarms.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: bootstrap-alarms

permissions:
id-token: write
contents: read

on:
pull_request:
branches: [ '*' ]
workflow_dispatch:

env:
AWS_REGION: ${{ secrets.AWS_REGION }}
ALARM_NAMESPACE: GitHubActions

jobs:
bootstrap:
runs-on: ubuntu-latest
env:
COMPOSITE_ALARM_NAME: GitHubActions-${{ github.repository_owner }}-${{ github.event.repository.name }}-integration-tests-aggregate

steps:
- name: Debug OIDC token
run: |
echo "GitHub ref: ${{ github.ref }}"
echo "GitHub event name: ${{ github.event_name }}"

- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Configure AWS credentials (OIDC)
uses: aws-actions/configure-aws-credentials@ec61189d14ec14c8efccab744f656cffd0e33f37 # v6.1.0
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Create individual metric alarms
run: |
set -euo pipefail

MATRIX_FILE=".github/test-matrix.json"
ALARM_NAMES=()

# Iterate over every arch × distro_config permutation from the shared matrix
for row in $(jq -c '
.arch[] as $a |
.distro_config[] as $d |
{ arch: $a.label, distro: $d.distro, distro_version: $d.distro_version, runtime_version: $d.runtime_version }
' "$MATRIX_FILE"); do

arch=$(echo "$row" | jq -r '.arch')
distro=$(echo "$row" | jq -r '.distro')
distro_version=$(echo "$row" | jq -r '.distro_version')
runtime_version=$(echo "$row" | jq -r '.runtime_version')

ALARM_NAME="GitHubActions-ruby-ric-${distro}-${distro_version}-ruby${runtime_version}-${arch}"

echo "Creating alarm: ${ALARM_NAME}"

# Alarms if no success metric is received within 3 days
# Uses 1-day periods with 3 evaluation periods for faster state transitions
aws cloudwatch put-metric-alarm \
--alarm-name "${ALARM_NAME}" \
--alarm-description "Integration test: ${distro} ${distro_version} / ruby ${runtime_version} (${arch})" \
--namespace "${ALARM_NAMESPACE}" \
--metric-name "TestResult" \
--dimensions "Name=Distro,Value=${distro}" "Name=DistroVersion,Value=${distro_version}" "Name=RuntimeVersion,Value=${runtime_version}" "Name=Arch,Value=${arch}" \
--statistic Sum \
--period 86400 \
--evaluation-periods 3 \
--datapoints-to-alarm 3 \
--threshold 1 \
--comparison-operator LessThanThreshold \
--treat-missing-data breaching

ALARM_NAMES+=("${ALARM_NAME}")
done

# Save alarm names for the composite alarm step
printf '%s\n' "${ALARM_NAMES[@]}" > /tmp/alarm_names.txt

- name: Create composite aggregate alarm
run: |
set -euo pipefail

mapfile -t ALARM_NAMES < /tmp/alarm_names.txt

# Build the composite alarm rule: triggers if ANY sub-alarm is in ALARM or INSUFFICIENT_DATA
RULE=""
for name in "${ALARM_NAMES[@]}"; do
if [ -n "$RULE" ]; then
RULE="${RULE} OR "
fi
RULE="${RULE}(ALARM(\"${name}\") OR INSUFFICIENT_DATA(\"${name}\"))"
done

echo "Composite alarm rule:"
echo "${RULE}"

aws cloudwatch put-composite-alarm \
--alarm-name "${COMPOSITE_ALARM_NAME}" \
--alarm-description "Aggregate alarm for all Ruby RIC integration test permutations" \
--alarm-rule "${RULE}" \
--actions-enabled \
--alarm-actions "${{ secrets.AWS_ALARM_TARGET_ARN }}" \
--insufficient-data-actions "${{ secrets.AWS_ALARM_TARGET_ARN }}"

echo "Composite alarm '${COMPOSITE_ALARM_NAME}' created successfully."
79 changes: 34 additions & 45 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
@@ -1,71 +1,50 @@
name: integration-tests

permissions:
id-token: write
contents: read

on:
push:
branches: [main]
pull_request:
branches: ['*']
schedule:
- cron: '0 8 * * 1-5' # Every workday (Mon-Fri) at 08:00 UTC
workflow_dispatch:

jobs:
load-matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set.outputs.matrix }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Load test matrix
id: set
run: |
MATRIX=$(jq -c '.' .github/test-matrix.json)
echo "matrix=${MATRIX}" >> "$GITHUB_OUTPUT"

integration-test:
needs: load-matrix
runs-on: ${{ matrix.arch.runner }}
strategy:
fail-fast: false
matrix:
arch:
- runner: ubuntu-latest
rie: aws-lambda-rie
label: x64
- runner: ubuntu-24.04-arm
rie: aws-lambda-rie-arm64
label: arm64
distro_config:
# al2023
- distro: al2023
distro_version: "al2023"
runtime_version: "3.4"
executable: /usr/local/bin/aws_lambda_ric
- distro: al2023
distro_version: "al2023"
runtime_version: "3.3"
executable: /usr/local/bin/aws_lambda_ric
# Alpine
- distro: alpine
distro_version: "3.23"
runtime_version: "3.4"
executable: /usr/local/bundle/bin/aws_lambda_ric
- distro: alpine
distro_version: "3.23"
runtime_version: "3.3"
executable: /usr/local/bundle/bin/aws_lambda_ric
# Debian
- distro: debian
distro_version: bookworm
runtime_version: "3.4"
executable: /usr/local/bundle/bin/aws_lambda_ric
- distro: debian
distro_version: bookworm
runtime_version: "3.3"
executable: /usr/local/bundle/bin/aws_lambda_ric
# Ubuntu
- distro: ubuntu
distro_version: "24.04"
runtime_version: "3.4"
executable: /usr/local/bin/aws_lambda_ric
- distro: ubuntu
distro_version: "24.04"
runtime_version: "3.3"
executable: /usr/local/bin/aws_lambda_ric
matrix: ${{ fromJson(needs.load-matrix.outputs.matrix) }}

name: "${{ matrix.distro_config.distro }} ${{ matrix.distro_config.distro_version }} / ruby ${{ matrix.distro_config.runtime_version }} (${{ matrix.arch.label }})"

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Configure AWS credentials (OIDC)
uses: aws-actions/configure-aws-credentials@ec61189d14ec14c8efccab744f656cffd0e33f37 # v6.1.0
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Download RIE
run: |
mkdir -p .scratch
Expand Down Expand Up @@ -131,6 +110,16 @@ jobs:
echo "=== Tester container logs ==="
docker logs "${TEST_NAME}-tester" 2>&1 || true

- name: Publish success metric
if: success()
run: |
aws cloudwatch put-metric-data \
--namespace "GitHubActions" \
--metric-name "TestResult" \
--dimensions "Distro=${{ matrix.distro_config.distro }},DistroVersion=${{ matrix.distro_config.distro_version }},RuntimeVersion=${{ matrix.distro_config.runtime_version }},Arch=${{ matrix.arch.label }}" \
--value 1 \
--unit Count

- name: Cleanup
if: always()
run: |
Expand Down
Loading