Flask portfolio site for Rick Arko, positioned as an applied AI/ML builder and senior IC.
This repository now treats Bash as the only supported automation layer.
- use the top-level
Makefile - use Bash scripts from
deployment/bin/ - if you are on Windows, run the repo through WSL
- old PowerShell scripts live in
deployment/windows/legacy/and are deprecated
make install
make devThe local app runs on http://localhost:8080.
make test
make test-fast
make test-unit
make test-integration
make test-e2e
make test-regression
make doctor-aws
make deploy-check
make format
make lint
make docker-build
make docker-run
make ecr-setup
make domain-setup
make domain-statusRun make help to see the full target list.
The primary deployment target is AWS App Runner backed by ECR and Route 53.
GitHub Actions provides the end-to-end CI/CD path:
-
pull requests and pushes run the fast quality gate with
make check -
pushes to
mainand manualworkflow_dispatchrunmake verify -
successful release runs build the Docker image, push it to ECR, trigger App Runner deployment, and verify the public
/healthendpoint -
AWS authentication is handled through GitHub OIDC rather than long-lived IAM user keys
-
make deploy-checkgives you a local preflight before shipping: fast quality gate, AWS wiring checks, and a Docker build without pushing -
deployment runbook: deployment/DEPLOY.md
-
App Runner notes: deployment/AppRunner.md
-
custom domain notes: deployment/CustomDomain.md
The repo supports two deployment paths:
- Preferred: GitHub Actions CI/CD
- Emergency/manual: local terminal deploy from WSL
make deploy-check
git pushThen:
- open a pull request
- let GitHub Actions run
make check - merge to
main - let GitHub Actions run
make verify, publish the image to ECR, trigger App Runner, and validatehttps://rickarko.com/health
Use this when you intentionally need to ship from your local machine.
make deploy-check
make ecr-setup
aws apprunner start-deployment --service-arn "$APPRUNNER_SERVICE_ARN" --region us-east-1Then watch the deployment and verify the health contract:
watch -n 5 "aws apprunner list-operations --service-arn \"$APPRUNNER_SERVICE_ARN\" --region us-east-1 --query 'OperationSummaryList[0].[Status,Type]' --output table"
curl -i https://rickarko.com/healthSuccess means:
- App Runner operation status becomes
SUCCEEDED /healthreturnsapplication/json- response body is
{"status":"ok"}
- Re-trigger the same workflow:
gh run rerun 25203824177 --repo RickArko/RickArkoPortfolio - Trigger workflow_dispatch against any commit:
gh workflow run "Portfolio CI/CD" --ref main --repo RickArko/RickArkoPortfolio - Direct App Runner deploy (skip CI):
aws apprunner start-deployment --service-arn "$APPRUNNER_SERVICE_ARN" --region us-east-1
.
├── src/
│ ├── rickarko_portfolio/ Installable Flask package, app factory, SEO, config
│ ├── db/ JSON-backed site content
│ ├── templates/ Jinja templates
│ └── static/ CSS, JS, and images
├── tests/
│ ├── unit/ Pure helper and config tests
│ ├── integration/ App factory and wiring tests
│ ├── end_to_end/ HTTP-first rendered route tests
│ └── regression/ Deployment/runtime contract tests
├── deployment/bin/ Linux-first deployment scripts
├── deployment/windows/ Archived Windows legacy scripts
├── Dockerfile Container build
├── apprunner.yaml AWS App Runner config
└── Makefile Main local/deployment entrypoint
The repo uses pytest as the single test runner and treats "end to end" as HTTP-first validation of the real Flask application, not browser automation.
make test-fastcovers unit and integration paths for quick iterationmake test-e2eexercises public rendered pages and crawlability contractsmake test-regressionprotects WSGI, entrypoint, and deployment-sensitive behaviormake testruns the full suite with coverage enforcement on the Python package