分享一个利用Actions发版MinecraftServer的操作

之前发过一个贴子描述如何获取MinecraftServer的方式,这次打算结合下流水线把这个自动化起来,达到Mojang什么时候发版,镜像就在相近的时间自动更新。

直接上配置

这个配置每三天00:00执行一次,通过Mojang的版本JSON确认最新版本地址,通过比对上一次版本确认本次镜像打包,自动下载最新的server.jar,随机生成RCON密码,利用BuildxQEMU进行多平台镜像制作(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即可,需要任意版本可以输入特定的版本号拉取即可。

对于Dockerfileserver.properties可前往仓库地址查阅。由于jvm是针对2C2G机器的(主要用于几个小伙伴的玩耍),如果需要修改可以Fork自定义一下自行发版即可。

内容中提到的Actions配置可以利用到其他应用自动化中,可以算非常方便的了。如果对大家有帮助,可以点个赞,感谢~

6 个赞

我还以为是openai gpts的actions

感谢大佬教程

我还以为靠action能开个服(

1 个赞

确实可以,这个镜像推到仓库之后,只需要加个步骤通知下k8s滚动更新就行。

#Minecraft添加