1. 概述
本教程将介绍如何使用Heroku平台将一个简单的Spring Boot Java应用部署到云端。Heroku通过处理基础设施,简化了应用的部署、管理和扩展。
2. 安装
本文将使用一个简单的"Hello World" Spring Java应用,构建工具为Maven。该应用有一个接口,访问时返回"Hello, Heroku!"。
2.1. 项目设置
打开Hello World项目,我们需要添加几个配置文件。
首先,在项目根目录创建一个Procfile
。该文件定义了进程类型,并明确指出启动应用的命令。创建后,添加以下命令:
web: java -Dserver.port=$PORT -jar target/*.jar
然后,在根文件夹中创建一个system.properties
文件。在这个文件中,我们将指定Heroku应使用的Java运行时环境。默认情况下,Heroku使用Java 8:
java.runtime.version=17
项目设置完成。接下来,我们将配置Heroku,为部署做准备。
2.2. Heroku设置
Heroku CLI需要Git,因此我们需要先安装它。
登录Heroku网站,下载Windows的CLI客户端,或者对于Mac,使用brew tap heroku/brew && brew install heroku
。
安装完成后,我们可以通过网站或CLI创建Heroku项目。打开终端窗口,导航到项目目录。
为了使用Heroku,我们需要通过heroku login
命令登录CLI。
然后,使用git init
创建Git仓库,并使用heroku create
创建Heroku应用。系统会为默认应用分配一个随机名称,并将区域设置为美国。不过,用户可以通过平台网站轻松修改这些设置。
3. 通过Heroku CLI部署
将代码暂存并提交,然后使用git push heroku main
将更改推送到Heroku仓库。
Heroku会自动检测我们的Java应用并启动构建过程。构建成功后,我们可以通过提供的URL(通常类似于https://our-app-name.herokuapp.com/
)在浏览器中访问应用。
结果,我们应该看到Spring应用已启动,网站显示"Hello, Heroku!"。
或者,我们可以在终端中执行heroku open
来快速验证应用是否启动。
4. 通过Heroku Maven插件部署
除了使用CLI,Heroku还支持通过一个名为Heroku Maven Plugin的Maven插件构建和发布应用。
要使用该插件,需要将其添加到pom.xml
中:
<plugin>
<groupId>com.heroku.sdk</groupId>
<artifactId>heroku-maven-plugin</artifactId>
<version>3.0.7</version>
<configuration>
<logProgress>true</logProgress>
</configuration>
</plugin>
依赖解析完成后,我们可以使用命令mvn clean heroku:deploy
开始部署应用。
这种方法对于编译耗时长的应用或通过CI部署的应用特别有用。
该插件提供了多种配置,包含在pom.xml
文件的configuration
元素中。我们来探索其中一些。
首先,我们可以设置插件使用的JDK版本,这将覆盖system.properties
中的设置:
<jdkVersion>17</jdkVersion>
此外,我们可以配置变量,这些变量将覆盖之前定义的变量:
<configVars>
<MY_VAR>SomeValue</MY_VAR>
</configVars>
而且,我们可以指定启动应用的命令:
<processTypes>
<web>java -Dserver.port=$PORT -jar target/*.jar
</processTypes>
5. 通过CI/CD管道部署
文章的下一部分,我们将探讨使用GitHub和GitLab进行部署。
Heroku提供了与GitHub的直接连接,使应用部署更加容易。 而GitLab则需要配置管道。
要使用这些选项,我们需要将项目推送到这些平台的仓库上。
5.1. GitHub
打开Heroku网站,选择我们正在处理的项目。然后,导航到"Deploy"选项卡,选择GitHub作为部署方法。
快速登录后,我们搜索并选择仓库。然后,启用"Automatic Deploys",这样任何推送到main分支的操作都会自动触发Heroku上的部署。
5.2. GitLab
对于GitLab,我们需要在项目中添加一个.gitlab-ci.yml
文件:
image: maven:3.8.7-eclipse-temurin-17
stages:
- test
- deploy
cache:
paths:
- .m2/repository
- target
unit-test:
stage: test
image: maven:latest
script:
- echo "Maven test started"
- "mvn test"
deploy_job:
stage: deploy
image: maven:latest
script:
- HEROKU_API_KEY=${HEROKU_API_KEY} mvn clean heroku:deploy
此外,我们需要将Heroku API密钥添加到GitLab CI/CD变量中(在项目设置中)。API密钥可以从Heroku网站的用户个人资料中获取。
由于我们在脚本中使用了Heroku Maven插件,因此需要在pom.xml
文件中添加一个额外配置。具体来说,我们必须添加在Heroku平台上显示的应用名称。为此,我们在插件的配置元素中定义应用名称:
<appName>our-app-name</appName>
推送更改后,管道启动,随后部署应用。
6. 使用Docker部署
假设本地已安装Docker,我们首先在项目根目录创建一个Dockerfile
。然后填充以下内容:
FROM maven:3.8.4-openjdk-17 AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
通过上述脚本,我们使用Maven构建应用,将构建的.jar
文件复制到一个更小的JDK镜像中,并暴露端口8080供应用运行。
其次,我们需要在resource
文件夹中添加application.properties
文件来设置服务器端口:
server.port=${PORT:8080}
这样,Docker可以将端口映射到我们的Spring应用端口。
第三,我们构建并运行Docker镜像,确保其正常工作:
docker build -t our-heroku-app .
docker run -p 8080:8080 our-heroku-app
使用curl localhost:8080
检查是否返回"Hello, Heroku!"字符串。
最后,我们必须将更改部署并发布到Heroku。为此,我们在终端中执行几个命令。
首先运行heroku container:login
登录到Heroku Container Registry。然后使用heroku container:push web –app our-heroku-app
构建并推送Docker镜像到Heroku。最后,使用heroku container:release web –app our-heroku-app
发布应用镜像。
发布后,应用应该上线,我们可以使用命令heroku open –app our-heroku-app
进行验证。
7. 总结
本文探讨了在Heroku上部署Java应用的多种方法。
我们了解了如何使用提供的CLI轻松设置和部署Heroku应用。
此外,我们利用Heroku Maven插件的命令,简化了从终端和CI/CD环境的部署。
最后,我们理解了Docker在快速应用部署中的优势。
一如既往,代码可以在GitHub上找到。