11local fs = require ("@lune/fs" )
2+ local roblox = require ("@lune/roblox" )
23local serde = require ("@lune/serde" )
34
5+ local executeLuauTask = require ("@root/cloud/executeLuauTask" )
46local logging = require ("@root/logging" )
57local run = require ("@root/lib/run" )
68
79local TEMP_DIR = "temp"
8- local TASK_PATH = `{TEMP_DIR }/task.luau`
9- local ROJO_PROJECT_PATH = `{TEMP_DIR }/default.project.json`
10- local BUILD_PATH = `{TEMP_DIR }/build.rbxl`
11-
12- local function extractVariablesFromOutput (output : string )
13- local result : { [string ]: string } = {}
14- for key , value in output :gmatch ("([%u_]+)=([%d%w]+)" ) do
15- if key and value then
16- value = value :gsub ("(%s+)?.*(%s+)?" , "" )
17- result [key ] = value
18- end
19- end
2010
21- return result
11+ local function buildLuauExecutionRobloxPlace (outputPath : string ): string
12+ local rojoProjectPath = `{outputPath }/default.project.json`
13+ local placePath = `{outputPath }/build.rbxl`
14+
15+ logging .info ("creating Rojo project" )
16+ local rojoProject = {
17+ name = "LuauExecutionPlace" ,
18+ tree = {
19+ ["$className" ] = "DataModel" ,
20+ },
21+ }
22+
23+ fs .writeFile (rojoProjectPath , serde .encode ("json" , rojoProject ))
24+
25+ run ("rojo" , { "build" , rojoProjectPath , "-o" , placePath })
26+
27+ return placePath
2228end
2329
2430local function runLuauTask (
25- taskBody : string ,
31+ scriptContent : string ,
2632 globals : {
2733 [string ]: string | number | boolean ,
2834 },
@@ -35,50 +41,34 @@ local function runLuauTask(
3541)
3642 run ("rm" , { "-rf" , TEMP_DIR })
3743
38- if not fs .isDir ("temp" ) then
39- fs .writeDir ("temp" )
44+ if not fs .isDir (TEMP_DIR ) then
45+ fs .writeDir (TEMP_DIR )
4046 end
41- fs .writeFile (TASK_PATH , taskBody )
4247
43- logging .info ("creating Rojo project" )
44- local rojoProject = {
45- name = "Build" ,
46- tree = {
47- ["$className" ] = "DataModel" ,
48- ReplicatedStorage = {
49- Build = if runnerContext .modelPath
50- then {
51- ["$path" ] = runnerContext .modelPath ,
52- }
53- else nil ,
54- },
55- },
56- }
57- fs .writeFile (ROJO_PROJECT_PATH , serde .encode ("json" , rojoProject ))
48+ local placePath = buildLuauExecutionRobloxPlace (TEMP_DIR )
5849
59- run ("rojo" , { "build" , ROJO_PROJECT_PATH , "-o" , BUILD_PATH })
50+ if runnerContext .modelPath then
51+ local game = roblox .deserializePlace (fs .readFile (placePath ))
52+ local root = roblox .deserializeModel (fs .readFile (runnerContext .modelPath ))
53+ for _ , child in root do
54+ child .Parent = game :GetService ("ReplicatedStorage" )
55+ logging .debug (`parented {child } to ReplicatedStorage` )
56+ end
57+ fs .writeFile (placePath , roblox .serializePlace (game ))
58+ end
6059
6160 logging .info ("substituting globals" , globals )
6261
6362 for global , value in globals do
64- run ( "sed" , { "-i" , "-e" , `'s/ = _G.{global }/ = "{value }"/g'` , TASK_PATH } )
63+ scriptContent = scriptContent : gsub ( ` = _G.{global }` , ` = "{value }"` )
6564 end
6665
67- local output = run ("python3" , {
68- "src/python/upload_and_run_task.py" ,
69- BUILD_PATH ,
70- TASK_PATH ,
71- }, {
72- env = {
73- ROBLOX_CI_UNIVERSE_ID = runnerContext .universeId ,
74- ROBLOX_CI_PLACE_ID = runnerContext .placeId ,
75- ROBLOX_API_KEY = runnerContext .apiKey ,
76- },
77- })
66+ local variables =
67+ executeLuauTask (placePath , scriptContent , runnerContext .universeId , runnerContext .placeId , runnerContext .apiKey )
7868
7969 run ("rm" , { "-rf" , TEMP_DIR })
8070
81- return extractVariablesFromOutput ( output )
71+ return variables
8272end
8373
8474return runLuauTask
0 commit comments