问题描述
我有一个 Spring-Boot 应用程序,我托管在 Heroku 上,很快就会投入生产。 目前我正在使用 Heroku 的免费层版本,但会在生产前购买标准的付费层。
我面临的问题是,当与所有依赖项一起打包时,我的应用程序的 jar 大小超过 200+M。
我尝试了两种部署方式(目前都可以使用)
1) 使用 Heroku maven 插件
2) 从 Git 中心部署,以及 Git-LFS(用于托管 jar 文件,因为 GitHub 不允许文件大于 100mb)并且 Heroku 需要该 jar。
我的procfile 看起来像这样:
web: java -jar target/x-x-1.1.1.jar
注意:GitHub-LFS 免费层每月上传/下载也有 1GB 的限制,所以我现在坚持使用 Heroku maven 构建插件工具(因为我也达到了 Git-LFS 限制)。>
在两种方式中,即使我的源代码在重新打包然后部署到 Heroku 时有细微的变化,我也必须上传大约 200+M。
我对 docker 没有太多的知识和专业知识,我现在在寻找一种使用 docker 和 git hub 部署到 Heroku 的方法,而无需每次都上传打包的 jar,之前 Docker 会使用 maven 构建 jar 文件部署!
所以如果有人知道这一点或可以指出如何实现这一点的指南,这将大大减少我的部署时间!
Spring-Boot 版本:2.2.5
Maven 构建插件:3.1.0
解决方法
确实使用 Docker 应该可以解决您的问题,因为 slug 限制不适用于 Heroku Container Registry。您可以按照以下步骤使用 GitHub 操作来实现此目的。
创建 Dockerfile
Dockerfile 非常简单。绑定 Heroku 在运行时分配给你的 PORT 很重要
FROM adoptopenjdk/openjdk11:latest
RUN mkdir -p /software
ADD target/x-x-1.1.1.jar /software/x-x-1.1.1.jar
CMD java -Dserver.port=$PORT $JAVA_OPTS -jar /software/x-x-1.1.1.jar
配置 GitHub 操作工作流程
创建 GitHubActions 工作流 (/.github/workflows/main.yml
),配置管道以构建应用程序 jar 文件,并使用 Heroku CLI 构建映像/将映像推送到 Container Registry。
下面的工作流在每次推送到 main
分支时触发(如果您愿意,显然可以更改触发事件)。
name: Build & Push to Heroku Docker Registry
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Git Checkout
uses: actions/checkout@v1
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Heroku Container Registry login
env:
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
run: heroku container:login
- name: Build and push
env:
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
run: heroku container:push -a ${{ secrets.HEROKU_APP_NAME }} web
- name: Release
env:
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
run: heroku container:release -a ${{ secrets.HEROKU_APP_NAME }} web
请注意您需要使用 Heroku API 密钥和 Heroku 应用程序名称相应配置的 GitHub 操作机密 HEROKU_API_KEY
和 HEROKU_APP_NAME
。
我已经捕获了上述所有内容并提供了一个简单的 GitHub 存储库 here