191 lines
6.7 KiB
Go
191 lines
6.7 KiB
Go
name: Epic Go Build & Deploy
|
||
run-name: ${{ gitea.actor }} 正在构建 Epic Go 项目 🚀
|
||
on:
|
||
push:
|
||
branches: [ main, master, develop ]
|
||
pull_request:
|
||
branches: [ main, master ]
|
||
|
||
jobs:
|
||
build:
|
||
runs-on: gitea_labels
|
||
container:
|
||
image: gitea-ci-bash:latest
|
||
steps:
|
||
- name: 检出代码
|
||
run: |
|
||
echo "📥 检出代码到工作目录..."
|
||
echo "当前目录: $(pwd)"
|
||
echo "仓库: ${{ gitea.repository }}"
|
||
echo "分支: ${{ gitea.ref }}"
|
||
echo "提交: ${{ gitea.sha }}"
|
||
|
||
# 解析分支名
|
||
BRANCH_NAME=$(echo "${{ gitea.ref }}" | sed 's#refs/heads/##')
|
||
|
||
# 拉取代码(使用token鉴权)
|
||
git clone --depth=1 -b "$BRANCH_NAME" "http://1c18ee1ab9a9cb291506d0c5c016a33be7d59e8c:x-oauth-basic@gitea.htoop.cn/${{ gitea.repository }}.git" .
|
||
if [ $? -ne 0 ]; then
|
||
echo "❌ 代码检出失败1"
|
||
exit 1
|
||
fi
|
||
|
||
# 校验分支
|
||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||
if [ "$CURRENT_BRANCH" != "$BRANCH_NAME" ]; then
|
||
echo "❌ 检出分支与预期不符: $CURRENT_BRANCH != $BRANCH_NAME"
|
||
exit 1
|
||
fi
|
||
|
||
# 校验提交
|
||
CURRENT_COMMIT=$(git rev-parse HEAD)
|
||
if [ -n "${{ gitea.sha }}" ] && [ "$CURRENT_COMMIT" != "${{ gitea.sha }}" ]; then
|
||
echo "❌ 检出提交与预期不符: $CURRENT_COMMIT != ${{ gitea.sha }}"
|
||
exit 1
|
||
fi
|
||
|
||
echo "✅ 代码检出成功,分支和提交校验通过"
|
||
ls -la
|
||
|
||
- name: 安装Go环境
|
||
run: |
|
||
echo "🔧 安装Go 1.22环境..."
|
||
if [ -x /usr/local/go/bin/go ]; then
|
||
echo "✅ Go已安装: $(/usr/local/go/bin/go version)"
|
||
export PATH=$PATH:/usr/local/go/bin
|
||
else
|
||
echo "📥 下载并安装Go..."
|
||
GO_VERSION="1.22.0"
|
||
GO_ARCH="linux-amd64"
|
||
MIRRORS=(
|
||
"https://mirrors.aliyun.com/golang/go${GO_VERSION}.${GO_ARCH}.tar.gz"
|
||
"https://mirrors.huaweicloud.com/golang/go${GO_VERSION}.${GO_ARCH}.tar.gz"
|
||
"https://mirrors.tencent.com/go/go${GO_VERSION}.${GO_ARCH}.tar.gz"
|
||
"https://go.dev/dl/go${GO_VERSION}.${GO_ARCH}.tar.gz"
|
||
)
|
||
DOWNLOAD_SUCCESS=false
|
||
for mirror in "${MIRRORS[@]}"; do
|
||
echo "尝试从镜像下载: $mirror"
|
||
if wget -q --timeout=30 --tries=3 "$mirror" -O go.tar.gz; then
|
||
echo "✅ 下载成功: $mirror"
|
||
DOWNLOAD_SUCCESS=true
|
||
break
|
||
else
|
||
echo "❌ 下载失败: $mirror"
|
||
continue
|
||
fi
|
||
done
|
||
if [ "$DOWNLOAD_SUCCESS" = false ]; then
|
||
echo "❌ 所有镜像源下载失败"
|
||
exit 1
|
||
fi
|
||
echo "解压Go到/usr/local..."
|
||
tar -C /usr/local -xzf go.tar.gz
|
||
export PATH=$PATH:/usr/local/go/bin
|
||
export GOROOT=/usr/local/go
|
||
export GOPATH=$HOME/go
|
||
echo "验证Go安装..."
|
||
/usr/local/go/bin/go version
|
||
rm go.tar.gz
|
||
echo "✅ Go安装完成"
|
||
fi
|
||
|
||
- name: 检查Go环境
|
||
run: |
|
||
echo "🔍 检查Go环境..."
|
||
export PATH=$PATH:/usr/local/go/bin
|
||
go version
|
||
go env GOPATH
|
||
go env GOROOT
|
||
|
||
- name: 下载依赖
|
||
run: |
|
||
echo "📦 下载Go模块依赖..."
|
||
export PATH=$PATH:/usr/local/go/bin
|
||
echo "当前工作目录: $(pwd)"
|
||
echo "目录内容:"
|
||
ls -la
|
||
if [ -f "go.mod" ]; then
|
||
echo "✅ 找到go.mod文件"
|
||
cat go.mod | head -5
|
||
else
|
||
echo "❌ 未找到go.mod文件"
|
||
exit 1
|
||
fi
|
||
export GO111MODULE=on
|
||
export GOPROXY=https://goproxy.cn,direct
|
||
echo "Go环境变量:"
|
||
echo "GOPROXY: $GOPROXY"
|
||
echo "GO111MODULE: $GO111MODULE"
|
||
go mod download
|
||
echo "✅ 依赖下载完成"
|
||
echo "已下载的模块:"
|
||
go list -m all | head -10
|
||
|
||
- name: 验证依赖
|
||
run: |
|
||
echo "🔍 验证Go模块..."
|
||
export PATH=$PATH:/usr/local/go/bin
|
||
go mod verify
|
||
echo "✅ 模块验证完成"
|
||
|
||
- name: 构建项目
|
||
run: |
|
||
echo "🔨 开始构建 Epic Go 项目..."
|
||
export PATH=$PATH:/usr/local/go/bin
|
||
go build -v -o epic-game-service main.go
|
||
echo "✅ 构建完成"
|
||
|
||
- name: 检查构建产物
|
||
run: |
|
||
echo "📦 构建产物信息:"
|
||
ls -la epic-game-service
|
||
echo "文件大小: $(du -h epic-game-service | cut -f1)"
|
||
|
||
- name: 显示项目信息
|
||
run: |
|
||
echo "📋 项目信息:"
|
||
export PATH=$PATH:/usr/local/go/bin
|
||
echo "Go 版本: $(go version)"
|
||
echo "模块名称: $(go list -m)"
|
||
echo "构建时间: $(date)"
|
||
echo "分支: ${{ gitea.ref }}"
|
||
echo "提交: ${{ gitea.sha }}"
|
||
|
||
- name: 准备部署
|
||
run: |
|
||
echo "🚀 准备部署..."
|
||
echo "运行器操作系统: ${{ runner.os }}"
|
||
echo "工作目录: ${{ gitea.workspace }}"
|
||
echo "任务状态: ${{ job.status }}"
|
||
mkdir -p deploy
|
||
cp epic-game-service deploy/
|
||
cp -r manifest deploy/
|
||
echo "📦 部署包已准备完成"
|
||
|
||
- name: 复制构建产物到目标目录并重命名
|
||
run: |
|
||
echo "📤 复制构建产物到 /opt/dockeropt/epic-go 并重命名为 main ..."
|
||
mkdir -p /opt/dockeropt/epic-go
|
||
cp epic-game-service /opt/dockeropt/epic-go/main
|
||
echo "✅ 构建产物已复制并重命名为 /opt/dockeropt/epic-go/main"
|
||
ls -l /opt/dockeropt/epic-go
|
||
- name: 重启 Docker 容器
|
||
run: |
|
||
echo "♻️ 重启 epic-go 容器..."
|
||
# 自动安装 docker CLI,优先用国内源
|
||
if command -v docker &> /dev/null; then
|
||
echo "docker 已安装: $(docker --version)"
|
||
elif command -v apt-get &> /dev/null; then
|
||
apt-get update && apt-get install -y docker.io
|
||
elif command -v apk &> /dev/null; then
|
||
echo "http://mirrors.aliyun.com/alpine/v3.20/main" > /etc/apk/repositories
|
||
echo "http://mirrors.aliyun.com/alpine/v3.20/community" >> /etc/apk/repositories
|
||
apk update
|
||
apk add --no-cache docker-cli
|
||
elif command -v yum &> /dev/null; then
|
||
yum install -y docker
|
||
fi
|
||
docker ps -a
|
||
docker restart epic-go
|
||
echo "✅ epic-go 容器已重启" |