Skip to content

Year in Review 2025 #48

Year in Review 2025

Year in Review 2025 #48

Workflow file for this run

name: Build and Deploy
on:
push:
branches:
- main
concurrency:
group: deploy-production
cancel-in-progress: true
jobs:
deploy_backend:
name: Deploy Backend
runs-on: ubuntu-latest
permissions:
contents: read
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_REGION: ${{ vars.AWS_REGION }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
GENERATED_IMAGES_BUCKET: ${{ vars.GENERATED_IMAGES_BUCKET }}
IMAGE_GEN_PREFIX: ${{ vars.IMAGE_GEN_PREFIX }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
OPENAI_IMAGE_MODEL: ${{ vars.OPENAI_IMAGE_MODEL }}
RAILWAY_PROJECT_ID: ${{ vars.RAILWAY_PROJECT_ID }}
RAILWAY_ENVIRONMENT_NAME: ${{ vars.RAILWAY_ENVIRONMENT_NAME }}
RAILWAY_RUNTIME_HOST: "0.0.0.0"
RAILWAY_RUNTIME_PORT: "8080"
RAILWAY_SERVICE_NAME: ${{ vars.RAILWAY_SERVICE_NAME }}
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
steps:
- uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: "22"
- name: Validate Railway configuration
run: |
set -euo pipefail
: "${AWS_ACCESS_KEY_ID:?AWS_ACCESS_KEY_ID is required}"
: "${AWS_REGION:?AWS_REGION is required}"
: "${AWS_SECRET_ACCESS_KEY:?AWS_SECRET_ACCESS_KEY is required}"
: "${GENERATED_IMAGES_BUCKET:?GENERATED_IMAGES_BUCKET is required}"
: "${IMAGE_GEN_PREFIX:?IMAGE_GEN_PREFIX is required}"
: "${OPENAI_API_KEY:?OPENAI_API_KEY is required}"
: "${OPENAI_IMAGE_MODEL:?OPENAI_IMAGE_MODEL is required}"
: "${RAILWAY_PROJECT_ID:?RAILWAY_PROJECT_ID is required}"
: "${RAILWAY_ENVIRONMENT_NAME:?RAILWAY_ENVIRONMENT_NAME is required}"
: "${RAILWAY_SERVICE_NAME:?RAILWAY_SERVICE_NAME is required}"
: "${RAILWAY_TOKEN:?RAILWAY_TOKEN is required}"
- name: Sync Railway backend variables
run: ./Scripts/sync-railway-backend-variables.sh
- name: Deploy backend to Railway
run: |
set -euo pipefail
npx -y @railway/cli up Backend \
--ci \
--path-as-root \
--project "${RAILWAY_PROJECT_ID}" \
--environment "${RAILWAY_ENVIRONMENT_NAME}" \
--service "${RAILWAY_SERVICE_NAME}" \
--message "GitHub Actions ${GITHUB_SHA}"
deploy_site:
name: Deploy Site
runs-on: macos-latest
needs: deploy_backend
env:
AWS_REGION: ${{ vars.AWS_REGION }}
BYTESIZED_CAFE_API_URL: ${{ vars.BYTESIZED_CAFE_API_URL }}
steps:
- uses: actions/checkout@v6
- name: Set up just
uses: extractions/setup-just@v4
- name: Validate site API URL
run: |
set -euo pipefail
: "${AWS_REGION:?AWS_REGION is required}"
: "${BYTESIZED_CAFE_API_URL:?BYTESIZED_CAFE_API_URL is required}"
- name: Set up Swift
uses: swift-actions/setup-swift@v3
with:
swift-version: "6.2.3"
- name: Set up SwiftWasm
id: swiftwasm
uses: swiftwasm/setup-swiftwasm@v2.1
with:
tag: swift-6.2.3-RELEASE
target: wasm32-unknown-wasip1
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v6
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
- name: Install Binaryen
run: brew install binaryen
- name: Build SwiftWASM app
env:
SWIFT_WASM_SDK_ID: ${{ steps.swiftwasm.outputs.swift-sdk-id }}
run: just wasm
- name: Build site
run: just site-release
- name: Deploy site
env:
AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
run: just site-deploy
- name: Invalidate CloudFront cache
uses: chetan/invalidate-cloudfront-action@v2
env:
DISTRIBUTION: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }}
PATHS: '/ /index.html /page/* /posts/* /feed.rss /bytesized-cafe-app/* /css/* /images/* /fonts/*'
AWS_REGION: 'us-east-1'
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}