使用 github

问题描述

我有一个 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_KEYHEROKU_APP_NAME

我已经捕获了上述所有内容并提供了一个简单的 GitHub 存储库 here