mirror of https://github.com/knative/func.git
Use pre-build binary packages for cpython buildpack (#2799)
Signed-off-by: Matej Vašek <mvasek@redhat.com>
This commit is contained in:
parent
179ba2fcaa
commit
370ca50313
|
@ -1306,7 +1306,7 @@ func fixupPythonBuildpackARM64(ctx context.Context, config *builder.Config) erro
|
||||||
// these buildpacks need rebuild since they are only amd64 in paketo upstream
|
// these buildpacks need rebuild since they are only amd64 in paketo upstream
|
||||||
needsRebuild := map[string]patchSourceFn{
|
needsRebuild := map[string]patchSourceFn{
|
||||||
"cpython": func(srcDir string) error {
|
"cpython": func(srcDir string) error {
|
||||||
return fixupCPythonDistPkgRefs(filepath.Join(srcDir, "buildpack.toml"))
|
return fixupCPythonDistPkgRefs(ctx, filepath.Join(srcDir, "buildpack.toml"))
|
||||||
},
|
},
|
||||||
"miniconda": func(srcDir string) error {
|
"miniconda": func(srcDir string) error {
|
||||||
return fixupMinicondaDistPkgRefs(filepath.Join(srcDir, "buildpack.toml"))
|
return fixupMinicondaDistPkgRefs(filepath.Join(srcDir, "buildpack.toml"))
|
||||||
|
@ -1382,7 +1382,8 @@ func fixupPythonBuildpackARM64(ctx context.Context, config *builder.Config) erro
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func fixupCPythonDistPkgRefs(buildpackToml string) error {
|
func fixupCPythonDistPkgRefs(ctx context.Context, buildpackToml string) error {
|
||||||
|
|
||||||
tomlBytes, err := os.ReadFile(buildpackToml)
|
tomlBytes, err := os.ReadFile(buildpackToml)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -1396,14 +1397,84 @@ func fixupCPythonDistPkgRefs(buildpackToml string) error {
|
||||||
|
|
||||||
deps := config.(map[string]any)["metadata"].(map[string]any)["dependencies"].([]map[string]any)
|
deps := config.(map[string]any)["metadata"].(map[string]any)["dependencies"].([]map[string]any)
|
||||||
|
|
||||||
// Since there are no cpython arm64 packages we set uri to source.
|
r := regexp.MustCompile(`[_-](\d+\.\d+\.\d+)[._]`)
|
||||||
|
parseVersion := func(url string) (string, error) {
|
||||||
|
ms := r.FindStringSubmatch(url)
|
||||||
|
if len(ms) != 2 {
|
||||||
|
return "", fmt.Errorf("missing version match in %q", url)
|
||||||
|
}
|
||||||
|
return ms[1], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
getPackageInfo := func(version string) (url string, checksum string, err error) {
|
||||||
|
url = fmt.Sprintf(`https://github.com/matejvasek/cpython-dist/`+
|
||||||
|
`releases/download/v0.0.0/python_%s_linux_arm64_jammy.tgz`, version)
|
||||||
|
req, err := http.NewRequestWithContext(ctx, "HEAD", url, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return "", "", fmt.Errorf("non 200 code")
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err = http.NewRequestWithContext(ctx, "GET", url+".checksum", nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
resp, err = http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
bs, err := io.ReadAll(resp.Body)
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return "", "", fmt.Errorf("non 200 code")
|
||||||
|
}
|
||||||
|
|
||||||
|
checksum = strings.TrimSpace(string(bs))
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there are no cpython arm64 packages we set uri to source.
|
||||||
// This will cause cpython compilation to be done during the build process.
|
// This will cause cpython compilation to be done during the build process.
|
||||||
// This takes a while, but it's done only once per project.
|
// This takes a while, but it's done only once per project.
|
||||||
for _, dep := range deps {
|
uriToSource := func(dep map[string]any) {
|
||||||
dep["checksum"] = dep["source-checksum"]
|
dep["checksum"] = dep["source-checksum"]
|
||||||
dep["uri"] = dep["source"]
|
dep["uri"] = dep["source"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, dep := range deps {
|
||||||
|
if !slices.Equal(dep["stacks"].([]any), []any{"io.buildpacks.stacks.jammy"}) {
|
||||||
|
// we have binary packages only for jammy stack, fallback to source build
|
||||||
|
uriToSource(dep)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var ver, uri, checksum string
|
||||||
|
ver, err = parseVersion(dep["uri"].(string))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
uri, checksum, err = getPackageInfo(ver)
|
||||||
|
if err != nil {
|
||||||
|
// binary package not found for the version, fallback to source build
|
||||||
|
uriToSource(dep)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dep["uri"] = uri
|
||||||
|
dep["checksum"] = checksum
|
||||||
|
}
|
||||||
|
|
||||||
bs, err := toml.Marshal(config)
|
bs, err := toml.Marshal(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in New Issue