Skip to content

Commit 8e9cb2e

Browse files
authored
feat: support serving (tensorchord#1228)
* init base and install Signed-off-by: Keming <[email protected]> * wip Signed-off-by: Keming <[email protected]> * fix build Signed-off-by: Keming <[email protected]> * work for dev Signed-off-by: Keming <[email protected]> * change cuda to a image+cuda+cudnn match Signed-off-by: Keming <[email protected]> * install python without conda Signed-off-by: Keming <[email protected]> * add cert Signed-off-by: Keming <[email protected]> * fix PATH when dev is false Signed-off-by: Keming <[email protected]> * use python without absolute path Signed-off-by: Keming <[email protected]> * install conda with multi stage build Signed-off-by: Keming <[email protected]> * support conda for non-dev env Signed-off-by: Keming <[email protected]> * support mamba, fix sudo group and user directory llb Signed-off-by: Keming <[email protected]> * fix mamba, really buggy Signed-off-by: Keming <[email protected]> * algin py default version Signed-off-by: Keming <[email protected]> * fix mount for dev Signed-off-by: Keming <[email protected]> * fix vscode merge Signed-off-by: Keming <[email protected]> * fix user group bug Signed-off-by: Keming <[email protected]> * use curl image to replace buildpack curl Signed-off-by: Keming <[email protected]> * base(dev) Signed-off-by: Keming <[email protected]> * fix e2e test Signed-off-by: Keming <[email protected]> * fix e2e test and envd init Signed-off-by: Keming <[email protected]> * fix init test Signed-off-by: Keming <[email protected]> * fix e2e conda dev Signed-off-by: Keming <[email protected]> Signed-off-by: Keming <[email protected]>
1 parent d07813e commit 8e9cb2e

File tree

43 files changed

+490
-540
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+490
-540
lines changed

.vscode/launch.json

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
"request": "launch",
88
"mode": "exec",
99
"program": "${workspaceFolder}/debug-bin/envd",
10-
"cwd": "directory containing build.envd",
1110
"args": [
1211
"up"
1312
]
+3-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.conda()
4+
install.python()

e2e/cli/testdata/custom-image-test/build.envd

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
def build():
2-
base(language="python", image="python:3.9-slim")
2+
base(image="python:3.9-slim", dev=False)
33
install.python_packages(
44
name=[
55
"via",

e2e/cli/testdata/quick-start/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.python()
34
install.python_packages(
45
name=[
56
"numpy",

e2e/cli/testdata/up-test/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.python()
34
install.python_packages(
45
name=[
56
"via",

e2e/docs/testdata/complex/build.envd

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
def build():
2+
base(dev=True)
3+
install.conda()
4+
install.python()
25
config.apt_source(
36
source="""
47
deb https://mirror.sjtu.edu.cn/ubuntu focal main restricted
@@ -18,7 +21,6 @@ deb https://mirror.sjtu.edu.cn/ubuntu focal-security main restricted universe mu
1821
"ms-python.python",
1922
]
2023
)
21-
base(os="ubuntu20.04", language="python3")
2224
install.python_packages(
2325
name=[
2426
"numpy",

e2e/docs/testdata/envdlib/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ envdlib = include("https://github.com/tensorchord/envdlib")
22

33

44
def build():
5-
base(os="ubuntu20.04", language="python")
5+
base(dev=True)
6+
install.python()
67
envdlib.tensorboard(host_port=8888)

e2e/docs/testdata/getting_started/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.python()
34
# Configure pip index if needed.
45
# config.pip_index(url = "https://pypi.tuna.tsinghua.edu.cn/simple")
56
install.python_packages(

e2e/docs/testdata/jupyter/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.python()
34
install.python_packages(
45
name=[
56
"numpy",

e2e/docs/testdata/minimal/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.python()
34
install.python_packages(
45
name=[
56
"via",

e2e/language/testdata/python/conda/build.envd

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
def build():
2+
base(dev=True)
3+
install.conda()
4+
install.python()
25
install.conda_packages(env_file="env.yaml")
3-
base(os="ubuntu20.04", language="python3.8")

e2e/language/testdata/python/conda_channel/build.envd

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
def build():
2+
base(dev=True)
3+
install.conda()
4+
install.python()
25
config.conda_channel(
36
channel="""
47
channels:
@@ -7,4 +10,3 @@ channels:
710
"""
811
)
912
install.conda_packages(env_file="env.yaml")
10-
base(os="ubuntu20.04", language="python3.8")
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
def build():
2+
base(dev=True)
3+
install.python()
24
install.python_packages(name=["via"], requirements="requirements.txt")
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
def build():
2+
base(dev=True)
3+
install.python()
24
install.python_packages(name=["via"])
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
def build():
2+
base(dev=True)
3+
install.python()
24
install.python_packages(requirements="./requirements.txt")

e2e/language/testdata/run/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.python()
34
shell("zsh")
45
run(
56
commands=[

e2e/language/testdata/runtime/build.envd

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def build():
2-
base(os="ubuntu20.04", language="python3")
2+
base(dev=True)
3+
install.python()
34
install.python_packages(
45
name=[
56
"numpy",

pkg/app/init.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func NewPythonEnv(dir string) (*pythonEnv, error) {
107107
return nil, err
108108
}
109109
return &pythonEnv{
110-
pythonVersion: "python", // use the default one
110+
pythonVersion: "", // use the default one
111111
requirements: requirements,
112112
condaEnv: condaEnv,
113113
indent: " ",
@@ -118,7 +118,8 @@ func NewPythonEnv(dir string) (*pythonEnv, error) {
118118
func (pe *pythonEnv) generate() []byte {
119119
var buf bytes.Buffer
120120
buf.WriteString("def build():\n")
121-
buf.WriteString(fmt.Sprintf("%sbase(os=\"ubuntu20.04\", language=\"%s\")\n", pe.indent, pe.pythonVersion))
121+
buf.WriteString(fmt.Sprintf("%sbase(dev=True)\n", pe.indent))
122+
buf.WriteString(fmt.Sprintf("%sinstall.python(version=\"%s\")\n", pe.indent, pe.pythonVersion))
122123
if len(pe.requirements) > 0 {
123124
buf.WriteString(fmt.Sprintf("%sinstall.python_packages(requirements=\"%s\")\n", pe.indent, pe.requirements))
124125
}

pkg/builder/builder.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,9 @@ func (b generalBuilder) imageConfig(ctx context.Context) (string, error) {
224224
b.logger.Debugf("final entrypoint: {%s}\n", ep)
225225

226226
env := ir.CompileEnviron()
227+
user := ir.GetUser()
227228

228-
data, err := ImageConfigStr(labels, ports, ep, env)
229+
data, err := ImageConfigStr(labels, ports, ep, env, user)
229230
if err != nil {
230231
return "", errors.Wrap(err, "failed to get image config")
231232
}

pkg/builder/util.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ const (
3636
)
3737

3838
func ImageConfigStr(labels map[string]string, ports map[string]struct{},
39-
entrypoint []string, env []string) (string, error) {
39+
entrypoint []string, env []string, user string) (string, error) {
4040
pl := platforms.Normalize(platforms.DefaultSpec())
4141
img := v1.Image{
4242
Config: v1.ImageConfig{
4343
Labels: labels,
44-
User: "envd",
4544
WorkingDir: "/",
4645
Env: env,
46+
User: user,
4747
ExposedPorts: ports,
4848
Entrypoint: entrypoint,
4949
},

pkg/lang/frontend/starlark/config/config.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,15 @@ func ruleFuncRStudioServer(thread *starlark.Thread, _ *starlark.Builtin,
180180
func ruleFuncCondaChannel(thread *starlark.Thread, _ *starlark.Builtin,
181181
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
182182
var channel string
183-
var useMamba bool
184183

185184
if err := starlark.UnpackArgs(ruleCondaChannel, args, kwargs,
186-
"channel?", &channel, "use_mamba?", &useMamba); err != nil {
185+
"channel?", &channel); err != nil {
187186
return nil, err
188187
}
189188

190-
logger.Debugf("rule `%s` is invoked, channel=%s, use_mamba=%t\n",
191-
ruleCondaChannel, channel, useMamba)
192-
if err := ir.CondaChannel(channel, useMamba); err != nil {
189+
logger.Debugf("rule `%s` is invoked, channel=%s\n",
190+
ruleCondaChannel, channel)
191+
if err := ir.CondaChannel(channel); err != nil {
193192
return nil, err
194193
}
195194

pkg/lang/frontend/starlark/install/const.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,20 @@
1515
package install
1616

1717
const (
18+
// language
19+
rulePython = "install.python"
20+
ruleConda = "install.conda"
21+
ruleRLang = "install.r_lang"
22+
ruleJulia = "install.julia"
23+
24+
// packages
1825
ruleSystemPackage = "install.apt_packages"
1926
rulePyPIPackage = "install.python_packages"
27+
ruleCondaPackages = "install.conda_packages"
2028
ruleRPackage = "install.r_packages"
21-
ruleCUDA = "install.cuda"
22-
ruleVSCode = "install.vscode_extensions"
23-
ruleConda = "install.conda_packages"
24-
ruleJulia = "install.julia_packages"
29+
ruleJuliaPackages = "install.julia_packages"
30+
31+
// others
32+
ruleCUDA = "install.cuda"
33+
ruleVSCode = "install.vscode_extensions"
2534
)

pkg/lang/frontend/starlark/install/install.go

+61-11
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,66 @@ var (
3131
var Module = &starlarkstruct.Module{
3232
Name: "install",
3333
Members: starlark.StringDict{
34-
"python_packages": starlark.NewBuiltin(rulePyPIPackage, ruleFuncPyPIPackage),
35-
"r_packages": starlark.NewBuiltin(ruleRPackage, ruleFuncRPackage),
36-
"apt_packages": starlark.NewBuiltin(ruleSystemPackage, ruleFuncSystemPackage),
34+
// language
35+
"python": starlark.NewBuiltin(rulePython, ruleFuncPython),
36+
"conda": starlark.NewBuiltin(ruleConda, ruleFuncConda),
37+
"r_lang": starlark.NewBuiltin(ruleRLang, ruleFuncRLang),
38+
"julia": starlark.NewBuiltin(ruleJulia, ruleFuncJulia),
39+
// packages
40+
"apt_packages": starlark.NewBuiltin(ruleSystemPackage, ruleFuncSystemPackage),
41+
"python_packages": starlark.NewBuiltin(rulePyPIPackage, ruleFuncPyPIPackage),
42+
"conda_packages": starlark.NewBuiltin(ruleCondaPackages, ruleFuncCondaPackage),
43+
"r_packages": starlark.NewBuiltin(ruleRPackage, ruleFuncRPackage),
44+
"julia_packages": starlark.NewBuiltin(ruleJuliaPackages, ruleFuncJuliaPackage),
45+
// others
3746
"cuda": starlark.NewBuiltin(ruleCUDA, ruleFuncCUDA),
3847
"vscode_extensions": starlark.NewBuiltin(ruleVSCode, ruleFuncVSCode),
39-
"conda_packages": starlark.NewBuiltin(ruleConda, ruleFuncConda),
40-
"julia_packages": starlark.NewBuiltin(ruleJulia, ruleFuncJulia),
4148
},
4249
}
4350

51+
func ruleFuncPython(thread *starlark.Thread, _ *starlark.Builtin,
52+
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
53+
version := ir.PythonVersionDefault
54+
55+
if err := starlark.UnpackArgs(rulePython, args, kwargs, "version?", &version); err != nil {
56+
return nil, err
57+
}
58+
59+
logger.Debugf("rule `%s` is invoked, version=%s", rulePython, version)
60+
if err := ir.Python(version); err != nil {
61+
return nil, err
62+
}
63+
64+
return starlark.None, nil
65+
}
66+
67+
func ruleFuncConda(thread *starlark.Thread, _ *starlark.Builtin,
68+
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
69+
useMamba := false
70+
71+
if err := starlark.UnpackArgs(rulePython, args, kwargs, "use_mamba?", &useMamba); err != nil {
72+
return nil, err
73+
}
74+
75+
logger.Debugf("rule `%s` is invoked: use_mamba=%t", ruleConda, useMamba)
76+
ir.Conda(useMamba)
77+
return starlark.None, nil
78+
}
79+
80+
func ruleFuncRLang(thread *starlark.Thread, _ *starlark.Builtin,
81+
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
82+
logger.Debugf("rule `%s` is invoked", ruleRLang)
83+
ir.RLang()
84+
return starlark.None, nil
85+
}
86+
87+
func ruleFuncJulia(thread *starlark.Thread, _ *starlark.Builtin,
88+
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
89+
logger.Debugf("rule `%s` is invoked", ruleJulia)
90+
ir.Julia()
91+
return starlark.None, nil
92+
}
93+
4494
func ruleFuncPyPIPackage(thread *starlark.Thread, _ *starlark.Builtin,
4595
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
4696
var name *starlark.List
@@ -91,11 +141,11 @@ func ruleFuncRPackage(thread *starlark.Thread, _ *starlark.Builtin,
91141
return starlark.None, nil
92142
}
93143

94-
func ruleFuncJulia(thread *starlark.Thread, _ *starlark.Builtin,
144+
func ruleFuncJuliaPackage(thread *starlark.Thread, _ *starlark.Builtin,
95145
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
96146
var name *starlark.List
97147

98-
if err := starlark.UnpackArgs(ruleJulia,
148+
if err := starlark.UnpackArgs(ruleJuliaPackages,
99149
args, kwargs, "name", &name); err != nil {
100150
return nil, err
101151
}
@@ -104,7 +154,7 @@ func ruleFuncJulia(thread *starlark.Thread, _ *starlark.Builtin,
104154
if err != nil {
105155
return nil, err
106156
}
107-
logger.Debugf("rule `%s` is invoked, name=%v", ruleJulia, nameList)
157+
logger.Debugf("rule `%s` is invoked, name=%v", ruleJuliaPackages, nameList)
108158
ir.JuliaPackage(nameList)
109159

110160
return starlark.None, nil
@@ -168,12 +218,12 @@ func ruleFuncVSCode(thread *starlark.Thread, _ *starlark.Builtin,
168218
return starlark.None, nil
169219
}
170220

171-
func ruleFuncConda(thread *starlark.Thread, _ *starlark.Builtin,
221+
func ruleFuncCondaPackage(thread *starlark.Thread, _ *starlark.Builtin,
172222
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
173223
var name, channel *starlark.List
174224
var envFile starlark.String
175225

176-
if err := starlark.UnpackArgs(ruleConda,
226+
if err := starlark.UnpackArgs(ruleCondaPackages,
177227
args, kwargs, "name?", &name, "channel?", &channel, "env_file?", &envFile); err != nil {
178228
return nil, err
179229
}
@@ -195,7 +245,7 @@ func ruleFuncConda(thread *starlark.Thread, _ *starlark.Builtin,
195245
}
196246
}
197247

198-
logger.Debugf("rule `%s` is invoked, name=%v, channel=%v, env_file=%s", ruleConda, nameList, channelList, envFileStr)
248+
logger.Debugf("rule `%s` is invoked, name=%v, channel=%v, env_file=%s", ruleCondaPackages, nameList, channelList, envFileStr)
199249
if err := ir.CondaPackage(nameList, channelList, envFileStr); err != nil {
200250
return starlark.None, err
201251
}

pkg/lang/frontend/starlark/universe/universe.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,16 @@ func RegisterBuildContext(buildContextDir string) {
4545

4646
func ruleFuncBase(thread *starlark.Thread, _ *starlark.Builtin,
4747
args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
48-
var os, language, image string
48+
var image string
49+
var dev bool
4950

50-
if err := starlark.UnpackArgs(ruleBase, args, kwargs,
51-
"os?", &os, "language?", &language, "image?", &image); err != nil {
51+
if err := starlark.UnpackArgs(ruleBase, args, kwargs, "image?", &image, "dev?", &dev); err != nil {
5252
return nil, err
5353
}
5454

55-
logger.Debugf("rule `%s` is invoked, os=%s, language=%s, image=%s\n",
56-
ruleBase, os, language, image)
55+
logger.Debugf("rule `%s` is invoked, image=%s, dev=%t\n", ruleBase, image, dev)
5756

58-
err := ir.Base(os, language, image)
57+
err := ir.Base(image, dev)
5958
return starlark.None, err
6059
}
6160

0 commit comments

Comments
 (0)