aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/docker-nightly.yml
blob: 78d5256cba8673aebe1369b615118621e3c2436d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
name: Docker Nightly Dedicated Server

on:
  workflow_dispatch:
  push:
    branches:
    - "main"
    - 'feature/dedicated-server'
    paths-ignore:
      - ".gitignore"
      - "*.md"
      - ".github/*.md"

permissions:
  contents: read
  packages: write

concurrency:
  group: docker-nightly-dedicated-server
  cancel-in-progress: true

jobs:
  build-runtime:
    name: Build Dedicated Server Runtime
    runs-on: windows-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v6

    - name: Setup msbuild
      uses: microsoft/setup-msbuild@v2

    - name: Build Dedicated Server Runtime Only
      shell: pwsh
      run: |
        MSBuild.exe Minecraft.World\Minecraft.World.vcxproj /p:Configuration=Release /p:Platform=x64 /m
        MSBuild.exe Minecraft.Server\Minecraft.Server.vcxproj /p:Configuration=Release /p:Platform=x64 /m

    - name: Stage dedicated server runtime
      shell: pwsh
      run: |
        $serverOut = "Minecraft.Server/x64/Minecraft.Server/Release"
        $stage = ".artifacts/dedicated-server-runtime"

        if (Test-Path $stage) {
          Remove-Item -Path $stage -Recurse -Force
        }

        New-Item -ItemType Directory -Path (Join-Path $stage "Windows64") -Force | Out-Null

        # Minimum required runtime files
        $required = @(
          "Minecraft.Server.exe",
          "iggy_w64.dll",
          "Common"
        )

        foreach ($entry in $required) {
          $src = Join-Path $serverOut $entry
          if (-not (Test-Path $src)) {
            throw "Missing required runtime path: $src"
          }
        }

        # Copy required files
        Copy-Item -Path (Join-Path $serverOut "Minecraft.Server.exe") -Destination (Join-Path $stage "Minecraft.Server.exe") -Force
        Copy-Item -Path (Join-Path $serverOut "iggy_w64.dll") -Destination (Join-Path $stage "iggy_w64.dll") -Force
        Copy-Item -Path (Join-Path $serverOut "Common") -Destination (Join-Path $stage "Common") -Recurse -Force
        if (Test-Path (Join-Path $serverOut "Windows64")) {
          Copy-Item -Path (Join-Path $serverOut "Windows64/*") -Destination (Join-Path $stage "Windows64") -Recurse -Force
        } else {
          Write-Host "Windows64 directory is not present in build output; staging without it."
        }

        Get-ChildItem -Path $stage -Recurse -File | Select-Object -First 20 | ForEach-Object {
          Write-Host "Staged: $($_.FullName)"
        }

    - name: Upload dedicated server runtime to artifacts
      uses: actions/upload-artifact@v4
      with:
        name: dedicated-server-runtime
        if-no-files-found: error
        path: |
          .artifacts/dedicated-server-runtime/**

  docker-publish:
    name: Build and Push Docker Image
    runs-on: ubuntu-latest
    needs: build-runtime

    steps:
    - name: Checkout
      uses: actions/checkout@v6

    - name: Download dedicated server runtime from artifacts
      uses: actions/download-artifact@v4
      with:
        name: dedicated-server-runtime
        path: .artifacts/runtime

    - name: Prepare Docker runtime directory
      shell: bash
      run: |
        set -euo pipefail

        rm -rf runtime
        mkdir -p runtime
        cp .artifacts/runtime/Minecraft.Server.exe runtime/Minecraft.Server.exe
        cp .artifacts/runtime/iggy_w64.dll runtime/iggy_w64.dll
        cp -R .artifacts/runtime/Common runtime/Common
        mkdir -p runtime/Windows64
        if [[ -d ".artifacts/runtime/Windows64" ]]; then
          cp -R .artifacts/runtime/Windows64/. runtime/Windows64/
        fi

        test -f runtime/Minecraft.Server.exe
        test -f runtime/iggy_w64.dll
        test -d runtime/Common
        test -d runtime/Windows64

    - name: Compute image name
      id: image
      shell: bash
      run: |
        owner="$(echo "${{ vars.CONTAINER_REGISTRY_OWNER || github.repository_owner }}" | tr '[:upper:]' '[:lower:]')"
        image_tag="nightly"
        # if [[ "${{ github.ref }}" != "refs/heads/main" ]]; then
        #   image_tag="nightly-test"
        # fi
        echo "owner=$owner" >> "$GITHUB_OUTPUT"
        echo "image=ghcr.io/$owner/minecraft-lce-dedicated-server" >> "$GITHUB_OUTPUT"
        echo "image_tag=$image_tag" >> "$GITHUB_OUTPUT"

    - name: Extract Docker metadata
      id: meta
      uses: docker/metadata-action@v5
      with:
        images: ${{ steps.image.outputs.image }}
        tags: |
          type=raw,value=${{ steps.image.outputs.image_tag }}

    - name: Login to GHCR
      uses: docker/login-action@v3
      with:
        registry: ghcr.io
        username: ${{ secrets.GHCR_USERNAME || github.actor }}
        password: ${{ secrets.GHCR_TOKEN || secrets.GITHUB_TOKEN }}

    - name: Build and push image
      uses: docker/build-push-action@v6
      with:
        context: .
        file: docker/dedicated-server/Dockerfile
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        build-args: |
          MC_RUNTIME_DIR=runtime