之前发过一个贴子描述如何获取MinecraftServer
的方式,这次打算结合下流水线把这个自动化起来,达到Mojang
什么时候发版,镜像就在相近的时间自动更新。
直接上配置
这个配置
每三天00:00执行一次
,通过Mojang
的版本JSON
确认最新版本
及地址
,通过比对上一次版本确认本次镜像打包,自动下载最新的server.jar
,随机生成RCON密码,利用Buildx
与QEMU
进行多平台镜像制作(amd64、arm64),最后让机器人将本次构建的版本数覆写到仓库中的last_built_version.txt
文件中。
name: Minecraft Docker Image CI
# 触发配置
on:
schedule:
- cron: '0 0 */3 * *'
workflow_dispatch:
inputs:
LATEST_VERSION:
description: '要构建的Minecraft版本;只打版本镜像且会跳过`检查版本是否更新`和`记录最后构建版本`步骤'
required: false
default: ''
type: string
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Step 1: 设置Docker Buildx
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
# Step 2: 为多平台构建安装QEMU
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
# Step 3: 登录Docker Hub
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Step 4: 获取最新的Minecraft版本信息
- name: Fetch Minecraft version info
id: version_info
run: |
# Minecraft版本信息地址
VERSION_MANIFEST_URL="https://launchermeta.mojang.com/mc/game/version_manifest.json"
if [ -n "${{ github.event.inputs.LATEST_VERSION }}" ]; then
# 使用手动指定的版本
LATEST_VERSION=${{ github.event.inputs.LATEST_VERSION }}
VERSION_URL=$(curl -s $VERSION_MANIFEST_URL | jq -r --arg LATEST_VERSION "$LATEST_VERSION" '.versions[] | select(.id==$LATEST_VERSION and .type=="release") | .url')
echo "VERSION_URL=$VERSION_URL" >> $GITHUB_ENV
else
# 自动获取最新版本信息
LATEST_VERSION=$(curl -s $VERSION_MANIFEST_URL | jq -r '.versions[] | select(.type=="release") | .id' | head -n 1)
VERSION_URL=$(curl -s $VERSION_MANIFEST_URL | jq -r --arg LATEST_VERSION "$LATEST_VERSION" '.versions[] | select(.id==$LATEST_VERSION and .type=="release") | .url')
echo "VERSION_URL=$VERSION_URL" >> $GITHUB_ENV
fi
echo "LATEST_VERSION=$LATEST_VERSION" >> $GITHUB_ENV
# Step 5: 检查版本是否更新
- name: Check if version is updated
id: check_version
run: |
# 检查是否手动输入了 LATEST_VERSION
if [ -z "${{ github.event.inputs.LATEST_VERSION }}" ]; then
# 尝试从`last_built_version.txt`中获取版本号
if [ -f last_built_version.txt ]; then
LAST_BUILT_VERSION=$(cat last_built_version.txt)
else
LAST_BUILT_VERSION="none"
fi
# 检查是否需要继续构建
if [ "$LAST_BUILT_VERSION" = "none" ]; then
# 没有旧版本时继续构建
echo "BUILD_NEEDED=true" >> $GITHUB_ENV
elif [ "$LATEST_VERSION" \> "$LAST_BUILT_VERSION" ]; then
# 如果新版本大于旧版本则继续构建
echo "BUILD_NEEDED=true" >> $GITHUB_ENV
else
# 如果新版本不大于旧版本则跳过构建
echo "BUILD_NEEDED=false" >> $GITHUB_ENV
fi
else
# 手动输入版本则直接构建
echo "BUILD_NEEDED=true" >> $GITHUB_ENV
fi
# Step 6: 获取server.jar下载URL
- name: Fetch server.jar download URL
id: server_download_url
if: env.BUILD_NEEDED == 'true'
run: |
SERVER_URL=$(curl -s $VERSION_URL | jq -r '.downloads.server.url')
echo "SERVER_URL=$SERVER_URL" >> $GITHUB_ENV
# Step 7: 下载 server.jar
- name: Download server.jar
if: env.BUILD_NEEDED == 'true'
run: |
curl -fSL -o server.jar "$SERVER_URL"
# Step 8: 生成随机RCON密码
- name: Generate random RCON password
if: env.BUILD_NEEDED == 'true'
id: generate_password
run: |
RCON_PASSWORD=$(openssl rand -base64 30 | tr -dc 'A-Za-z0-9' | head -c 30)
echo "RCON_PASSWORD=$RCON_PASSWORD" >> $GITHUB_ENV
# Step 9: 将随机生成的密码写入 server.properties
- name: Update server.properties with RCON password
if: env.BUILD_NEEDED == 'true'
run: |
sed -i '/^rcon.password=/c\rcon.password=${{ env.RCON_PASSWORD }}' server.properties
# Step 10: 准备 Docker 镜像标签
- name: Prepare Docker tags
id: prepare_tags
if: env.BUILD_NEEDED == 'true'
run: |
if [ -n "${{ github.event.inputs.LATEST_VERSION }}" ]; then
echo "TAGS=fc6a1b03/minecraft-server:${{ github.event.inputs.LATEST_VERSION }}" >> $GITHUB_ENV
else
echo "TAGS=fc6a1b03/minecraft-server:latest,fc6a1b03/minecraft-server:${{ env.LATEST_VERSION }}" >> $GITHUB_ENV
fi
# Step 11: 为多种架构构建和推送Docker镜像
- name: Build and push Docker image
if: env.BUILD_NEEDED == 'true'
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ env.TAGS }}
platforms: linux/amd64,linux/arm64
# Step 12: 更新记录的最后构建版本
- name: Update last built version
if: env.BUILD_NEEDED == 'true' && github.event.inputs.LATEST_VERSION == ''
run: |
echo $LATEST_VERSION > last_built_version.txt
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions[bot]"
git add last_built_version.txt
git commit -m "Update last built version to $LATEST_VERSION"
git push --force
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
最后在DockerHub上看到的效果就是这样的
这个配置最晚不过低于三天的Mojang
版本,每次需要新版本只需要docker pull fc6a1b03/minecraft-server
即可,需要任意版本可以输入特定的版本号拉取即可。
对于Dockerfile
、server.properties
可前往仓库地址查阅。由于jvm
是针对2C2G
机器的(主要用于几个小伙伴的玩耍),如果需要修改可以Fork
自定义一下自行发版即可。
内容中提到的Actions
配置可以利用到其他应用自动化中,可以算非常方便的了。如果对大家有帮助,可以点个赞,感谢~