How-To's

深入了解 Space 开发环境

Read this post in other languages:
English, Français, 한국어

A deep dive into Space dev environments

在 JetBrains Space 中,您可以启动开发环境来远程处理代码。 一个强大的、专用虚拟机将运行一个 Docker 容器,虚拟机可以访问您项目的源代码,并为您的本地代码编辑器提供后端组件。 您可以使用这些远程机器来开发软件,无需使用您的本地计算机

使用 Space 开发环境的许多优点之一是,您可以为您的团队标准化开发环境,让每个人都可以立即开始处理项目,不需要浪费时间来设置他们的本地计算机。 此外,您还可以运行预热任务,并准备一个已经下载所有必要的软件包依赖项并具有一个可以随时使用的预构建项目索引的快照。

在这篇文章中,我们将深入探讨 Space 开发环境的自定义选项,看看您可以如何根据团队需求定制开发环境

创建开发环境

在我们深入了解自定义选项之前,让我们快速回顾一下如何使用 Space 开发环境开始开发

在您的 Space 组织的任何 Git 仓库中,您可以通过点击 Open in IDE(在 IDE 中打开)来启动一个开发环境。 此外,您还可以为任何合并请求创建一个新的开发环境,这样就不必在本地计算机上手动克隆代码和下载依赖项来审查和测试变更。

Create remote dev environment in JetBrains Space

提示:您可以从 GitHub 或 BitBucket 迁移或镜像现有的 Git 仓库,并使其在 Space 中可用,包括所有分支、标签和提交。这样一来,您就可以利用现有的仓库来使用 Space 开发环境。

根据您项目的需求,您可以从三种虚拟机实例类型中选择一种:Regular(4 个 CPU 核心,8GB 内存)、Large(8 个 CPU 核心,16GB 内存)或 Extra Large(16 个 CPU 核心,32GB 内存)。

接下来,您需要选择您想使用的 IDE:IntelliJ IDEA 与 JetBrains Gateway(可以通过 Toolbox App 下载),或 JetBrains Fleet。 对其他基于 IntelliJ 的 IDE 的支持正在开发中。

您还会注意到此对话框中的另外两个元素:预热快照和用于启动远程 IDE 的开发容器。 在上面的示例中,预热快照还没有显示(我们稍后会解释为什么),默认的 Docker 镜像被用作启动 IDE 的容器。

当您点击 Create(创建)时,Space 将在云端启动您的 IDE。 设置虚拟机并且 IDE 后端准备就绪后,JetBrains Gateway(或 Fleet)将打开并连接到它。

Running dev environment in IntelliJ IDEA (and JetBrains Gateway)

IntelliJ IDEA 后端现在正在 Space 云中运行,我们使用了瘦客户端 JetBrains Gateway 与之连接。对于许多项目来说,这足以让我们立即开始编码。 然而,在这个具体的示例中,看起来还缺少一些东西:

  • 我们仍然需要下载正确的 JDK,正如编辑器中的警告所指示的那样。
  • 我们仍然需要运行 mvnw compile 来下载依赖项,并且还需要在 IDE 中同步项目。

对于一次性开发环境来说,这样做可能没问题,但如果您的整个团队都要在此仓库上工作,最好是自定义开发环境,确保所有依赖项一开始就存在。 我们来看看如何实现!

自定义开发环境 Dockerfile

默认情况下,Space 使用基于 Ubuntu 操作系统的默认容器镜像运行您的开发环境,并包括 Git、cURL、Docker、Docker Compose 和 OpenJDK。

您可以在项目中添加一个自定义 Dockerfile 来安装任何必要的工具和库。 根据您使用的 IDE,您必须创建 ./.jb-gateway/Dockerfile(IntelliJ IDEA 与 JetBrains Gateway)或 ./.fleet/Dockerfile(Fleet)。

对于这个特定的项目,我们将自定义环境,使其基于 Ubuntu 20.04,我们还将安装一堆命令行工具,包括 Git、curl、Docker 等。 我们还添加了几个版本的 OpenJDK,并将其默认值设置为版本 16,以便开发环境能够选择它。

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
ENV LC_ALL=C.UTF-8

RUN apt-get update && apt-get install -y apt-utils apt-transport-https

