Skip to content

Commit

Permalink
feat: add quarterly releases support
Browse files Browse the repository at this point in the history
  • Loading branch information
lgdd committed Apr 26, 2024
1 parent 032208d commit 3f30ef0
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 70 deletions.
183 changes: 115 additions & 68 deletions lfr/pkg/project/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
"github.com/iancoleman/strcase"
"github.com/lgdd/lfr-cli/lfr/pkg/util/fileutil"
"github.com/lgdd/lfr-cli/lfr/pkg/util/printutil"
progressbar "github.com/schollz/progressbar/v3"
)

// Metadata represents the basic informations associated with a Liferay project
Expand All @@ -31,17 +30,31 @@ type Metadata struct {
Name string
}

type ProductInfo struct {
type Release struct {
Product string `json:"product"`
ProductGroupVersion string `json:"productGroupVersion"`
ProductVersion string `json:"productVersion"`
Promoted string `json:"promoted"`
ReleaseKey string `json:"releaseKey"`
TargetPlatformVersion string `json:"targetPlatformVersion"`
URL string `json:"url"`
ReleaseProperties ReleaseProperties `json:"releaseProperties"`
}

type ReleaseProperties struct {
URL string `json:"url"`
AppServerTomcatVersion string `json:"appServerTomcatVersion"`
BundleURL string `json:"bundleUrl"`
BundleChecksumMD5 string `json:"bundleChecksumMD5"`
BundleChecksumMD5URL string `json:"bundleChecksumMD5Url"`
BuildTimestamp string `json:"buildTimestamp"`
BundleChecksumSha512 string `json:"bundleChecksumSha512"`
BundleURL string `json:"bundleURL"`
GithubBundleURL string `json:"githubBundleURL"`
GitHashLiferayDocker string `json:"gitHashLiferayDocker"`
GitHasLiferayPortalEE string `json:"gitHashLiferayPortalEE"`
LiferayDockerImage string `json:"liferayDockerImage"`
LiferayDockerTags string `json:"liferayDockerTags"`
LiferayProductVersion string `json:"liferayProductVersion"`
Promoted string `json:"promoted"`
ReleaseDate string `json:"releaseDate"`
TargetPlatformVersion string `json:"targetPlatformVersion"`
Name string `json:"name"`
}

// Build & Edition options
Expand All @@ -52,6 +65,10 @@ const (
Portal = "portal"
)

// Expected errors
var ErrUnkownEdition = errors.New("unknown edition (it should be 'dxp' or 'portal')")
var ErrUnsupportedVersion = errors.New("invalid or unsupported Liferay version")

// Package name to use for the project, default is org.acme
var PackageName string

Expand Down Expand Up @@ -115,61 +132,91 @@ func GetGroupId() (string, error) {

// Returns metadata for a given project and the chosen Liferay version
func NewMetadata(base, version, edition string) (*Metadata, error) {
var productInfoURLBuilder strings.Builder
productInfoURLBuilder.WriteString("https://raw.githubusercontent.com/lgdd/liferay-product-info/main/")
productInfoVersion := strings.ReplaceAll(version, ".", "")
// workaround timeout on this release
if edition == Portal && version == "7.0" {
return getOfflineMetadata(base, version, edition)
}

releases, err := fetchReleases(version, edition)

if err != nil {
if err == ErrUnkownEdition || err == ErrUnsupportedVersion {
return nil, err
} else {
printutil.Warning(fmt.Sprintf("%s\n", err.Error()))
return getOfflineMetadata(base, version, edition)
}
}

latestRelease := releases[0]

// workaround issue in releases.json for 7.1
if edition == Portal && version == "7.1" {
latestRelease = releases[1]
}

latestRelease.BuildGithubBundleURL()

return &Metadata{
Edition: edition,
Product: latestRelease.ReleaseKey,
BundleUrl: latestRelease.ReleaseProperties.BundleURL,
TargetPlatform: latestRelease.ReleaseProperties.TargetPlatformVersion,
DockerImage: latestRelease.ReleaseProperties.LiferayDockerImage,
GroupId: strcase.ToDelimited(PackageName, '.'),
ArtifactId: strcase.ToKebab(strings.ToLower(base)),
Name: strcase.ToCamel(strings.ToLower(base)),
}, nil
}

func fetchReleases(version, edition string) ([]Release, error) {
var releasesURLBuilder strings.Builder
releasesURLBuilder.WriteString("https://raw.githubusercontent.com/lgdd/liferay-product-info/main/releases/")
releaseVersion := strings.ReplaceAll(version, ".", "")

if edition != DXP && edition != Portal {
return nil, errors.New("unknown edition (it should be 'dxp' or 'portal')")
return []Release{}, ErrUnkownEdition
}

if version != "7.4" && version != "7.3" && version != "7.2" && version != "7.1" && version != "7.0" {
return nil, fmt.Errorf("invalid or unsupported Liferay version")
return []Release{}, ErrUnsupportedVersion
}

productInfoURLBuilder.WriteString(edition)
productInfoURLBuilder.WriteString("_")
productInfoURLBuilder.WriteString(productInfoVersion)
productInfoURLBuilder.WriteString("_product_info.json")
releasesURLBuilder.WriteString(edition)
releasesURLBuilder.WriteString("_")
releasesURLBuilder.WriteString(releaseVersion)
releasesURLBuilder.WriteString("_releases.json")

bar := progressbar.NewOptions(-1,
progressbar.OptionSetDescription("Fetching latest info from https://github.com/lgdd/liferay-product-info"),
progressbar.OptionSpinnerType(11))

resp, err := http.Get(productInfoURLBuilder.String())
resp, err := http.Get(releasesURLBuilder.String())

if err != nil {
bar.Clear()
printutil.Warning(fmt.Sprintf("%s\n", err.Error()))
return getOfflineMetadata(base, version, edition)
return []Release{}, err
}

var productInfoList []ProductInfo
body, _ := io.ReadAll(resp.Body)

defer resp.Body.Close()
var releases []Release
body, _ := io.ReadAll(resp.Body)
err = json.Unmarshal(body, &releases)

if err := json.Unmarshal(body, &productInfoList); err != nil {
bar.Clear()
fmt.Println("Can not unmarshal response")
fmt.Println(body)
fmt.Println(err.Error())
fmt.Println("Get offline data")
return getOfflineMetadata(base, version, edition)
if err != nil {
return []Release{}, err
}

latestProductInfo := productInfoList[len(productInfoList)-1]
bar.Clear()
return &Metadata{
Edition: edition,
Product: latestProductInfo.Name,
BundleUrl: latestProductInfo.BundleURL,
TargetPlatform: latestProductInfo.TargetPlatformVersion,
DockerImage: latestProductInfo.LiferayDockerImage,
GroupId: strcase.ToDelimited(PackageName, '.'),
ArtifactId: strcase.ToKebab(strings.ToLower(base)),
Name: strcase.ToCamel(strings.ToLower(base)),
}, nil
return releases, nil
}

func (release *Release) BuildGithubBundleURL() {
var githubBundleURLBuilder strings.Builder
githubBaseURL := "https://github.com/lgdd/liferay-dxp-releases/releases/download/"
bundleURLSplit := strings.Split(release.ReleaseProperties.BundleURL, "/")
bundleName := bundleURLSplit[len(bundleURLSplit)-1]

githubBundleURLBuilder.WriteString(githubBaseURL)
githubBundleURLBuilder.WriteString(release.ReleaseKey)
githubBundleURLBuilder.WriteString("/")
githubBundleURLBuilder.WriteString(bundleName)

release.ReleaseProperties.GithubBundleURL = githubBundleURLBuilder.String()
}

func getOfflineMetadata(base, version, edition string) (*Metadata, error) {
Expand All @@ -178,30 +225,30 @@ func getOfflineMetadata(base, version, edition string) (*Metadata, error) {
case "7.4":
return &Metadata{
Edition: edition,
Product: "7.4.13.u102",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.4.13-u102/liferay-dxp-tomcat-7.4.13.u102-20231109153600206.tar.gz",
TargetPlatform: "7.4.13.u102",
DockerImage: "liferay/dxp:7.4.13-u102",
Product: "dxp-2024.q1.5",
BundleUrl: "https://releases-cdn.liferay.com/dxp/2024.q1.5/liferay-dxp-tomcat-2024.q1.5-1712566347.7z",
TargetPlatform: "2024.q1.5",
DockerImage: "liferay/dxp:2024.q1.5",
GroupId: strcase.ToDelimited(PackageName, '.'),
ArtifactId: strcase.ToKebab(strings.ToLower(base)),
Name: strcase.ToCamel(strings.ToLower(base)),
}, nil
case "7.3":
return &Metadata{
Edition: edition,
Product: "dxp-7.3-u35",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.3.10-u35/liferay-dxp-tomcat-7.3.10.u35-20231114110531823.tar.gz",
TargetPlatform: "7.3.10.u35",
DockerImage: "liferay/dxp:7.3.10-u35",
Product: "dxp-7.3-u36",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.3.10-u36/liferay-dxp-tomcat-7.3.10-u36-1706652128.7z",
TargetPlatform: "7.3.10.u36",
DockerImage: "liferay/dxp:7.3.10-u36",
GroupId: strcase.ToDelimited(PackageName, '.'),
ArtifactId: strcase.ToKebab(strings.ToLower(base)),
Name: strcase.ToCamel(strings.ToLower(base)),
}, nil
case "7.2":
return &Metadata{
Edition: edition,
Product: "dxp-7.2-sp8",
BundleUrl: "https://api.liferay.com/downloads/portal/7.2.10.8/liferay-dxp-tomcat-7.2.10.8-sp8-slim-20220912234451782.tar.gz",
Product: "dxp-7.2.8",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.2.10.8/liferay-dxp-tomcat-7.2.10.8-sp8-20220912234451782.7z",
TargetPlatform: "7.2.10.8",
DockerImage: "liferay/dxp:7.2.10-sp8",
GroupId: strcase.ToDelimited(PackageName, '.'),
Expand All @@ -211,19 +258,19 @@ func getOfflineMetadata(base, version, edition string) (*Metadata, error) {
case "7.1":
return &Metadata{
Edition: edition,
Product: "dxp-7.1-sp8",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.1.10.8/liferay-dxp-tomcat-7.1.10.8-sp8-slim-20220926154152962.tar.gz",
Product: "dxp-7.1-dxp-28",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.1.10-dxp-28/liferay-dxp-tomcat-7.1.10-dxp-28-20220823192814876.7z",
TargetPlatform: "7.1.10.8",
DockerImage: "liferay/dxp:7.1.10-sp8",
DockerImage: "liferay/dxp:7.1.10-dxp-28",
GroupId: strcase.ToDelimited(PackageName, '.'),
ArtifactId: strcase.ToKebab(strings.ToLower(base)),
Name: strcase.ToCamel(strings.ToLower(base)),
}, nil
case "7.0":
return &Metadata{
Edition: edition,
Product: "dxp-7.0-sp17",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.0.10.17/liferay-dxp-digital-enterprise-tomcat-7.0.10.17-sp17-slim-20211014075354439.tar.gz",
Product: "dxp-7.0.17",
BundleUrl: "https://releases-cdn.liferay.com/dxp/7.0.10.17/liferay-dxp-digital-enterprise-tomcat-7.0.10.17-sp17-slim-20211014075354439.7z",
TargetPlatform: "7.0.10.17",
DockerImage: "liferay/dxp:7.0.10-sp17",
GroupId: strcase.ToDelimited(PackageName, '.'),
Expand All @@ -236,10 +283,10 @@ func getOfflineMetadata(base, version, edition string) (*Metadata, error) {
case "7.4":
return &Metadata{
Edition: edition,
Product: "portal-7.4-ga102",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.4.3.102-ga102/liferay-ce-portal-tomcat-7.4.3.102-ga102-20231109165213885.tar.gz",
TargetPlatform: "7.4.3.102",
DockerImage: "liferay/portal:7.4.3.102-ga102",
Product: "portal-7.4-ga112",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.4.3.112-ga112/liferay-ce-portal-tomcat-7.4.3.112-ga112-20240226061339195.7z",
TargetPlatform: "7.4.3.112",
DockerImage: "liferay/portal:7.4.3.112-ga112",
GroupId: strcase.ToDelimited(PackageName, '.'),
ArtifactId: strcase.ToKebab(strings.ToLower(base)),
Name: strcase.ToCamel(strings.ToLower(base)),
Expand All @@ -248,7 +295,7 @@ func getOfflineMetadata(base, version, edition string) (*Metadata, error) {
return &Metadata{
Edition: edition,
Product: "portal-7.3-ga8",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.3.7-ga8/liferay-ce-portal-tomcat-7.3.7-ga8-20210610183559721.tar.gz",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.3.7-ga8/liferay-ce-portal-tomcat-7.3.7-ga8-20210610183559721.7z",
TargetPlatform: "7.3.7",
DockerImage: "liferay/portal:7.3.7-ga8",
GroupId: strcase.ToDelimited(PackageName, '.'),
Expand All @@ -259,7 +306,7 @@ func getOfflineMetadata(base, version, edition string) (*Metadata, error) {
return &Metadata{
Edition: edition,
Product: "portal-7.2-ga2",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.2.1-ga2/liferay-ce-portal-tomcat-7.2.1-ga2-20191111141448326.tar.gz",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.2.1-ga2/liferay-ce-portal-tomcat-7.2.1-ga2-20191111141448326.7z",
TargetPlatform: "7.2.1-1",
DockerImage: "liferay/portal:7.2.1-ga2",
GroupId: strcase.ToDelimited(PackageName, '.'),
Expand All @@ -270,7 +317,7 @@ func getOfflineMetadata(base, version, edition string) (*Metadata, error) {
return &Metadata{
Edition: edition,
Product: "portal-7.1-ga4",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.1.3-ga4/liferay-ce-portal-tomcat-7.1.3-ga4-20190508171117552.tar.gz",
BundleUrl: "https://github.com/liferay/liferay-portal/releases/download/7.1.3-ga4/liferay-ce-portal-tomcat-7.1.3-ga4-20190508171117552.7z",
TargetPlatform: "7.1.3-1",
DockerImage: "liferay/portal:7.1.3-ga4",
GroupId: strcase.ToDelimited(PackageName, '.'),
Expand Down
4 changes: 2 additions & 2 deletions lfr/pkg/project/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
)

func Test_NewMetadata_WithDXP73_ShouldReturnLatestValid(t *testing.T) {
expectedTargetPlatform := "7.3.10.u35"
expectedTargetPlatform := "7.3.10-u36"
metadata, err := NewMetadata("liferay-workspace", "7.3", "dxp")
if err != nil {
t.Fatal(err)
Expand All @@ -29,7 +29,7 @@ func Test_NewMetadata_WithDXP72_ShouldReturnLatestValid(t *testing.T) {
}

func Test_NewMetadata_WithDXP71_ShouldReturnLatestValid(t *testing.T) {
expectedTargetPlatform := "7.1.10.8"
expectedTargetPlatform := "7.1.10.fp28"
metadata, err := NewMetadata("liferay-workspace", "7.1", "dxp")
if err != nil {
t.Fatal(err)
Expand Down

0 comments on commit 3f30ef0

Please sign in to comment.