From 6987fd325c913a199a166d1e5e3975a9cb5239b3 Mon Sep 17 00:00:00 2001 From: Kai Salmen Date: Fri, 23 Aug 2024 16:08:53 +0200 Subject: [PATCH] Build containers with GHA - Increase clangd timeout to 150 minutes --- .editorconfig | 3 + .github/workflows/actions.yml | 1 + .github/workflows/ls-clangd.yml | 88 +++++++++++++++++++ .github/workflows/ls-eclipsejdt.yml | 60 +++++++++++++ .github/workflows/ls-groovy.yml | 60 +++++++++++++ README.md | 4 +- packages/examples/package.json | 2 +- .../resources/clangd/build.Dockerfile | 4 +- .../resources/clangd/build.docker-compose.yml | 5 +- .../resources/clangd/configure.Dockerfile | 2 +- .../clangd/configure.docker-compose.yml | 5 +- .../clangd/scripts/extractDockerFiles.ts | 29 +++--- .../resources/eclipse.jdt.ls/Dockerfile | 6 +- .../eclipse.jdt.ls/docker-compose.yml | 3 +- packages/examples/resources/groovy/Dockerfile | 6 +- .../resources/groovy/docker-compose.yml | 3 +- 16 files changed, 255 insertions(+), 26 deletions(-) create mode 100644 .github/workflows/ls-clangd.yml create mode 100644 .github/workflows/ls-eclipsejdt.yml create mode 100644 .github/workflows/ls-groovy.yml diff --git a/.editorconfig b/.editorconfig index b9c69ddd1..14039a4e7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,3 +13,6 @@ indent_size = 2 [*.md] indent_size = 2 + +[*.yml] +indent_size = 2 diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index f647cce77..796ca9ff4 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -9,6 +9,7 @@ on: pull_request: branches: - main + workflow_dispatch: jobs: build: diff --git a/.github/workflows/ls-clangd.yml b/.github/workflows/ls-clangd.yml new file mode 100644 index 000000000..106952425 --- /dev/null +++ b/.github/workflows/ls-clangd.yml @@ -0,0 +1,88 @@ +name: Clangd LS Image + +on: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + REPO_NAME: ${{ github.repository }} + PATH_CONTEXT: ./packages/examples/resources/clangd + CONTAINER_NAME_CONFIGURE: clangd-wasm-configure + CONTAINER_NAME_BUILD: clangd-wasm-build + +jobs: + images-clangd-wasm: + name: Build & Deploy Clangd LS + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + attestations: write + id-token: write + + timeout-minutes: 150 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (configure) + id: meta_configure + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME_CONFIGURE }} + # enforce latest tag for now + tags: | + type=raw,value=latest + + - name: Build & Push (configure) + id: push_configure + uses: docker/build-push-action@v6 + with: + context: ${{ env.PATH_CONTEXT }} + file: ${{ env.PATH_CONTEXT }}/configure.Dockerfile + push: true + tags: ${{ steps.meta_configure.outputs.tags }} + labels: ${{ steps.meta_configure.outputs.labels }} + + - name: Attest (configure) + uses: actions/attest-build-provenance@v1 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME_CONFIGURE }} + subject-digest: ${{ steps.push_configure.outputs.digest }} + push-to-registry: true + + - name: Extract metadata (build) + id: meta_build + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME_BUILD }} + # enforce latest tag for now + tags: | + type=raw,value=latest + + - name: Build & Push (build) + id: push_build + uses: docker/build-push-action@v6 + with: + context: ${{ env.PATH_CONTEXT }} + file: ${{ env.PATH_CONTEXT }}/build.Dockerfile + push: true + tags: ${{ steps.meta_build.outputs.tags }} + labels: ${{ steps.meta_build.outputs.labels }} + + - name: Attest (build) + uses: actions/attest-build-provenance@v1 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME_BUILD }} + subject-digest: ${{ steps.push_build.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/ls-eclipsejdt.yml b/.github/workflows/ls-eclipsejdt.yml new file mode 100644 index 000000000..6de9068e4 --- /dev/null +++ b/.github/workflows/ls-eclipsejdt.yml @@ -0,0 +1,60 @@ +name: Eclipse JDT LS Image + +on: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + REPO_NAME: ${{ github.repository }} + PATH_CONTEXT: ./packages/examples/resources/eclipse.jdt.ls + CONTAINER_NAME: eclipse.jdt.ls + +jobs: + image-eclipsejdtls: + name: Build & Deploy Eclipse JDT LS + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + attestations: write + id-token: write + + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME }} + # enforce latest tag for now + tags: | + type=raw,value=latest + + - name: Build & Push + id: push + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ env.PATH_CONTEXT }}/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + - name: Attest + uses: actions/attest-build-provenance@v1 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME }} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/ls-groovy.yml b/.github/workflows/ls-groovy.yml new file mode 100644 index 000000000..f8d28e915 --- /dev/null +++ b/.github/workflows/ls-groovy.yml @@ -0,0 +1,60 @@ +name: Groovy LS Image + +on: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + REPO_NAME: ${{ github.repository }} + PATH_CONTEXT: ./packages/examples/resources/groovy + CONTAINER_NAME: groovy.ls + +jobs: + image-groovyls: + name: Build & Deploy Groovy LS + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + attestations: write + id-token: write + + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME }} + # enforce latest tag for now + tags: | + type=raw,value=latest + + - name: Build & Push + id: push + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ env.PATH_CONTEXT }}/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + - name: Attest + uses: actions/attest-build-provenance@v1 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.REPO_NAME }}/${{ env.CONTAINER_NAME }} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/README.md b/README.md index af3c6b0f1..a246b0546 100644 --- a/README.md +++ b/README.md @@ -183,11 +183,11 @@ npm run start:example:server:python ##### Groovy Language Server -For the **groovy-client** example you need to ensure the **groovy-server** example is running. You require **docker-compose** which does not require any manual setup (OpenJDK / Gradle). From the project root run `docker-compose -f ./packages/examples/resources/groovy/docker-compose.yml up -d`. First start up will take longer as the container is built. Use `docker-compose -f ./packages/examples/resources/groovy/docker-compose.yml down` to stop it. +For the **groovy-client** example you need to ensure the **groovy-server** example is running. You require **docker-compose** which does not require any manual setup (OpenJDK / Gradle). From the project root run `docker-compose -f ./packages/examples/resources/groovy/docker-compose.yml up -d`. First start up will take longer as the container is downloaded from GitHub's container registry. Use `docker-compose -f ./packages/examples/resources/groovy/docker-compose.yml down` to stop it. ##### Java Language Server -For the **java-client** example you need to ensure the **java-server** example is running. You require **docker-compose** which does not require any manual setup (OpenJDK / Eclipse JDT LS). From the project root run `docker-compose -f ./packages/examples/resources/eclipse.jdt.ls/docker-compose.yml up -d`. First start up will take longer as the container is built. Use `docker-compose -f ./packages/examples/resources/eclipse.jdt.ls/docker-compose.yml down` to stop it. +For the **java-client** example you need to ensure the **java-server** example is running. You require **docker-compose** which does not require any manual setup (OpenJDK / Eclipse JDT LS). From the project root run `docker-compose -f ./packages/examples/resources/eclipse.jdt.ls/docker-compose.yml up -d`. First start up will take longer as the container is downloaded from GitHub's container registry. Use `docker-compose -f ./packages/examples/resources/eclipse.jdt.ls/docker-compose.yml down` to stop it. ### Verification Examples & Usage diff --git a/packages/examples/package.json b/packages/examples/package.json index 7cf0f2406..3d9356c1d 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -116,7 +116,7 @@ "compile": "tsc --build tsconfig.src.json", "resources:download": "vite-node ./build/downloadResources.mts", "build:msg": "echo Building main examples:", - "build": "npm run build:msg && npm run clean && npm run resources:download && npm run compile", + "build": "npm run build:msg && npm run clean && npm run resources:download && npm run extract:docker && npm run compile", "build:bundle": "vite --config vite.bundle.config.ts build", "start:server:json": "vite-node src/json/server/direct.ts", "start:server:python": "vite-node src/python/server/direct.ts", diff --git a/packages/examples/resources/clangd/build.Dockerfile b/packages/examples/resources/clangd/build.Dockerfile index e736c1359..8f50c8ed6 100644 --- a/packages/examples/resources/clangd/build.Dockerfile +++ b/packages/examples/resources/clangd/build.Dockerfile @@ -1,6 +1,6 @@ -FROM clangd-clangd-configure +FROM ghcr.io/typefox/monaco-languageclient/clangd-wasm-configure:latest COPY build-docker.sh /builder/build-docker.sh COPY wait_stdin.patch /builder/wait_stdin.patch -RUN (cd /builder; ./build-docker.sh) +RUN (cd /builder; bash ./build-docker.sh) diff --git a/packages/examples/resources/clangd/build.docker-compose.yml b/packages/examples/resources/clangd/build.docker-compose.yml index 9c3626172..2bc2595cb 100644 --- a/packages/examples/resources/clangd/build.docker-compose.yml +++ b/packages/examples/resources/clangd/build.docker-compose.yml @@ -1,5 +1,6 @@ services: - clangd-build: + clangd-wasm-build: + image: ghcr.io/typefox/monaco-languageclient/clangd-wasm-build:latest build: dockerfile: ./build.Dockerfile context: . @@ -7,4 +8,4 @@ services: platforms: - "linux/amd64" platform: linux/amd64 - container_name: clangd-build + container_name: clangd-wasm-build diff --git a/packages/examples/resources/clangd/configure.Dockerfile b/packages/examples/resources/clangd/configure.Dockerfile index a4d5a5e57..fcdf677ed 100644 --- a/packages/examples/resources/clangd/configure.Dockerfile +++ b/packages/examples/resources/clangd/configure.Dockerfile @@ -15,4 +15,4 @@ RUN volta install node \ RUN mkdir /builder COPY configure-docker.sh /builder/configure-docker.sh -RUN (cd /builder; ./configure-docker.sh) +RUN (cd /builder; bash ./configure-docker.sh) diff --git a/packages/examples/resources/clangd/configure.docker-compose.yml b/packages/examples/resources/clangd/configure.docker-compose.yml index 0c6299ad9..33c84b044 100644 --- a/packages/examples/resources/clangd/configure.docker-compose.yml +++ b/packages/examples/resources/clangd/configure.docker-compose.yml @@ -1,5 +1,6 @@ services: - clangd-configure: + clangd-wasm-configure: + image: ghcr.io/typefox/monaco-languageclient/clangd-wasm-configure:latest build: dockerfile: ./configure.Dockerfile context: . @@ -7,4 +8,4 @@ services: platforms: - "linux/amd64" platform: linux/amd64 - container_name: clangd-configure + container_name: clangd-wasm-configure diff --git a/packages/examples/resources/clangd/scripts/extractDockerFiles.ts b/packages/examples/resources/clangd/scripts/extractDockerFiles.ts index a4c44a03f..490e8b052 100644 --- a/packages/examples/resources/clangd/scripts/extractDockerFiles.ts +++ b/packages/examples/resources/clangd/scripts/extractDockerFiles.ts @@ -3,16 +3,21 @@ import child_process from "node:child_process"; const outputDir = './resources/clangd/wasm'; -// clean always -fs.rmSync(outputDir, { - force: true, - recursive: true -}); -fs.mkdirSync(outputDir); +try { + child_process.execFileSync('docker', ['create', '--name', 'extract-clangd', 'ghcr.io/typefox/monaco-languageclient/clangd-wasm-build:latest']); -child_process.execFileSync('docker', ['create', '--name', 'extract-clangd', 'clangd-clangd-build']); -child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.js', outputDir]); -child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.wasm', outputDir]); -child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.worker.js', outputDir]); -child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.worker.mjs', outputDir]); -child_process.execFileSync('docker', ['rm', 'extract-clangd']); + // clean but only if container start was successful + fs.rmSync(outputDir, { + force: true, + recursive: true + }); + fs.mkdirSync(outputDir); + + child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.js', outputDir]); + child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.wasm', outputDir]); + child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.worker.js', outputDir]); + child_process.execFileSync('docker', ['cp', 'extract-clangd:/builder/llvm-project/build/bin/clangd.worker.mjs', outputDir]); + child_process.execFileSync('docker', ['rm', 'extract-clangd']); +} catch (e) { + console.warn('Clangd wasm data was not extracted from container image!'); +} diff --git a/packages/examples/resources/eclipse.jdt.ls/Dockerfile b/packages/examples/resources/eclipse.jdt.ls/Dockerfile index 963718594..f647ff292 100644 --- a/packages/examples/resources/eclipse.jdt.ls/Dockerfile +++ b/packages/examples/resources/eclipse.jdt.ls/Dockerfile @@ -21,6 +21,10 @@ RUN mkdir -p ${PATH_MLC} # copy repo content COPY ./ ${PATH_MLC} +RUN cd ${PATH_MLC} \ + && npm i \ + && npm run build + # download and extract Eclipse JDT LS in target folder RUN mkdir -p ${PATH_ECLIPSE_JDT} \ && cd ${PATH_ECLIPSE_JDT} \ @@ -29,4 +33,4 @@ RUN mkdir -p ${PATH_ECLIPSE_JDT} \ WORKDIR ${PATH_MLC} -CMD ["/bin/bash", "npm i && npm run start:example:server:jdtls"] +CMD ["/bin/bash", "npm run start:example:server:jdtls"] diff --git a/packages/examples/resources/eclipse.jdt.ls/docker-compose.yml b/packages/examples/resources/eclipse.jdt.ls/docker-compose.yml index 6d18ee918..a8d9b28f1 100644 --- a/packages/examples/resources/eclipse.jdt.ls/docker-compose.yml +++ b/packages/examples/resources/eclipse.jdt.ls/docker-compose.yml @@ -1,5 +1,6 @@ services: eclipsejdtls: + image: ghcr.io/typefox/monaco-languageclient/eclipse.jdt.ls:latest build: dockerfile: ./packages/examples/resources/eclipse.jdt.ls/Dockerfile context: ../../../.. @@ -10,7 +11,7 @@ services: # - "linux/arm64" platform: linux/amd64 command: [ - "bash", "-c", "npm i && npm run start:example:server:jdtls" + "bash", "-c", "npm run start:example:server:jdtls" ] ports: - 30003:30003 diff --git a/packages/examples/resources/groovy/Dockerfile b/packages/examples/resources/groovy/Dockerfile index 8b88f6033..89757304c 100644 --- a/packages/examples/resources/groovy/Dockerfile +++ b/packages/examples/resources/groovy/Dockerfile @@ -29,10 +29,14 @@ RUN cd ${HOME_DIR} \ # copy repo content COPY ./ ${PATH_MLC} +RUN cd ${PATH_MLC} \ + && npm i \ + && npm run build + # copy language server to target RUN mkdir -p ${PATH_GROOVY_JAR} \ && cp ${PATH_GLS}/build/libs/groovy-language-server-all.jar ${PATH_GROOVY_JAR} WORKDIR ${PATH_MLC} -CMD ["/bin/bash", "npm i && npm run start:example:server:groovy"] +CMD ["/bin/bash", "npm run start:example:server:groovy"] diff --git a/packages/examples/resources/groovy/docker-compose.yml b/packages/examples/resources/groovy/docker-compose.yml index 0ba6691d4..70cc7c8bf 100644 --- a/packages/examples/resources/groovy/docker-compose.yml +++ b/packages/examples/resources/groovy/docker-compose.yml @@ -1,5 +1,6 @@ services: groovyls: + image: ghcr.io/typefox/monaco-languageclient/groovy.ls:latest build: dockerfile: ./packages/examples/resources/groovy/Dockerfile context: ../../../.. @@ -10,7 +11,7 @@ services: # - "linux/arm64" platform: linux/amd64 command: [ - "bash", "-c", "npm i && npm run start:example:server:groovy" + "bash", "-c", "npm run start:example:server:groovy" ] ports: - 30002:30002