From 380440e67ca48ac615e32eed4318554fa2bb29a3 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 18 Jul 2025 09:12:36 -0700 Subject: [PATCH 1/5] Better devcontainer --- .devcontainer/Dockerfile | 38 ++++++++++++++++ .devcontainer/devcontainer.json | 12 +----- .github/workflows/build-devcontainer.yml | 55 ++++++++++++++++++++++++ smoke-tests/apps/gRPC/build.gradle.kts | 6 +-- 4 files changed, 98 insertions(+), 13 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .github/workflows/build-devcontainer.yml diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000000..a8f5b0dacb9 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,38 @@ +# Use the same base image as the original devcontainer +FROM mcr.microsoft.com/vscode/devcontainers/base:bullseye + +# Install Microsoft OpenJDK 17 +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends \ + wget \ + ca-certificates \ + && wget -q https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ + && dpkg -i packages-microsoft-prod.deb \ + && rm packages-microsoft-prod.deb \ + && apt-get update \ + && apt-get -y install --no-install-recommends \ + msopenjdk-17 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Switch to vscode user for the build +USER vscode + +# Set working directory for build +WORKDIR /tmp/build + +# Copy all project files for the build +COPY --chown=vscode:vscode . ./ + +# Pre-populate Gradle dependency and build caches by compiling all classes +# Use --no-daemon to avoid leaving daemon processes running +# Set JAVA_HOME dynamically based on the actual installation +RUN export JAVA_HOME=$(find /usr/lib/jvm -name "msopenjdk-17-*" -type d | head -1) && \ + export PATH="$JAVA_HOME/bin:$PATH" && \ + ./gradlew classes --no-daemon + +# Clean up the build directory but preserve gradle cache +RUN rm -rf /tmp/build + +# Set default working directory for development +WORKDIR /workspaces diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 2e19226ec32..4da68f5e33c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,10 +1,7 @@ { "name": "Application Insights Java Development Environment", - "image": "mcr.microsoft.com/vscode/devcontainers/base:bullseye", + "image": "ghcr.io/microsoft/applicationinsights-java/devcontainer:latest", "features": { - "ghcr.io/devcontainers/features/java:1": { - "version": "17" - }, "ghcr.io/devcontainers/features/docker-in-docker:2": { "version": "latest" } @@ -17,10 +14,5 @@ "ms-vscode.vscode-json" ] } - }, - "mounts": [ - "source=gradle-cache,target=/home/vscode/.gradle,type=volume" - ], - "remoteUser": "vscode", - "postCreateCommand": "sudo chown -R vscode:vscode /home/vscode/.gradle" + } } diff --git a/.github/workflows/build-devcontainer.yml b/.github/workflows/build-devcontainer.yml new file mode 100644 index 00000000000..0681883a7d2 --- /dev/null +++ b/.github/workflows/build-devcontainer.yml @@ -0,0 +1,55 @@ +name: Build Devcontainer Image + +on: + push: + branches: + - main + workflow_dispatch: + inputs: + force_rebuild: + description: 'Force rebuild without cache' + type: boolean + default: false + +jobs: + build-and-push-devcontainer: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository }}/devcontainer + tags: | + type=ref,event=branch + type=sha + type=raw,value=latest,enable={{is_default_branch}} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: .devcontainer/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: linux/amd64,linux/arm64 + cache-from: ${{ github.event.inputs.force_rebuild != 'true' && 'type=gha' || '' }} + cache-to: type=gha,mode=max diff --git a/smoke-tests/apps/gRPC/build.gradle.kts b/smoke-tests/apps/gRPC/build.gradle.kts index f101f131644..72a040219a7 100644 --- a/smoke-tests/apps/gRPC/build.gradle.kts +++ b/smoke-tests/apps/gRPC/build.gradle.kts @@ -5,13 +5,13 @@ plugins { id("com.google.protobuf") version "0.8.19" } -val grpcVersion = "1.16.1" -val nettyVersion = "4.1.30.Final" +val grpcVersion = "1.26.0" // first version with support for arm64 +val nettyVersion = "4.1.42.Final" protobuf { protoc { // Download compiler rather than using locally installed version: - artifact = "com.google.protobuf:protoc:3.3.0" + artifact = "com.google.protobuf:protoc:3.5.0" // first version with support for arm64 } plugins { id("grpc") { From 6701aeee6ae093cfabe4f4f5d4828e8eff6de67d Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 18 Jul 2025 09:18:55 -0700 Subject: [PATCH 2/5] Remove gradle plugin for now since it's very slow --- .devcontainer/devcontainer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4da68f5e33c..a5d7e46e06e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -10,7 +10,6 @@ "vscode": { "extensions": [ "vscjava.vscode-java-pack", - "vscjava.vscode-gradle", "ms-vscode.vscode-json" ] } From ea14ecd2a6e180a4450f8b51e0af2a1e1cbbeb97 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 18 Jul 2025 09:33:29 -0700 Subject: [PATCH 3/5] faster --- .devcontainer/Dockerfile | 15 ++++++++++++--- .devcontainer/devcontainer.json | 5 ----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a8f5b0dacb9..2d0a8f0108d 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,19 +1,28 @@ # Use the same base image as the original devcontainer FROM mcr.microsoft.com/vscode/devcontainers/base:bullseye -# Install Microsoft OpenJDK 17 +# Install Microsoft OpenJDK 17 and Docker RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ && apt-get -y install --no-install-recommends \ wget \ ca-certificates \ + curl \ + gnupg \ + lsb-release \ && wget -q https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ && dpkg -i packages-microsoft-prod.deb \ - && rm packages-microsoft-prod.deb \ + && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \ && apt-get update \ && apt-get -y install --no-install-recommends \ msopenjdk-17 \ + docker-ce \ + docker-ce-cli \ + containerd.io \ + && usermod -aG docker vscode `# Add vscode user to docker group for Docker access` \ && apt-get clean \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* \ + && rm packages-microsoft-prod.deb # Switch to vscode user for the build USER vscode diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a5d7e46e06e..09aa0bbb946 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,11 +1,6 @@ { "name": "Application Insights Java Development Environment", "image": "ghcr.io/microsoft/applicationinsights-java/devcontainer:latest", - "features": { - "ghcr.io/devcontainers/features/docker-in-docker:2": { - "version": "latest" - } - }, "customizations": { "vscode": { "extensions": [ From c6abbd76e3c855e4be69e9db8bf11bd93d42c9c2 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 18 Jul 2025 11:19:32 -0700 Subject: [PATCH 4/5] NOARM --- .devcontainer/Dockerfile | 3 +-- .github/workflows/build-devcontainer.yml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 2d0a8f0108d..7a353d593cc 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -35,8 +35,7 @@ COPY --chown=vscode:vscode . ./ # Pre-populate Gradle dependency and build caches by compiling all classes # Use --no-daemon to avoid leaving daemon processes running -# Set JAVA_HOME dynamically based on the actual installation -RUN export JAVA_HOME=$(find /usr/lib/jvm -name "msopenjdk-17-*" -type d | head -1) && \ +RUN export JAVA_HOME=/usr/lib/jvm/msopenjdk-17-amd64 && \ export PATH="$JAVA_HOME/bin:$PATH" && \ ./gradlew classes --no-daemon diff --git a/.github/workflows/build-devcontainer.yml b/.github/workflows/build-devcontainer.yml index 0681883a7d2..4247af50515 100644 --- a/.github/workflows/build-devcontainer.yml +++ b/.github/workflows/build-devcontainer.yml @@ -50,6 +50,6 @@ jobs: push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64 cache-from: ${{ github.event.inputs.force_rebuild != 'true' && 'type=gha' || '' }} cache-to: type=gha,mode=max From 0133a7382b5b0e0851b960590383bfbe2d1eab90 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 18 Jul 2025 11:44:45 -0700 Subject: [PATCH 5/5] minimal --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 09aa0bbb946..c810cfb548a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,7 +4,7 @@ "customizations": { "vscode": { "extensions": [ - "vscjava.vscode-java-pack", + "redhat.java", "ms-vscode.vscode-json" ] }