最近也有负责了一些运维部署的工作,每次发包都比较麻烦,编写了一个自动化脚本
大概思路是从 github 上拉取对应分支代码到本地,本地编译,复制拷贝到目标目录,启动执行
注意最后要赋予文件可执行权限
| #!/bin/bash |
| |
| # Prompt user for environment |
| echo "Enter environment (dev, test, or prod): " |
| read ACTIVE |
| |
| # Check if the input is valid |
| if [ "$ACTIVE" != "dev" ] && [ "$ACTIVE" != "test" ] && [ "$ACTIVE" != "prod" ]; then |
| echo "Invalid environment choice. Exiting." |
| exit 1 |
| fi |
| |
| # Prompt user for Git branch |
| echo "Enter Git branch name: " |
| read BRANCH |
| |
| BASE_PATH="/opt/watchx/$ACTIVE" |
| JAR_FILE="aaa-0.0.1-SNAPSHOT.jar" # JAR 文件路径 |
| PID_FILE="pid" # PID 文件路径 |
| REPO_PATH="/opt/code_repo/aaa" # Git 仓库路径 |
| |
| # 如果仓库目录存在,先删除它 |
| if [ -d "$REPO_PATH" ]; then |
| rm -rf "$REPO_PATH" |
| echo "Deleted existing repository directory: $REPO_PATH" |
| fi |
| |
| # 克隆新的仓库到指定目录 需要修改 |
| GIT_URL="https://${GITHUB_PAT}@github.com/path1/code.git" |
| git clone "$GIT_URL" "$REPO_PATH" |
| |
| |
| # 移动到 Git 仓库目录 |
| cd "$REPO_PATH" || exit 1 |
| |
| # 检查分支是否存在 |
| if ! git ls-remote --heads origin "$BRANCH" | grep -q "$BRANCH"; then |
| echo "Branch '$BRANCH' does not exist. Exiting." |
| exit 1 |
| fi |
| |
| # 拉取指定分支并更新代码 |
| git fetch origin |
| git checkout "$BRANCH" |
| git pull origin "$BRANCH" |
| |
| # 执行 Maven 打包,跳过测试 |
| mvn clean package -Dmaven.test.skip=true |
| |
| # 备份原来的 JAR 文件 |
| if [ -f "$BASE_PATH/$JAR_FILE" ]; then |
| TIMESTAMP=$(date +"%Y%m%d%H%M%S") |
| mv "$BASE_PATH/$JAR_FILE" "$BASE_PATH/$JAR_FILE.bak.$TIMESTAMP" |
| echo "Backup original JAR file to $BASE_PATH/$JAR_FILE.bak.$TIMESTAMP" |
| fi |
| |
| # 拷贝新的 JAR 文件到目标目录 |
| cp "$REPO_PATH/target/$JAR_FILE" "$BASE_PATH/" |
| echo "Copied new JAR file to $BASE_PATH/$JAR_FILE" |
| |
| # 移动到目标目录 |
| cd "$BASE_PATH" || exit 1 |
| |
| # 检查 PID 文件是否存在 |
| if [ -f "$PID_FILE" ]; then |
| # 读取 PID |
| PID=$(cat "$PID_FILE") |
| if [ -n "$PID" ] && [ -d "/proc/$PID" ]; then |
| echo "Killing existing process with PID: $PID" |
| kill "$PID" |
| sleep 5 # 等待进程终止 |
| # 再次检查进程是否已终止 |
| if [ -d "/proc/$PID" ]; then |
| echo "Process $PID did not terminate. Forcing termination." |
| kill -9 "$PID" |
| fi |
| fi |
| fi |
| |
| # 启动新的进程 |
| echo "Starting new Java process" |
| nohup java -Xms4g -Xmx4g -Dspring.profiles.active="$ACTIVE" -jar "$JAR_FILE" > cccc.log 2>&1 & |
| |
| # 获取新进程的 PID |
| NEW_PID=$! |
| echo "New process PID: $NEW_PID" |
| |
| # 将新进程的 PID 写入 PID 文件 |
| echo "$NEW_PID" > "$PID_FILE" |
| echo "PID saved to $PID_FILE" |
| |
| tail -1000f cccc.log |
| |
| 这是一段防爬代码块,我不介意文章被爬取,但请注明出处 |
| console.log("作者主页:https://www.cnblogs.com/Go-Solo"); |
| console.log("原文地址:https://www.cnblogs.com/Go-Solo/p/18329650"); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库