Skip to content

[pull] main from freeCodeCamp:main #2073

[pull] main from freeCodeCamp:main

[pull] main from freeCodeCamp:main #2073

name: CI - Devcontainer
on:
pull_request:
paths:
- '.devcontainer/**'
- 'docker/devcontainer/**'
- 'docker/docker-compose.yml'
- '.github/workflows/devcontainer-ci.yml'
- 'sample.env'
- 'package.json'
- 'turbo.json'
- 'pnpm-lock.yaml'
- 'client/package.json'
- 'client/turbo.json'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
validate:
name: Validate
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- name: Install devcontainer CLI
# renovate: datasource=npm depName=@devcontainers/cli
run: npm install -g @devcontainers/cli@0.83.0
- name: Build the devcontainer image from this branch
uses: docker/bake-action@018cb6412ab401ebaa809aa5f85966b74628600f # v7
with:
files: docker/devcontainer/docker-bake.hcl
targets: local-devcontainer
load: true
- name: Start devcontainer
run: devcontainer up --workspace-folder .
- name: Validate required tools
run: |
devcontainer exec --workspace-folder . pnpm --version
devcontainer exec --workspace-folder . rsync --version
devcontainer exec --workspace-folder . mongosh --version
devcontainer exec --workspace-folder . node --version
devcontainer exec --workspace-folder . git --version
devcontainer exec --workspace-folder . gh --version
- name: Validate MongoDB is writable
run: |
for i in $(seq 1 30); do
if devcontainer exec --workspace-folder . mongosh --quiet --eval 'if (!db.hello().isWritablePrimary) quit(1)'; then
echo "Replica set is writable"
exit 0
fi
echo "Waiting for a writable primary... (attempt $i/30)"
sleep 2
done
echo "Replica set failed to initialize"
exit 1
- name: Validate Mailpit is reachable
run: |
devcontainer exec --workspace-folder . bash -c 'exec 3<>/dev/tcp/localhost/1025 && head -1 <&3'
devcontainer exec --workspace-folder . bash -c 'exec 3<>/dev/tcp/localhost/8025'
- name: Validate the generated .env
run: |
devcontainer exec --workspace-folder . grep -q '^MAILPIT_HOST=localhost$' .env
devcontainer exec --workspace-folder . grep -q '^HOME_LOCATION=http://localhost:8000$' .env
- name: Validate the client answers on IPv4 loopback
run: |
devcontainer exec --workspace-folder . bash -c '
FCC_SUPERBLOCK=responsive-web-design pnpm run develop > /tmp/develop.log 2>&1 &
pid=$!
deadline=$((SECONDS + 2400))
while [ "$SECONDS" -lt "$deadline" ]; do
if ! kill -0 "$pid" 2>/dev/null; then
echo "pnpm run develop exited before the client answered"
cat /tmp/develop.log
exit 1
fi
if curl -sf -o /dev/null --max-time 10 http://127.0.0.1:8000/; then
echo "The client answers on 127.0.0.1:8000"
exit 0
fi
sleep 5
done
echo "The client never answered on 127.0.0.1:8000"
cat /tmp/develop.log
exit 1'
- name: Validate the Codespaces URL rewrite
run: |
devcontainer exec --workspace-folder . env \
CODESPACE_NAME=ci-probe \
GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN=app.github.dev \
.devcontainer/codespace-env.sh
devcontainer exec --workspace-folder . grep -q '^HOME_LOCATION=https://ci-probe-8000.app.github.dev$' .env
devcontainer exec --workspace-folder . grep -q '^API_LOCATION=https://ci-probe-3000.app.github.dev$' .env