diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml new file mode 100644 index 0000000..2486764 --- /dev/null +++ b/.github/workflows/docker-build.yml @@ -0,0 +1,88 @@ +name: Docker Build and Push + +on: + workflow_dispatch: + inputs: + environment: + description: 'Environment to deploy to' + required: true + type: choice + options: + - dev + - staging + tag_suffix: + description: 'Additional tag suffix (optional)' + required: false + type: string + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate tags + id: tags + run: | + BRANCH_NAME=${GITHUB_REF#refs/heads/} + SHA_SHORT=$(git rev-parse --short HEAD) + TIMESTAMP=$(date +%Y%m%d-%H%M%S) + + # Convert repository name to lowercase + REPO_NAME=$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]') + + # Set default environment for push events + if [ "${{ github.event_name }}" = "push" ]; then + ENV="dev" + else + ENV="${{ github.event.inputs.environment }}" + fi + + # Base tags + TAGS="${{ env.REGISTRY }}/${REPO_NAME}:${ENV}" + TAGS="${TAGS},${{ env.REGISTRY }}/${REPO_NAME}:${BRANCH_NAME}-${SHA_SHORT}" + TAGS="${TAGS},${{ env.REGISTRY }}/${REPO_NAME}:${BRANCH_NAME}-${ENV}" + + # Add timestamp tag + TAGS="${TAGS},${{ env.REGISTRY }}/${REPO_NAME}:${BRANCH_NAME}-${TIMESTAMP}" + + # Add custom suffix if provided (only for workflow_dispatch) + if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ -n "${{ github.event.inputs.tag_suffix }}" ]; then + TAGS="${TAGS},${{ env.REGISTRY }}/${REPO_NAME}:${ENV}-${{ github.event.inputs.tag_suffix }}" + fi + + echo "tags=${TAGS}" >> $GITHUB_OUTPUT + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: Dockerfile.prod + push: true + tags: ${{ steps.tags.outputs.tags }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Print image tags + run: | + echo "Image was built and pushed with the following tags:" + echo "${{ steps.tags.outputs.tags }}" | tr ',' '\n' diff --git a/src/app/case-studies/la-county/page.tsx b/src/app/case-studies/la-county/page.tsx new file mode 100644 index 0000000..9ee7927 --- /dev/null +++ b/src/app/case-studies/la-county/page.tsx @@ -0,0 +1,143 @@ +import Link from 'next/link'; +import { Link as ExternalLink } from '@trussworks/react-uswds'; +import './styles.scss'; + +export default function LaCountyCaseStudy() { + return ( +
+
+
+ + Return to all case studies + +

+ Creating a modular, cloud-based data processing pipeline for LA + County +

+
+
+
+

The challenge

+

+ + Timely access to electronic case reporting (eCR) data is + critical for public health departments to respond swiftly to + disease outbreaks, especially during a public health emergency. + Unfortunately, not all public health jurisdictions can + effectively manage the flow of incoming eCR data. Due to + technical limitations with their existing disease surveillance + system, the Los Angeles County (LAC) Department of Public Health + faced challenges with processing eCR files, leaving this rich + source of data largely inaccessible to their disease + surveillance teams. + + + Because LAC's disease surveillance system couldn't process eCR + data fields, they set up a separate, patchwork data workflow to + collect eCR data. As a result, epidemiologists at LAC also had + to spend a considerable amount of time manually cleaning data + after it was processed. To efficiently monitor and respond to + disease outbreaks, LAC also needed to improve the overall + quality of the data processed through its disease surveillance + infrastructure. Better, more reliable data reduces the need for + manual cleaning and makes downstream analysis and case + investigation less onerous for epidemiologists and other public + health staff. + +

+
+
+
+
+

The solution

+
+

+ The DIBBs team worked with LAC to develop and deploy a + cutting-edge, modular data pipeline to automatically process and + enrich COVID-19 eCR files. This open-source, cloud-based + pipeline — composed of modular software components called Data + Integration Building Blocks (DIBBs) — helps significantly reduce + the time it takes for LAC's disease surveillance teams to + receive and act upon public health data, while also improving + the quality of that data. Over the course of the year-long + pilot, the DIBBs team: +

+
    +
  • + Conducted discovery research to understand eCR workflows, + identify product support needs, and assess the value of + processing eCR data for LAC disease surveillance teams +
  • +
  • + Engaged LAC staff in an iterative software development process + with weekly agile ceremonies and regular product + demonstrations to continuously refine the pipeline +
  • +
  • + Performed user acceptance testing with LAC staff to identify + and mitigate barriers to adoption for the DIBBs pipeline +
  • +
  • + Compared the performance of LAC's pre-pilot data processing to + data processing after the DIBBs pipeline was deployed to test + record linkage performance and measure data quality +
  • +
  • + Evaluated how the DIBBs pipeline affected the experience of + case investigators that monitor and report on Hepatitis A to + assess the pipeline's public health impact +
  • +
  • + Developed a compendium of resources (i.e., Handoff Hub) for + LAC staff to use post-pilot that enables them to independently + operate and customize the pipeline +
  • +
+

+ We are currently commencing pilots with jurisdictions to test + the eCR Viewer in a production data environment and further + validate the tool's downstream public health impact. Our aim is + to scale the eCR Viewer with a wide range of jurisdictions to + turn eCR into the go-to data source for case ascertainment and + investigation. +

+
+
+
+
+
+

The results

+

+ Following the pilot, LAC now has access to an automated feed of + analysis-ready eCR data with fields relevant to downstream disease + teams. LAC plans to continue to leverage the DIBBs pipeline + infrastructure to give additional disease teams access to + processed eCR data, including the HIV and STD prevention team and + the Community Outbreak Team (focused on viral respiratory + pathogens). Through the LAC pilot, the DIBBs team gained insights + on how to use and adapt our modular, open-source solutions to + solve data challenges for multiple disease surveillance systems + across public health jurisdictions. +

+
+
+
+
+

Read more about our work

+ + Findings from a Los Angeles County Pilot - Executive Brief + +
+
+
+
+ ); +} diff --git a/src/app/case-studies/la-county/styles.scss b/src/app/case-studies/la-county/styles.scss new file mode 100644 index 0000000..5f6c798 --- /dev/null +++ b/src/app/case-studies/la-county/styles.scss @@ -0,0 +1,5 @@ +.list__full-width { + li { + min-width: 100%; + } +} diff --git a/src/app/case-studies/page.tsx b/src/app/case-studies/page.tsx index 84f9ec2..556e1bb 100644 --- a/src/app/case-studies/page.tsx +++ b/src/app/case-studies/page.tsx @@ -29,7 +29,7 @@ export default function CaseStudies() { data pipeline that automatically processes and enriches eCR data to improve downstream data analysis and case investigation. - + View case study diff --git a/src/app/custom-styles.css b/src/app/custom-styles.css index 99a36b4..af1b416 100644 --- a/src/app/custom-styles.css +++ b/src/app/custom-styles.css @@ -80,6 +80,7 @@ body { } h1 { + color: #224a58; font-size: 2.5rem; font-weight: 700; line-height: 3.125rem;