You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hamilton.apache.org by sk...@apache.org on 2026/03/06 06:08:33 UTC
(hamilton) 14/39: Add Apache Software Foundation compliance to Docker infrastructure
This is an automated email from the ASF dual-hosted git repository.
skrawcz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hamilton.git
commit 6f3ca6de1c001e9b121b86f5a6f7d296562516c1
Author: Stefan Krawczyk <st...@cs.stanford.edu>
AuthorDate: Mon Feb 23 08:57:11 2026 -0800
Add Apache Software Foundation compliance to Docker infrastructure
This commit ensures Hamilton UI Docker images comply with ASF requirements:
1. Added Incubator Disclaimers to Dockerfiles
- All 4 Dockerfiles now include the required incubator disclaimer
- Placed after Apache license header as per ASF guidelines
- Affects: backend/Dockerfile.backend, backend/Dockerfile.backend-prod,
frontend/Dockerfile.frontend, frontend/Dockerfile.frontend-prod
2. Rewrote buildx_and_push.sh with Apache-Compliant Tagging
- Changed namespace from dagworks/* to apache/hamilton-*
- Implemented proper tagging strategy:
* Release: VERSION (can tag :latest with PMC approval)
* RC: VERSION-rcN (cannot use :latest)
* Snapshot: VERSION-SNAPSHOT (cannot use :latest)
* Nightly: VERSION-nightly-YYYYMMDD (cannot use :latest)
- Added command-line arguments: --version, --type, --rc-number, --tag-latest
- Added safety checks preventing :latest for non-releases
- Added PMC approval confirmation prompt
- Removed automatic PyPI version fetching
3. Created DOCKER_RELEASE.md Documentation
- Comprehensive guide for Apache-compliant Docker releases
- Covers dev.sh, run.sh, and buildx_and_push.sh workflows
- Documents tagging policy and multi-architecture builds
- Includes release checklist and PMC approval process
- Lists common issues and security considerations
These changes ensure compliance with ASF Docker distribution policies:
- https://www.apache.org/legal/release-policy.html
- https://incubator.apache.org/policy/incubation.html#releases
---
ui/BUILD.md | 19 ++
ui/DOCKER_RELEASE.md | 338 +++++++++++++++++++++++++++++++++++
ui/backend/Dockerfile.backend | 9 +
ui/backend/Dockerfile.backend-prod | 9 +
ui/buildx_and_push.sh | 244 ++++++++++++++++++++-----
ui/frontend/Dockerfile.frontend | 9 +
ui/frontend/Dockerfile.frontend-prod | 9 +
ui/start_mini_mode.sh | 17 ++
ui/test_tracking.py | 17 ++
ui/test_tracking_simple.py | 17 ++
10 files changed, 639 insertions(+), 49 deletions(-)
diff --git a/ui/BUILD.md b/ui/BUILD.md
index f70160fd..9c143317 100644
--- a/ui/BUILD.md
+++ b/ui/BUILD.md
@@ -1,3 +1,22 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
# Building the Hamilton UI
The Hamilton UI has two deployment modes, each with its own build process:
diff --git a/ui/DOCKER_RELEASE.md b/ui/DOCKER_RELEASE.md
new file mode 100644
index 00000000..9f6500eb
--- /dev/null
+++ b/ui/DOCKER_RELEASE.md
@@ -0,0 +1,338 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# Apache Hamilton UI - Docker Release Guide
+
+This document describes the Apache-compliant Docker build and release process for Hamilton UI.
+
+## Overview
+
+Hamilton UI provides three Docker deployment modes:
+
+1. **Development Mode** (`dev.sh`) - Hot-reload development with separate frontend/backend containers
+2. **Production Mode** (`run.sh`) - Production-ready with separate frontend/backend containers
+3. **Official Release** (`buildx_and_push.sh`) - Multi-architecture builds for Apache Docker Hub
+
+## Apache Software Foundation Requirements
+
+As an Apache Incubator project, Hamilton must follow ASF Docker distribution policies:
+
+### 1. Docker Hub Namespace
+
+All official Docker images MUST be published to:
+- ✅ `apache/hamilton-ui-frontend`
+- ✅ `apache/hamilton-ui-backend`
+- ❌ NOT `dagworks/*` or personal namespaces
+
+### 2. Incubator Disclaimer
+
+All Dockerfiles and Docker Hub overview pages MUST include:
+
+```
+Apache Hamilton is an effort undergoing incubation at The Apache Software
+Foundation (ASF), sponsored by the Apache Incubator. Incubation is required
+of all newly accepted projects until a further review indicates that the
+infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of
+the code, it does indicate that the project has yet to be fully endorsed by
+the ASF.
+```
+
+### 3. Tagging Policy
+
+The `:latest` tag can ONLY be used for PMC-approved releases:
+
+| Build Type | Tag Format | Can Use `:latest`? | Example |
+|------------|------------|-------------------|---------|
+| Release | `VERSION` | ✅ Yes (with PMC approval) | `0.0.17` |
+| Release Candidate | `VERSION-rcN` | ❌ No | `0.0.18-rc1` |
+| Snapshot | `VERSION-SNAPSHOT` | ❌ No | `0.0.18-SNAPSHOT` |
+| Nightly | `VERSION-nightly-YYYYMMDD` | ❌ No | `0.0.18-nightly-20260223` |
+
+### 4. License and Notice Files
+
+Docker images SHOULD include:
+- `LICENSE` - Apache License 2.0
+- `NOTICE` - Copyright and third-party notices
+- `DISCLAIMER` - Incubator disclaimer
+
+## Development Workflow
+
+### Local Development (`dev.sh`)
+
+For active development with hot-reload:
+
+```bash
+cd ui
+./dev.sh --build
+
+# Access at:
+# - Frontend: http://localhost:8242
+# - Backend API: http://localhost:8241
+# - PostgreSQL: localhost:5432
+```
+
+**Features:**
+- Hot-reload for both frontend and backend
+- Source code mounted as volumes
+- Development-optimized (not production-ready)
+- Single architecture (your host platform)
+
+### Local Production Testing (`run.sh`)
+
+To test production builds locally:
+
+```bash
+cd ui
+./run.sh --build
+
+# Access at:
+# - Frontend: http://localhost:8242
+# - Backend API: http://localhost:8241
+```
+
+**Features:**
+- Production-optimized builds
+- No hot-reload
+- Nginx serves frontend static files
+- Single architecture (your host platform)
+
+## Official Release Process
+
+### Prerequisites
+
+1. **Docker Buildx** installed and configured:
+ ```bash
+ docker buildx version
+ ```
+
+2. **Docker Hub credentials** with push access to `apache/hamilton-*`:
+ ```bash
+ docker login
+ ```
+
+3. **PMC approval** for releases (required before tagging `:latest`)
+
+### Building Release Candidates
+
+Release candidates are used for community voting before official releases:
+
+```bash
+cd ui
+./buildx_and_push.sh --version 0.0.18 --type rc --rc-number 1
+```
+
+This creates:
+- `apache/hamilton-ui-frontend:0.0.18-rc1`
+- `apache/hamilton-ui-backend:0.0.18-rc1`
+
+### Building Official Releases
+
+After PMC approval, build and tag the official release:
+
+```bash
+cd ui
+./buildx_and_push.sh --version 0.0.17 --type release --tag-latest
+```
+
+**Interactive Prompt:**
+```
+WARNING: You are about to tag this build as :latest
+This should ONLY be done for PMC-approved releases.
+
+Has this release been approved by the Apache Hamilton PMC? (yes/no):
+```
+
+Type `yes` to proceed. This creates:
+- `apache/hamilton-ui-frontend:0.0.17`
+- `apache/hamilton-ui-frontend:latest`
+- `apache/hamilton-ui-backend:0.0.17`
+- `apache/hamilton-ui-backend:latest`
+
+### Building Snapshots
+
+For development snapshots (not official releases):
+
+```bash
+cd ui
+./buildx_and_push.sh --version 0.0.18 --type snapshot
+```
+
+This creates:
+- `apache/hamilton-ui-frontend:0.0.18-SNAPSHOT`
+- `apache/hamilton-ui-backend:0.0.18-SNAPSHOT`
+
+### Building Nightly Builds
+
+For automated nightly builds:
+
+```bash
+cd ui
+./buildx_and_push.sh --version 0.0.18 --type nightly
+```
+
+This creates:
+- `apache/hamilton-ui-frontend:0.0.18-nightly-20260223`
+- `apache/hamilton-ui-backend:0.0.18-nightly-20260223`
+
+Date is automatically appended (format: YYYYMMDD).
+
+## Multi-Architecture Support
+
+All official builds use Docker Buildx to create multi-architecture images:
+
+**Platforms:**
+- `linux/amd64` (Intel/AMD x86-64)
+- `linux/arm64` (Apple Silicon, ARM servers)
+
+**Build Process:**
+1. Creates `hamilton-builder` buildx instance (if not exists)
+2. Builds both architectures in parallel
+3. Pushes manifest list to Docker Hub
+4. Users automatically pull correct architecture
+
+## Docker Hub Setup
+
+### Repository Overview Text
+
+Both `apache/hamilton-ui-frontend` and `apache/hamilton-ui-backend` repositories MUST include:
+
+```markdown
+# Apache Hamilton UI
+
+Apache Hamilton is an effort undergoing incubation at The Apache Software
+Foundation (ASF), sponsored by the Apache Incubator. Incubation is required
+of all newly accepted projects until a further review indicates that the
+infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of
+the code, it does indicate that the project has yet to be fully endorsed by
+the ASF.
+
+## Quick Start
+
+Frontend:
+```bash
+docker run -p 8242:8242 apache/hamilton-ui-frontend:latest
+```
+
+Backend (requires PostgreSQL):
+```bash
+docker run -p 8241:8241 \
+ -e HAMILTON_POSTGRES_HOST=your-postgres-host \
+ -e HAMILTON_POSTGRES_DB=your-db-name \
+ -e HAMILTON_POSTGRES_USER=your-user \
+ -e HAMILTON_POSTGRES_PASSWORD=your-password \
+ apache/hamilton-ui-backend:latest
+```
+
+## Documentation
+
+- [GitHub Repository](https://github.com/apache/hamilton)
+- [Documentation](https://hamilton.apache.org/)
+- [Docker Compose Examples](https://github.com/apache/hamilton/tree/main/ui)
+
+## License
+
+Apache License 2.0 - See [LICENSE](https://github.com/apache/hamilton/blob/main/LICENSE)
+```
+
+### Automated Builds
+
+Consider setting up Docker Hub automated builds:
+
+1. Link GitHub repository to Docker Hub
+2. Configure build rules for tags matching `v*`
+3. Ensure builds use Apache namespace and proper tagging
+
+## Release Checklist
+
+Before creating an official release:
+
+- [ ] Update version in `ui/frontend/package.json`
+- [ ] Update version in `ui/backend/pyproject.toml`
+- [ ] Test using `./run.sh --build` locally
+- [ ] Verify all tests pass
+- [ ] Create release candidate: `./buildx_and_push.sh --version X.Y.Z --type rc --rc-number 1`
+- [ ] Send RC to dev@hamilton.apache.org for voting
+- [ ] Wait for PMC approval (72 hours minimum, 3 +1 votes from PMC members)
+- [ ] Build official release: `./buildx_and_push.sh --version X.Y.Z --type release --tag-latest`
+- [ ] Verify images on Docker Hub
+- [ ] Announce release on dev@hamilton.apache.org
+- [ ] Update documentation with new version
+
+## Common Issues
+
+### "Has this release been approved by the Apache Hamilton PMC?"
+
+This prompt appears when using `--tag-latest`. Only type `yes` if:
+1. A vote thread was sent to dev@hamilton.apache.org
+2. At least 72 hours have passed
+3. At least 3 PMC members voted +1
+4. No -1 (veto) votes
+
+### "Error: Docker Buildx is not installed"
+
+Install Docker Buildx:
+```bash
+# macOS/Linux with Docker Desktop
+docker buildx version
+
+# Linux without Docker Desktop
+DOCKER_BUILDKIT=1 docker build --help | grep buildx
+```
+
+### Build fails with "permission denied"
+
+Ensure you're logged into Docker Hub with apache/* push access:
+```bash
+docker login
+```
+
+### "Error: --rc-number is required for release candidate builds"
+
+When building RCs, you must specify the RC number:
+```bash
+./buildx_and_push.sh --version 0.0.18 --type rc --rc-number 1
+```
+
+## Security Considerations
+
+### Current State (Development)
+
+Current Docker setup uses:
+- Root user (not production-ready)
+- Django development server (not production-ready)
+- Hardcoded credentials in docker-compose files (development only)
+
+### Future Improvements
+
+For production deployments, consider:
+- Running as non-root user (UID 1000)
+- Using gunicorn instead of `manage.py runserver`
+- Using secrets management (Docker secrets, Kubernetes secrets)
+- Adding health checks to docker-compose
+- Adding .dockerignore files
+
+## Additional Resources
+
+- [Apache Release Policy](https://www.apache.org/legal/release-policy.html)
+- [Apache Incubator Releases](https://incubator.apache.org/policy/incubation.html#releases)
+- [Hamilton UI Documentation](https://hamilton.apache.org/en/latest/concepts/ui/)
diff --git a/ui/backend/Dockerfile.backend b/ui/backend/Dockerfile.backend
index 30c26858..a1d6b063 100644
--- a/ui/backend/Dockerfile.backend
+++ b/ui/backend/Dockerfile.backend
@@ -15,6 +15,15 @@
# specific language governing permissions and limitations
# under the License.
+# Apache Hamilton is an effort undergoing incubation at The Apache Software
+# Foundation (ASF), sponsored by the Apache Incubator. Incubation is required
+# of all newly accepted projects until a further review indicates that the
+# infrastructure, communications, and decision making process have stabilized
+# in a manner consistent with other successful ASF projects. While incubation
+# status is not necessarily a reflection of the completeness or stability of
+# the code, it does indicate that the project has yet to be fully endorsed by
+# the ASF.
+
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
diff --git a/ui/backend/Dockerfile.backend-prod b/ui/backend/Dockerfile.backend-prod
index 30c26858..a1d6b063 100644
--- a/ui/backend/Dockerfile.backend-prod
+++ b/ui/backend/Dockerfile.backend-prod
@@ -15,6 +15,15 @@
# specific language governing permissions and limitations
# under the License.
+# Apache Hamilton is an effort undergoing incubation at The Apache Software
+# Foundation (ASF), sponsored by the Apache Incubator. Incubation is required
+# of all newly accepted projects until a further review indicates that the
+# infrastructure, communications, and decision making process have stabilized
+# in a manner consistent with other successful ASF projects. While incubation
+# status is not necessarily a reflection of the completeness or stability of
+# the code, it does indicate that the project has yet to be fully endorsed by
+# the ASF.
+
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
diff --git a/ui/buildx_and_push.sh b/ui/buildx_and_push.sh
index cb56f4ac..c8bc2157 100755
--- a/ui/buildx_and_push.sh
+++ b/ui/buildx_and_push.sh
@@ -16,10 +16,55 @@
# specific language governing permissions and limitations
# under the License.
+set -e
export DOCKER_CLI_EXPERIMENTAL=enabled
-# check if Docker Buildx is installed
+# Apache-compliant Docker image naming
+# TODO: Update to apache/hamilton-* namespace when project graduates from incubator
+FRONTEND_IMAGE="apache/hamilton-ui-frontend"
+BACKEND_IMAGE="apache/hamilton-ui-backend"
+
+# Define common platforms/architectures
+PLATFORMS="linux/amd64,linux/arm64"
+
+# Usage information
+usage() {
+ cat <<EOF
+Usage: $0 [OPTIONS]
+
+Apache-compliant Docker image builder for Hamilton UI.
+
+OPTIONS:
+ --version VERSION Specify version to build (required)
+ --type TYPE Build type: release, rc, snapshot, nightly (default: release)
+ --rc-number NUM Release candidate number (required if --type=rc)
+ --tag-latest Tag as :latest (ONLY for approved releases)
+ --help Show this help message
+
+EXAMPLES:
+ # Official release (requires PMC approval)
+ $0 --version 0.0.17 --type release --tag-latest
+
+ # Release candidate
+ $0 --version 0.0.18 --type rc --rc-number 1
+
+ # Snapshot/development build
+ $0 --version 0.0.18 --type snapshot
+
+ # Nightly build
+ $0 --version 0.0.18 --type nightly
+
+IMPORTANT:
+ - :latest tag should ONLY be used for PMC-approved releases
+ - Release candidates must be tagged as VERSION-rcN
+ - Snapshots must be tagged as VERSION-SNAPSHOT
+ - Nightly builds must be tagged as VERSION-nightly-YYYYMMDD
+EOF
+ exit 1
+}
+
+# Check if Docker Buildx is installed
check_buildx_installed() {
if ! docker buildx version &> /dev/null; then
echo "Error: Docker Buildx is not installed. Please install Docker Buildx to proceed."
@@ -27,60 +72,161 @@ check_buildx_installed() {
fi
}
-# check if jq is installed
-check_jq_installed() {
- if ! jq --version &> /dev/null; then
- echo "Error: jq is not installed. Please install jq to proceed."
- exit 1
- fi
-}
-
-# fetches the latest version of sf-hamilton-ui from PyPI
-get_latest_version() {
- response=$(curl -s https://pypi.org/pypi/sf-hamilton-ui/json)
-
- # check if curl succeeded and the response is not empty
- if [ $? -ne 0 ] || [ -z "$response" ]; then
- echo "Error: Failed to fetch data from PyPI. Please check your internet connection or the URL."
+# Parse command line arguments
+VERSION=""
+BUILD_TYPE="release"
+RC_NUMBER=""
+TAG_LATEST=false
+
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ --version)
+ VERSION="$2"
+ shift 2
+ ;;
+ --type)
+ BUILD_TYPE="$2"
+ shift 2
+ ;;
+ --rc-number)
+ RC_NUMBER="$2"
+ shift 2
+ ;;
+ --tag-latest)
+ TAG_LATEST=true
+ shift
+ ;;
+ --help)
+ usage
+ ;;
+ *)
+ echo "Unknown option: $1"
+ usage
+ ;;
+ esac
+done
+
+# Validate required arguments
+if [ -z "$VERSION" ]; then
+ echo "Error: --version is required"
+ usage
+fi
+
+# Validate build type
+case $BUILD_TYPE in
+ release|rc|snapshot|nightly)
+ ;;
+ *)
+ echo "Error: Invalid build type '$BUILD_TYPE'. Must be: release, rc, snapshot, or nightly"
exit 1
- fi
-
- # extract version using jq and handle potential errors
- version=$(echo "$response" | jq -r '.info.version')
- if [ "$version" == "null" ]; then
- echo "Error: Unable to extract version from the response."
+ ;;
+esac
+
+# Validate RC number for release candidates
+if [ "$BUILD_TYPE" = "rc" ] && [ -z "$RC_NUMBER" ]; then
+ echo "Error: --rc-number is required for release candidate builds"
+ exit 1
+fi
+
+# Warn if trying to tag :latest for non-release builds
+if [ "$TAG_LATEST" = true ] && [ "$BUILD_TYPE" != "release" ]; then
+ echo "ERROR: :latest tag can ONLY be used for release builds (--type=release)"
+ echo "This is required by Apache Software Foundation policy."
+ echo "Release candidates, snapshots, and nightly builds must NOT use :latest tag."
+ exit 1
+fi
+
+# Build version tag based on build type
+case $BUILD_TYPE in
+ release)
+ VERSION_TAG="$VERSION"
+ ;;
+ rc)
+ VERSION_TAG="${VERSION}-rc${RC_NUMBER}"
+ ;;
+ snapshot)
+ VERSION_TAG="${VERSION}-SNAPSHOT"
+ ;;
+ nightly)
+ DATE=$(date +%Y%m%d)
+ VERSION_TAG="${VERSION}-nightly-${DATE}"
+ ;;
+esac
+
+echo "=========================================="
+echo "Apache Hamilton UI Docker Build"
+echo "=========================================="
+echo "Version Tag: $VERSION_TAG"
+echo "Build Type: $BUILD_TYPE"
+echo "Tag :latest: $TAG_LATEST"
+echo "Platforms: $PLATFORMS"
+echo "Backend Image: $BACKEND_IMAGE:$VERSION_TAG"
+echo "Frontend Image: $FRONTEND_IMAGE:$VERSION_TAG"
+echo "=========================================="
+
+# Safety check for :latest tag
+if [ "$TAG_LATEST" = true ]; then
+ echo ""
+ echo "WARNING: You are about to tag this build as :latest"
+ echo "This should ONLY be done for PMC-approved releases."
+ echo ""
+ read -p "Has this release been approved by the Apache Hamilton PMC? (yes/no): " APPROVED
+
+ if [ "$APPROVED" != "yes" ]; then
+ echo "Aborting. Release must be approved before tagging as :latest"
exit 1
fi
+fi
- echo "$version"
-}
-
-# check if Docker Buildx and jq are installed
+# Check prerequisites
check_buildx_installed
-check_jq_installed
-VERSION=$(get_latest_version)
-
-echo "Using sf-hamilton-ui version: $VERSION"
-
-# check if Buildx is already enabled; create a builder instance if not
+# Check if Buildx is already enabled; create a builder instance if not
docker buildx inspect hamilton-builder > /dev/null 2>&1 || \
docker buildx create --use --name hamilton-builder
-FRONTEND_IMAGE="dagworks/ui-frontend"
-BACKEND_IMAGE="dagworks/ui-backend"
-
-# define common platforms/architectures
-PLATFORMS="linux/amd64,linux/arm64"
-
-cd "$(dirname "$0")" # cd into the directory where this script is present(i.e. ui)
-
-docker buildx build --platform $PLATFORMS \
- -t $BACKEND_IMAGE:$VERSION -t $BACKEND_IMAGE:latest \
- --push -f backend/Dockerfile.backend-prod backend/
-
-docker buildx build --platform $PLATFORMS \
- -t $FRONTEND_IMAGE:$VERSION -t $FRONTEND_IMAGE:latest \
- --push -f frontend/Dockerfile.frontend-prod frontend/ \
- --build-arg REACT_APP_AUTH_MODE=local \
- --build-arg REACT_APP_USE_POSTHOG=false \
+cd "$(dirname "$0")" # cd into the directory where this script is present (i.e. ui)
+
+# Build backend image
+echo ""
+echo "Building backend image..."
+if [ "$TAG_LATEST" = true ]; then
+ docker buildx build --platform $PLATFORMS \
+ -t $BACKEND_IMAGE:$VERSION_TAG \
+ -t $BACKEND_IMAGE:latest \
+ --push -f backend/Dockerfile.backend-prod backend/
+else
+ docker buildx build --platform $PLATFORMS \
+ -t $BACKEND_IMAGE:$VERSION_TAG \
+ --push -f backend/Dockerfile.backend-prod backend/
+fi
+
+# Build frontend image
+echo ""
+echo "Building frontend image..."
+if [ "$TAG_LATEST" = true ]; then
+ docker buildx build --platform $PLATFORMS \
+ -t $FRONTEND_IMAGE:$VERSION_TAG \
+ -t $FRONTEND_IMAGE:latest \
+ --push -f frontend/Dockerfile.frontend-prod frontend/ \
+ --build-arg REACT_APP_AUTH_MODE=local \
+ --build-arg REACT_APP_USE_POSTHOG=false
+else
+ docker buildx build --platform $PLATFORMS \
+ -t $FRONTEND_IMAGE:$VERSION_TAG \
+ --push -f frontend/Dockerfile.frontend-prod frontend/ \
+ --build-arg REACT_APP_AUTH_MODE=local \
+ --build-arg REACT_APP_USE_POSTHOG=false
+fi
+
+echo ""
+echo "=========================================="
+echo "Build complete!"
+echo "=========================================="
+echo "Backend: $BACKEND_IMAGE:$VERSION_TAG"
+echo "Frontend: $FRONTEND_IMAGE:$VERSION_TAG"
+if [ "$TAG_LATEST" = true ]; then
+ echo ""
+ echo "Also tagged as :latest (approved release)"
+fi
+echo "=========================================="
diff --git a/ui/frontend/Dockerfile.frontend b/ui/frontend/Dockerfile.frontend
index ab4f9921..e8c1ca76 100644
--- a/ui/frontend/Dockerfile.frontend
+++ b/ui/frontend/Dockerfile.frontend
@@ -15,6 +15,15 @@
# specific language governing permissions and limitations
# under the License.
+# Apache Hamilton is an effort undergoing incubation at The Apache Software
+# Foundation (ASF), sponsored by the Apache Incubator. Incubation is required
+# of all newly accepted projects until a further review indicates that the
+# infrastructure, communications, and decision making process have stabilized
+# in a manner consistent with other successful ASF projects. While incubation
+# status is not necessarily a reflection of the completeness or stability of
+# the code, it does indicate that the project has yet to be fully endorsed by
+# the ASF.
+
FROM node:20
# Set working directory
diff --git a/ui/frontend/Dockerfile.frontend-prod b/ui/frontend/Dockerfile.frontend-prod
index 9a188352..f4a51598 100644
--- a/ui/frontend/Dockerfile.frontend-prod
+++ b/ui/frontend/Dockerfile.frontend-prod
@@ -15,6 +15,15 @@
# specific language governing permissions and limitations
# under the License.
+# Apache Hamilton is an effort undergoing incubation at The Apache Software
+# Foundation (ASF), sponsored by the Apache Incubator. Incubation is required
+# of all newly accepted projects until a further review indicates that the
+# infrastructure, communications, and decision making process have stabilized
+# in a manner consistent with other successful ASF projects. While incubation
+# status is not necessarily a reflection of the completeness or stability of
+# the code, it does indicate that the project has yet to be fully endorsed by
+# the ASF.
+
FROM node:20 AS build-stage
# Set working directory
diff --git a/ui/start_mini_mode.sh b/ui/start_mini_mode.sh
index c4e8c1b4..aab5f68d 100755
--- a/ui/start_mini_mode.sh
+++ b/ui/start_mini_mode.sh
@@ -1,4 +1,21 @@
#!/bin/bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
# Start Hamilton UI in mini mode for local testing
set -e
diff --git a/ui/test_tracking.py b/ui/test_tracking.py
index b0742904..afb69f6b 100644
--- a/ui/test_tracking.py
+++ b/ui/test_tracking.py
@@ -1,4 +1,21 @@
#!/usr/bin/env python3
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
"""
Test script to validate Hamilton UI tracking functionality.
diff --git a/ui/test_tracking_simple.py b/ui/test_tracking_simple.py
index b239853e..bc5ea197 100644
--- a/ui/test_tracking_simple.py
+++ b/ui/test_tracking_simple.py
@@ -1,4 +1,21 @@
#!/usr/bin/env python3
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
"""
Simple test script to validate Hamilton UI tracking.