diff --git a/.github/studios.Dockerfile b/.github/studios.Dockerfile new file mode 100644 index 000000000..5347784fd --- /dev/null +++ b/.github/studios.Dockerfile @@ -0,0 +1,72 @@ + +ARG CONNECT_CLIENT_VERSION="0.8-rc" + +FROM cr.seqera.io/public/data-studio-vscode:1.101.2-${CONNECT_CLIENT_VERSION} + +# Environment variable for repository URL with default +ENV REPO_URL="https://github.com/nextflow-io/training.git" +ENV REPO_REF="2.3.0" + +# Create and configure workspace +WORKDIR /workspaces +RUN mkdir -p /workspaces/.nextflow && \ + mkdir -p /workspaces/.vscode-server + +# Pre-install nf-core extension pack +RUN /home/.vscode/bin/openvscode-server --install-extension nf-core.nf-core-extensionpack --force + +# Create setup script that clones repository then runs init +RUN cat > /usr/local/bin/setup.sh <<'BASH' && \ + chmod +x /usr/local/bin/setup.sh +#!/bin/bash +set -euo pipefail + +echo "Cloning repository: ${REPO_URL}" + +# Derive workspace dir from repo name +REPO_NAME=$(basename "${REPO_URL}" .git) +WORKSPACE_DIR="/workspaces/${REPO_NAME}" + +# Check if repository already exists +if [ -d "${WORKSPACE_DIR}/.git" ]; then + echo "Repository already exists at ${WORKSPACE_DIR}, skipping setup" +else + # Clone the specified ref (branch or tag) + git clone --depth 1 --branch "${REPO_REF}" "${REPO_URL}" "${WORKSPACE_DIR}" + + # VS Code settings scoped to the repo + mkdir -p "${WORKSPACE_DIR}/.vscode" + cat > "${WORKSPACE_DIR}/.vscode/settings.json" << 'EOF' +{ + "workbench.colorTheme": "Default Dark Modern", + "terminal.integrated.defaultProfile.linux": "bash", + "terminal.integrated.cwd": "${workspaceFolder}", + "workbench.startupEditor": "none", + "workbench.panel.defaultLocation": "bottom", + "workbench.panel.opensMaximized": "never", + "terminal.integrated.hideOnStartup": "never", + "cSpell.diagnosticLevel": "Hint", + "nextflow.java.home": "/usr", + "nextflow.debug": false +} +EOF + + # Default folder points at the cloned repo + sed -i "s|--default-folder '/workspace'|--default-folder '${WORKSPACE_DIR}'|g" /init + + # Pre-warm Nextflow + export NXF_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=50.0" + nextflow help > /dev/null 2>&1 + sleep 2 + nextflow info > /dev/null 2>&1 + sleep 2 +fi + +exec /init +BASH + +# Override the entrypoint to use connect-client +ENTRYPOINT ["/usr/bin/connect-client", "--entrypoint", "/usr/local/bin/setup.sh"] + +# Default arguments (empty since setup script handles everything) +CMD [] diff --git a/.github/workflows/docker-devcontainer.yml b/.github/workflows/docker-devcontainer.yml index 5db2a6be1..fc9136bf3 100644 --- a/.github/workflows/docker-devcontainer.yml +++ b/.github/workflows/docker-devcontainer.yml @@ -9,6 +9,7 @@ on: paths: - ".devcontainer/**" - ".github/workflows/docker-devcontainer.yml" + - ".github/studios.Dockerfile" push: { branches: [master] } # Build + push ('latest' tag) release: { types: [published] } # Build + push (release tag) workflow_dispatch: # Build + push (custom tag) @@ -68,3 +69,38 @@ jobs: push release workflow_dispatch + + build_studios: + needs: build_push + if: github.event_name != 'pull_request' || contains(github.event.pull_request.changed_files, '.github/studios.Dockerfile') + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push Studios image + uses: docker/build-push-action@v5 + with: + context: . + file: .github/studios.Dockerfile + push: ${{ github.event_name != 'pull_request' }} + platforms: linux/amd64,linux/arm64 + tags: ghcr.io/${{ github.repository }}-studios:${{ env.IMAGE_TAG }} + build-args: | + IMAGE_TAG=${{ env.IMAGE_TAG }}