适用于阿里云函数计算自定义运行时的 Gradle 自动打包插件

# 简介

这个 Gradle 插件可用于自动压缩您的 bootJarbootstrap 文件为一个满足阿里云 函数计算 (opens new window) 自定义运行时 (opens new window)zip 包.

aliyun 2020 promotion (opens new window)

使用这个插件后, 它将自动搜索 ${PROJECT_DIR}${PROJECT_DIR}/bootstrap 文件夹下的 bootstrap 文件, 并生成对应的 Gradle 任务.

项目地址: https://github.com/DevDengChao/fc-custom-runtime-packer (opens new window), 欢迎 Star, Fork, Issue, PR.

欢迎加入 Gradle 插件开发 交流群: 959860873 (opens new window)

欢迎加入 Spring Cloud 交流群: 617143034 (opens new window)

# 如何安装

buildscript {
    repositories {
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath "dev.dengchao:fc-custom-runtime-packer:x.y.z" // 请将 x.y.z 替换成这个实际的版本号
    }
}

version 'your-project-version'

// 这个插件 *必须* 添加在 version 字段下方才能正确生效
apply plugin: "dev.dengchao.fc-custom-runtime-packer"

# 如何使用

# 项目结构

我们假设您有一个类似下方结构的 Spring 项目:

project dir
+--- bootstrap
|       +--- bootstrap-pro  (1)
|       \--- dev            (2)
+--- build
+--- src
+--- bootstrap.sh           (3)
+--- build.gradle           (plugin applyed)

运行 gradle :zipBootstrap 任务后, 您将得到一个常规的 bootJar 文件, 三个配置好地启动压缩包(bootstrap zip):

project dir
+...
+--- build
|       \--- libs
|               +--- demo-1.0.0.jar                     (bootJar)
|               +--- demo-1.0.0-default.zip
|               |       +--- bootstrap                  (generated from 3) 
|               |       \--- demo-1.0.0.jar
|               +--- demo-1.0.0-dev.zip
|               |       +--- bootstrap                  (generated from 2) 
|               |       \--- demo-1.0.0.jar
|               \--- demo-1.0.0-pro.zip
|                       +--- bootstrap                  (generated from 1) 
|                       \--- demo-1.0.0.jar
+...

更进一步的, 您也可以通过运行 gradle :zipBootstrapDefault 任务对默认配置 (profile) 进行打包, 其他配置也是如此.

# Bootstrap 文件规范

  • 它的内容可以包含一个或多个占位符 archiveboot.jar, 这些占位符将被实际的 bootJar 文件名替代. 例如: java -jar archive 将会生成 java -jar demo-1.0.0.jar.
  • 如果它像 (3) 一样位于项目文件下, 那么它的名字必须满足正则表达式 bootstrap(-[a-zA-Z0-9\-]+)?(\.sh)?.
    • 如果存在配置 (profile) (-[a-zA-Z0-9\-]+) , 它将生成一个 ${PROJECT_NAME}-${PROJECT_VERSION}-${PROFILE}.zip 压缩包.
    • 如果配置不存在, 它将生成一个 ${PROJECT_NAME}-${PROJECT_VERSION}-default.zip 压缩包.
  • 如果它像 (1) 和 (2) 一样位于 bootstrap 文件夹下, 那么它的名字必须满足正则表达式 ([a-zA-Z0-9\-]+)(\.sh)?.
    • 如果存在 'bootstrap-' 前缀, 那么这个前缀将从配置名中被移除.
  • 它的内容可以声明自己的 shebang command (opens new window). 目前可接收的值是 #!/bin/bash#!/usr/bin/env sh.
    • 如果它缺少或含有无效的 shebang command, #!/bin/bash 将被前置到生成的 bootstrap 文件中.
  • 它可以被授予可执行权限.
    • 因为压缩包内的 bootstrap 文件是一个生成的文件, 并不是原来的那个, 因此原 bootstrap 文件持有的可执行权限将被忽略, 并且生成的 bootstrap文件模式 (opens new window) 将被设为 775.
  • 如果存在多个有相同配置 (profile) 的 bootstrap 文件, 那么运行的过程中将抛出 DuplicateBootstrapProfileException 异常.

# 参考文献

Spring Boot gradle plugin @github.com (opens new window)

How to get project version in custom gradle plugin @stackoverflow.com (opens new window)

Shebang @wikipedia.org (opens new window)

Unix file mode @tutorialspoint.com (opens new window)

阿里云函数计算自定义运行时原理 @aliyun.com (opens new window)

# 推广