Skip to content
Merged
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
139 changes: 139 additions & 0 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
name: integration-tests

permissions:
contents: read

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

jobs:
integration-test:
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

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: Download RIE
run: |
mkdir -p .scratch
RIE_NAME="${{ matrix.arch.rie }}"
curl -sSL "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/${RIE_NAME}" -o ".scratch/${RIE_NAME}"
chmod +x ".scratch/${RIE_NAME}"
echo "RIE_NAME=${RIE_NAME}" >> "$GITHUB_ENV"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit. Have you considered caching the RIE?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes! but on a follow-up PR a want to add a trigger based on time: every workday. So it will run those workflow on a regular basis, if a new RIE is released, it will be picked up (and potentially fail the test, and our internal alarm will trigger). OK for you?

- name: Build Docker image
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit. Have you considered caching docker layers. Maybe it could help a little bit.

What is the running time for these tests?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4min21: https://github.com/aws/aws-lambda-ruby-runtime-interface-client/actions/runs/24561650222
so let's keep it as is @darklight3it and we can revisit if it's too long?

run: |
DOCKERFILE="test/integration/docker/Dockerfile.echo.${{ matrix.distro_config.distro }}"
TMPFILE=".scratch/Dockerfile.tmp"
cp "$DOCKERFILE" "$TMPFILE"
echo "COPY .scratch/${{ env.RIE_NAME }} /usr/bin/${{ env.RIE_NAME }}" >> "$TMPFILE"
docker build . \
-f "$TMPFILE" \
-t ric-test \
--build-arg RUNTIME_VERSION=${{ matrix.distro_config.runtime_version }} \
--build-arg DISTRO_VERSION=${{ matrix.distro_config.distro_version }}

- name: Run integration test
run: |
TEST_NAME="ric-integ-test"
docker network create "${TEST_NAME}-net"

# Start the Lambda function container with RIE
docker run \
--detach \
--name "${TEST_NAME}-app" \
--network "${TEST_NAME}-net" \
--entrypoint="" \
ric-test \
sh -c "/usr/bin/${{ env.RIE_NAME }} ${{ matrix.distro_config.executable }} app.App::Handler.process"

# Wait for RIE to be ready
sleep 2

# Invoke the function
docker run \
--name "${TEST_NAME}-tester" \
--env "TARGET=${TEST_NAME}-app" \
--network "${TEST_NAME}-net" \
--entrypoint="" \
ric-test \
sh -c 'curl -sS -X POST "http://${TARGET}:8080/2015-03-31/functions/function/invocations" -d "{}" --max-time 10'

# Assert response
ACTUAL="$(docker logs --tail 1 "${TEST_NAME}-tester" | xargs)"
EXPECTED="success"
echo "Response: ${ACTUAL}"
if [ "$ACTUAL" != "$EXPECTED" ]; then
echo "FAIL: ${{ matrix.distro_config.distro }}-${{ matrix.distro_config.distro_version }}:${{ matrix.distro_config.runtime_version }} — expected '${EXPECTED}', got '${ACTUAL}'"
exit 1
fi
echo "PASS"

- name: Dump container logs
if: always()
run: |
TEST_NAME="ric-integ-test"
echo "=== App container logs ==="
docker logs "${TEST_NAME}-app" 2>&1 || true
echo "=== Tester container logs ==="
docker logs "${TEST_NAME}-tester" 2>&1 || true

- name: Cleanup
if: always()
run: |
TEST_NAME="ric-integ-test"
docker rm -f "${TEST_NAME}-app" "${TEST_NAME}-tester" 2>/dev/null || true
docker network rm "${TEST_NAME}-net" 2>/dev/null || true
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ Gemfile.lock
# containerized test runner clone
.test-runner/

.vscode/
.vscode/
.scratch
24 changes: 11 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,19 @@ target:
init:
bundle install

.PHONY: setup-codebuild-agent
setup-codebuild-agent:
docker build -t codebuild-agent - < test/integration/codebuild-local/Dockerfile.agent

.PHONY: test-smoke
test-smoke: setup-codebuild-agent
CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.1.yml alpine 3.16 3.1

.PHONY: test-unit
test-unit:
ruby test/run_tests.rb unit

.PHONY: test-integ
test-integ: setup-codebuild-agent
CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_all.sh test/integration/codebuild
test-integ:
@echo "Integration tests run via GitHub Actions (see .github/workflows/integration-tests.yml)"
@echo "To run a single combo locally:"
@echo " make test-integ-local DISTRO=alpine DISTRO_VERSION=3.19 RUNTIME_VERSION=3.3"

.PHONY: test-integ-local
test-integ-local:
test/integration/run-local.sh $(DISTRO) $(DISTRO_VERSION) $(RUNTIME_VERSION)

.PHONY: build
build:
Expand Down Expand Up @@ -62,7 +60,7 @@ test-dockerized:
/suites/*.json

.PHONY: pr
pr: init test-unit test-smoke
pr: init test-unit

define HELP_MESSAGE

Expand All @@ -73,9 +71,9 @@ TARGETS
build Builds the package.
clean Cleans the working directory by removing built artifacts.
init Initialize and install the dependencies and dev-dependencies for this project.
test-integ Run Integration tests.
test-integ Show instructions for running integration tests.
test-integ-local Run a single integration test locally (requires DISTRO, DISTRO_VERSION, RUNTIME_VERSION).
test-unit Run Unit Tests.
test-smoke Run Sanity/Smoke tests.
test-dockerized Run dockerized tests locally (requires RUBY_VERSION=X.X).
run-local-ric Run local RIC changes with Runtime Interface Emulator.
pr Perform all checks before submitting a Pull Request.
Expand Down
5 changes: 0 additions & 5 deletions test/integration/codebuild-local/Dockerfile.agent

This file was deleted.

Loading
Loading