RUN apt-get install -y \
  # Utilities \
  curl unzip wget software-properties-common socat man-db gnupg2 pass lsof \
  # VCS \
  git \
  # JVM \
  openjdk-8-jre-headless openjdk-11-jdk-headless openjdk-16-jdk-headless openjdk-17-jdk-headless maven \
  # Docker
  docker docker-compose \
  && rm -rf /var/lib/apt/lists/*


ENV JAVA_HOME=/usr/lib/jvm/java-16-openjdk-amd64

自定义 Dockerfile 有几个要求:

  • 操作系统必须是基于 glibc 的 Linux 分发版(例如:CentOS 7+、Debian 9+ 或 Ubuntu 20.04+)。
  • 您必须安装 Git、OpenSSH(如果您想使用远程 Git 仓库)和 lsof(如果您需要在 IDE 中进行端口转发)。
  • 容器必须以 root 运行(Dockerfile 中没有任何非 root 用户)。

请注意,Dockerfile 特定于分支。 这样一来,可以在不影响团队中其他开发者的情况下轻松地在单独的分支中测试自定义、在功能分支中更新到较新的工具版本,等等。

当您提交此自定义 Dockerfile 并将其推送到您的项目仓库时,Space 会在此分支中创建新的开发环境时使用它作为基础镜像。

Custom Dockerfile / Docker container for a Space remote dev environment

启动此自定义开发环境后,您将看到 IDE 现在可以使用正确的 JDK 版本了。 不过,IntelliJ IDEA 和 Maven 项目仍需同步。 这是使用预热脚本的最佳时机!

预热开发环境

您可以通过构建预热快照来缩短 IDE 解析项目依赖项、构建索引和执行其他后台活动的时间。 在我们的示例中,运行 mvnw compile 和编制项目索引将帮助我们准备好开发环境。

预热快照是使用 Space Automation 创建的。 通过添加一个 .space.kts 文件,您不仅可以开始为您的项目配置持续集成 (CI),还可以配置您的开发环境应该如何预热。

下面是一个示例 .space.kts 文件,它可以定义每晚运行的作业,下载所有 Git 分支,然后运行步骤来使用 IntelliJ IDEA 准备预热快照:

job("Dev Environment Warmup - Gateway") {
    startOn {
        schedule { cron("0 5 * * *") }
    }

    git {
        depth = UNLIMITED_DEPTH
        refSpec = "refs/*:refs/*"
    }

    warmup(ide = Ide.IJGateway) {
        scriptLocation = "warmup.sh"
    }
}

scriptLocation 是可选的。 如果省略它,Space Automation 将克隆您项目的 Git 仓库并在 IDE 中处理项目索引。 如果添加,您可以指定预热脚本的名称(如 warmup.sh),并在该脚本中执行一些操作(如运行 mvnw compile),将所有 Maven 依赖项下载到预热快照中,或者运行 npm install。 这是一个示例 warmup.sh 脚本:

#!/bin/bash
./mvnw compile

请注意,warmup.sh 必须以可执行的权限提交到您的仓库。 您可以通过运行 git update-index --chmod=+x warmup.sh 来执行此操作。

一旦 Space Automation 完成运行预热作业,新创建的开发环境将利用我们之前创建的自定义 Dockerfile,并挂载我们刚刚创建的预热快照,项目索引和依赖项处于就绪状态。

Dev environment with warm-up snapshot
如果您需要对预热作业进行故障排除,可以使用 Space Automation 查找执行的所有步骤及其控制台输出的日志。
Logs of a dev environment in Space

此外,从项目的 Dev Environments(开发环境)菜单,您还可以管理和移除不再需要的快照。

容器镜像、预热快照,还是两者?

到目前为止,我们已经看到了如何自定义开发环境的容器镜像以及如何构建预热快照。 但您应该在哪里运行哪种类型的任务呢?

一般来说,自定义容器镜像应当用于配置环境和操作系统,而预热作业应当用于项目特定的任务,例如下载二进制依赖项和为项目准备 IDE。

结论

在这篇文章中,我们讲述了如何在 JetBrains Space 中启动和自定义开发环境。 使用自定义容器镜像,您可以为团队标准化开发环境。 借助预热任务,您可以准备包含下载的软件包依赖项和预构建项目索引的快照,这样,您可以更快地使用开发环境开始开发。

试一试 JetBrains Space 和开发环境!我们很高兴收到您的反馈!

英文博文原作者:

Sue

Maarten Balliauw