Add standalone Podman build script with dedicated Maven cache
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
.git
|
||||
.idea
|
||||
.settings
|
||||
.cache
|
||||
logs
|
||||
src
|
||||
docs
|
||||
target/*
|
||||
!target/*.jar
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
> **Java 版本要求:JDK 8。** 项目基于 Spring Boot 1.5 和 JAXB 生成代码构建,未验证 JDK 11+;请使用 JDK 8 进行本地开发、构建和运行。
|
||||
|
||||
**Podman 测试镜像构建**:见 [构建说明](docs/build.md),使用 `./build.sh -t localhost/admin-api:1.2.1-pg-test`,Maven 缓存默认放在 `../chengdu-repository`。
|
||||
|
||||
**定位:只读数据服务层。** 本服务不生产业务数据,OMMS 主数据由 Oracle 侧系统维护,本服务只做查询与对外暴露;仅 MySQL 侧的 UI 设置为本服务自有写数据。
|
||||
|
||||
**不在本服务职责内**:航班动态实时推送、航班保障流程、报文收发与解析落库(由 AODB/消息中间件侧负责)。本服务不保存航班数据,历史航班从 Elasticsearch 读取。
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
PROJECT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPOSITORY="$PROJECT_DIR/../chengdu-repository"
|
||||
IMAGE='localhost/admin-api:1.2.1-pg-test'
|
||||
JAR_FILE='target/admin-api-1.2.1-SNAPSHOT.jar'
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
用法:./build.sh [-t 镜像名称:tag] [-r Maven缓存目录]
|
||||
|
||||
-t 默认 localhost/admin-api:1.2.1-pg-test,不读取 Maven 版本
|
||||
-r 默认项目旁的 ../chengdu-repository;相对路径以项目目录为基准
|
||||
-h 显示帮助
|
||||
|
||||
需要 JAVA_HOME 指向 JDK 8、Maven(或完整的 Maven Wrapper)和 Podman。
|
||||
脚本编译 JAR、检查 PostgreSQL 驱动,然后构建镜像;不会推送或启动服务。
|
||||
EOF
|
||||
}
|
||||
|
||||
die() { printf '错误:%s\n' "$*" >&2; exit 1; }
|
||||
|
||||
while getopts ':t:r:h' option; do
|
||||
case "$option" in
|
||||
t) IMAGE="$OPTARG" ;;
|
||||
r) REPOSITORY="$OPTARG" ;;
|
||||
h) usage; exit 0 ;;
|
||||
:) die "选项 -$OPTARG 缺少参数" ;;
|
||||
\?) die "未知选项 -$OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND - 1))
|
||||
[[ $# -eq 0 ]] || die '不支持额外的位置参数'
|
||||
[[ -n "$IMAGE" && -n "$REPOSITORY" ]] || die '镜像名和缓存目录不能为空'
|
||||
|
||||
cd "$PROJECT_DIR"
|
||||
[[ -n "${JAVA_HOME:-}" ]] || die '请先设置 JAVA_HOME,指向 JDK 8'
|
||||
for tool in java javac jar; do
|
||||
[[ -x "$JAVA_HOME/bin/$tool" ]] || die "JAVA_HOME 中缺少 bin/$tool"
|
||||
done
|
||||
JAVA_VERSION="$("$JAVA_HOME/bin/javac" -version 2>&1)"
|
||||
[[ "$JAVA_VERSION" == 'javac 1.8.'* ]] || die "必须使用 JDK 8,当前为 $JAVA_VERSION"
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
command -v podman >/dev/null 2>&1 || die '找不到 podman'
|
||||
|
||||
if [[ -f mvnw && -f .mvn/wrapper/maven-wrapper.properties && -f .mvn/wrapper/maven-wrapper.jar ]]; then
|
||||
MAVEN=(bash ./mvnw)
|
||||
else
|
||||
command -v mvn >/dev/null 2>&1 || die 'Maven Wrapper 不完整,请安装 Maven 3(支持 JDK 8)'
|
||||
MAVEN=(mvn)
|
||||
fi
|
||||
|
||||
mkdir -p -- "$REPOSITORY"
|
||||
REPOSITORY="$(cd -- "$REPOSITORY" && pwd)"
|
||||
printf 'Maven 缓存:%s\n镜像:%s\n' "$REPOSITORY" "$IMAGE"
|
||||
"${MAVEN[@]}" "-Dmaven.repo.local=$REPOSITORY" -DskipTests package
|
||||
|
||||
[[ -f "$JAR_FILE" ]] || die "未生成 $JAR_FILE;若修改项目版本,请同步更新脚本中的 JAR_FILE"
|
||||
# 先完整读取列表,避免 pipefail 下 grep 提前退出造成误报。
|
||||
JAR_CONTENTS="$("$JAVA_HOME/bin/jar" tf "$JAR_FILE")"
|
||||
if ! grep -E '^BOOT-INF/lib/postgresql-[^/]+\.jar$' <<< "$JAR_CONTENTS"; then
|
||||
die '应用 JAR 中缺少 PostgreSQL JDBC 驱动,停止镜像构建'
|
||||
fi
|
||||
|
||||
# Dockerfile 内嵌,通过标准输入传给 Podman,无需单独维护文件。
|
||||
podman build --pull=always \
|
||||
-f - \
|
||||
--build-arg "JAR_FILE=$JAR_FILE" \
|
||||
-t "$IMAGE" \
|
||||
. <<'DOCKERFILE'
|
||||
FROM docker.io/library/eclipse-temurin:8-jre-jammy
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
|
||||
&& echo 'Asia/Shanghai' > /etc/timezone
|
||||
|
||||
EXPOSE 8080
|
||||
ARG JAR_FILE
|
||||
COPY ${JAR_FILE} /usr/local/adminapi/myapp.jar
|
||||
ENTRYPOINT ["java", "-jar", "/usr/local/adminapi/myapp.jar"]
|
||||
DOCKERFILE
|
||||
printf '构建完成:%s\n' "$IMAGE"
|
||||
@@ -0,0 +1,26 @@
|
||||
# Podman 测试镜像构建
|
||||
|
||||
在 `admin-api` 目录执行,先把 `JAVA_HOME` 设置为本机 **JDK 8** 路径:
|
||||
|
||||
```bash
|
||||
export JAVA_HOME=/path/to/jdk8
|
||||
./build.sh -t localhost/admin-api:1.2.1-pg-test
|
||||
```
|
||||
|
||||
- Maven 依赖、插件及其元数据默认缓存到 **`../chengdu-repository`**,以脚本所在的项目目录为基准,不受调用位置影响,也不修改全局 Maven 配置。
|
||||
- 等效 Maven 参数是 `-Dmaven.repo.local=/absolute/path/to/chengdu-repository`。可以用 `./build.sh -r /other/repository -t localhost/admin-api:1.2.1-pg-test` 覆盖目录。
|
||||
- 应用构建产物仍是 `target/admin-api-1.2.1-SNAPSHOT.jar`,不会放进依赖缓存目录。修改项目版本后需同步脚本中的 `JAR_FILE`。
|
||||
- 镜像默认名为 `localhost/admin-api:1.2.1-pg-test`;`-t` 指定完整镜像名和 tag,**不会自动读取 Maven 版本**。
|
||||
- 使用完整 Maven Wrapper;仓库当前 Wrapper 不完整时回退到本机 `mvn`,请使用支持 JDK 8 的 Maven 3。
|
||||
- 编译使用 `package -DskipTests`,成功后检查 `BOOT-INF/lib/postgresql-*.jar`;驱动缺失立即停止。
|
||||
- 编译、驱动检查和镜像构建统一由 `build.sh` 完成,Dockerfile 内嵌在脚本中,通过标准输入传给 Podman,无需单独的 `Dockerfile.podman`。基础镜像为公开的 `docker.io/library/eclipse-temurin:8-jre-jammy`。`--pull=always` 强制从仓库拉取基础镜像,不依赖预先存在的本地镜像,也不访问旧私有镜像仓库;构建机器需能访问 Docker Hub 和配置的 Maven 仓库。
|
||||
- 原 `Dockerfile` 保留不变,仍属于旧的私有镜像构建流程。
|
||||
- 脚本只构建,不推送、不启动容器;中间件 Compose 不会自动启动此 API。加入 PostgreSQL 驱动不等于切换数据源,数据库配置和 SQL 兼容性仍需单独验证。
|
||||
|
||||
只编译、不构建镜像时:
|
||||
|
||||
```bash
|
||||
mvn -Dmaven.repo.local="$(pwd)/../chengdu-repository" package -DskipTests
|
||||
```
|
||||
|
||||
参考:[Temurin 官方镜像](https://hub.docker.com/_/eclipse-temurin)、[PostgreSQL JDBC 下载与 Java 兼容性](https://jdbc.postgresql.org/download/)。
|
||||
@@ -42,6 +42,13 @@
|
||||
<artifactId>spring-boot-starter-jdbc</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.7.9</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
|
||||
Reference in New Issue
Block a user