summaryrefslogtreecommitdiff
path: root/x
blob: b9495b6ae7f7ddb73eb20bfdbdf732398b715944 (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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#!/usr/bin/env bash

set -e

DC_PAPER="docker compose -f docker/paper/compose.yaml"
DC_VELOCITY="docker compose -f docker/velocity/compose.yaml"
DC_FOLIA="docker compose -f docker/folia/compose.yaml"

GRADLE_EXTRA_ARGS=""

# compose 側に値を複製すると Renovate の依存更新と乖離するため、
# デバッグ環境のサーバーバージョンは build.gradle.kts を単一の情報源として導出する。
# compose は未設定時に停止するので、全アクションの前に export しておく必要がある。
derive_server_versions() {
    local paper_coord velocity_coord

    paper_coord=$(grep -oE 'paper-api:[0-9.]+\.build\.[0-9]+' platform-paper/build.gradle.kts | head -1)
    if [[ -z "$paper_coord" ]]; then
        echo "Error: could not derive paper-api version from platform-paper/build.gradle.kts" >&2
        exit 1
    fi
    paper_coord=${paper_coord#paper-api:}
    PAPER_BUILD=${paper_coord##*.build.}
    PAPER_MC_VERSION=${paper_coord%%.build.*}

    velocity_coord=$(grep -oE 'velocity-api:[0-9.]+' platform-velocity/build.gradle.kts | head -1)
    if [[ -z "$velocity_coord" ]]; then
        echo "Error: could not derive velocity-api version from platform-velocity/build.gradle.kts" >&2
        exit 1
    fi
    VELOCITY_VERSION=${velocity_coord#velocity-api:}

    export PAPER_MC_VERSION PAPER_BUILD VELOCITY_VERSION
}

derive_server_versions

help() {
    cat <<EOF
Usage: ./x <action> <platform> [--stable]

Actions:
    start       Build and start containers
    stop        Stop containers
    log         Show container logs
    clean       Stop containers and remove volumes
    rcon        Open rcon-cli console (velocity: ./x rcon velocity [s1|s2])
    help        Show this help message

Platforms:
    paper       Single Paper server (localhost:25565)
    velocity    Velocity proxy + Paper s1 & s2 (localhost:25577)
    folia       Single Folia server (localhost:25565)

Options:
    --stable    Build as stable release (default: nightly)

Examples:
    ./x start paper             Build nightly and start Paper server
    ./x start velocity          Build nightly and start Velocity environment
    ./x start folia             Build nightly and start Folia server
    ./x start paper --stable    Build stable and start Paper server
    ./x log velocity            Show Velocity environment logs
    ./x rcon paper              Open rcon-cli for Paper server
    ./x stop velocity           Stop Velocity environment
    ./x clean folia             Stop Folia and remove volumes

EOF
}

setup_nightly() {
    SHORT_HASH=$(git rev-parse --short HEAD)
    GRADLE_EXTRA_ARGS="-Pversion=1.0.0-nightly.${SHORT_HASH} -PisNightly=true"
    echo "==> Nightly build: 1.0.0-nightly.${SHORT_HASH}"
}

ensure_plugin_dir() {
    mkdir -p "$1"
}

# Parse --stable flag (only setup build for actions that need it)
ACTION="${1:-}"
PLATFORM="${2:-}"

if [[ "$ACTION" == "start" ]]; then
    STABLE=false
    for arg in "$@"; do
        if [[ "$arg" == "--stable" ]]; then
            STABLE=true
        fi
    done

    if [[ "$STABLE" == "false" ]]; then
        setup_nightly
    else
        echo "==> Stable build"
    fi
fi

# --- Actions per platform ---

do_start() {
    case "$1" in
        paper)
            ./gradlew :platform-paper:clean :platform-paper:shadowJar $GRADLE_EXTRA_ARGS
            ensure_plugin_dir docker/paper/plugins
            rm -f docker/paper/plugins/*.jar
            cp platform-paper/build/libs/*.jar docker/paper/plugins/
            $DC_PAPER up
            ;;
        velocity)
            ./gradlew :platform-paper:clean :platform-paper:shadowJar :platform-velocity:clean :platform-velocity:shadowJar $GRADLE_EXTRA_ARGS
            ensure_plugin_dir docker/velocity/plugins-paper-s1
            ensure_plugin_dir docker/velocity/plugins-paper-s2
            ensure_plugin_dir docker/velocity/plugins-velocity
            rm -f docker/velocity/plugins-paper-s1/*.jar
            rm -f docker/velocity/plugins-paper-s2/*.jar
            rm -f docker/velocity/plugins-velocity/*.jar
            cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s1/
            cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s2/
            cp platform-velocity/build/libs/*.jar docker/velocity/plugins-velocity/
            $DC_VELOCITY up
            ;;
        folia)
            ./gradlew :platform-paper:clean :platform-paper:shadowJar $GRADLE_EXTRA_ARGS
            ensure_plugin_dir docker/folia/plugins
            rm -f docker/folia/plugins/*.jar
            cp platform-paper/build/libs/*.jar docker/folia/plugins/
            $DC_FOLIA up
            ;;
        *)
            echo "Unknown platform: ${1:-}"
            echo ""
            help
            exit 1
            ;;
    esac
}

do_stop() {
    case "$1" in
        paper)    $DC_PAPER down ;;
        velocity) $DC_VELOCITY down ;;
        folia)    $DC_FOLIA down ;;
        *)        echo "Unknown platform: ${1:-}"; exit 1 ;;
    esac
}

do_log() {
    case "$1" in
        paper)    $DC_PAPER logs -f paper ;;
        velocity) $DC_VELOCITY logs -f ;;
        folia)    $DC_FOLIA logs -f folia ;;
        *)        echo "Unknown platform: ${1:-}"; exit 1 ;;
    esac
}

do_clean() {
    case "$1" in
        paper)    $DC_PAPER down -v ;;
        velocity) $DC_VELOCITY down -v ;;
        folia)    $DC_FOLIA down -v ;;
        *)        echo "Unknown platform: ${1:-}"; exit 1 ;;
    esac
}

do_rcon() {
    case "$1" in
        paper)    $DC_PAPER exec paper rcon-cli ;;
        velocity)
            local server="${2:-s1}"
            if [[ "$server" != "s1" && "$server" != "s2" ]]; then
                echo "Error: Invalid server '$server'. Available: s1, s2"
                exit 1
            fi
            $DC_VELOCITY exec "$server" rcon-cli
            ;;
        folia)    $DC_FOLIA exec folia rcon-cli ;;
        *)        echo "Unknown platform: ${1:-}"; exit 1 ;;
    esac
}

# --- Main ---
case "$ACTION" in
    start) do_start "$PLATFORM" ;;
    stop)  do_stop "$PLATFORM" ;;
    log)   do_log "$PLATFORM" ;;
    clean) do_clean "$PLATFORM" ;;
    rcon)  do_rcon "$PLATFORM" "${3:-}" ;;
    help|"") help ;;
    *)
        echo "Unknown action: $ACTION"
        echo ""
        help
        exit 1
        ;;
esac