diff --git a/.github/workflows/client-build.yml b/.github/workflows/client-build.yml index 7c29b18e62..f612d0446c 100644 --- a/.github/workflows/client-build.yml +++ b/.github/workflows/client-build.yml @@ -41,7 +41,7 @@ jobs: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'repository_dispatch' || - github.event_name == 'schedule' + github.event_name == 'schedule' defaults: run: working-directory: app/client @@ -242,13 +242,6 @@ jobs: if [[ "${{github.ref}}" == "refs/heads/release" ]]; then echo "REACT_APP_ENVIRONMENT=STAGING" >> $GITHUB_OUTPUT fi - # Since this is an unreleased build, we set the version to incremented version number with - # a `-SNAPSHOT` suffix. - latest_released_version="$(git ls-remote --tags --sort=-v:refname "$(git remote | head -1)" 'v*' | awk -F/ '{print $NF; exit}')" - echo "latest_released_version = $latest_released_version" - next_version="$(echo "$latest_released_version" | awk -F. -v OFS=. '{ $NF++; print }')" - echo "next_version = $next_version" - echo version=$next_version-SNAPSHOT >> $GITHUB_OUTPUT # We burn React environment & the Segment analytics key into the build itself. # This is to ensure that we don't need to configure it in each installation @@ -263,8 +256,6 @@ jobs: REACT_APP_ENVIRONMENT=${{steps.vars.outputs.REACT_APP_ENVIRONMENT}} \ REACT_APP_FUSIONCHARTS_LICENSE_KEY=${{ secrets.APPSMITH_FUSIONCHARTS_LICENSE_KEY }} \ SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} \ - REACT_APP_VERSION_ID=${{ steps.vars.outputs.version }} \ - REACT_APP_VERSION_RELEASE_DATE=$(date -u '+%Y-%m-%dT%H:%M:%SZ') \ REACT_APP_VERSION_EDITION="Community" \ yarn build diff --git a/.github/workflows/server-build.yml b/.github/workflows/server-build.yml index d668b943a7..e167513609 100644 --- a/.github/workflows/server-build.yml +++ b/.github/workflows/server-build.yml @@ -145,23 +145,6 @@ jobs: key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-m2 - # Here, the GITHUB_REF is of type /refs/head/. We extract branch_name from this by removing the - # first 11 characters. This can be used to build images for several branches - # Since this is an unreleased build, we get the latest released version number, increment the minor number in it, - # append a `-SNAPSHOT` at it's end to prepare the snapshot version number. This is used as the project's version. - - name: Get the version to tag the Docker image - if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') - id: vars - run: | - # Since this is an unreleased build, we set the version to incremented version number with a - # `-SNAPSHOT` suffix. - latest_released_version="$(git ls-remote --tags --sort=-v:refname "$(git remote | head -1)" 'v*' | awk -F/ '{print $NF; exit}')" - echo "latest_released_version = $latest_released_version" - next_version="$(echo "$latest_released_version" | awk -F. -v OFS=. '{ $NF++; print }')" - echo "next_version = $next_version" - echo version=$next_version-SNAPSHOT >> $GITHUB_OUTPUT - echo tag=$(echo ${GITHUB_REF:11}) >> $GITHUB_OUTPUT - # Build the code - name: Build if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') @@ -176,10 +159,6 @@ jobs: APPSMITH_ENVFILE_PATH: /tmp/dummy.env APPSMITH_VERBOSE_LOGGING_ENABLED: false run: | - mvn --batch-mode versions:set \ - -DnewVersion=${{ steps.vars.outputs.version }} \ - -DgenerateBackupPoms=false \ - -DprocessAllModules=true ./build.sh -DskipTests # Test the code @@ -246,7 +225,7 @@ jobs: if [ "$reponame" = "appsmith" ]; then export repodir="CE"; fi if [ "$reponame" = "appsmith-ee" ]; then export repodir="EE"; fi cd cibuildcache/$repodir/release/server - git lfs pull ./server.jar + git lfs pull ./server.jar mv ./server.jar ../../../../../server.jar cd ../../../../../ tar -xzvf ./server.jar diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java index 43195d4702..b60254a118 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java @@ -1,9 +1,11 @@ package com.appsmith.server; +import com.appsmith.server.configurations.ProjectProperties; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.aop.ObservedAspect; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.Banner; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -16,14 +18,28 @@ import static com.appsmith.server.constants.EnvVariables.APPSMITH_NEW_RELIC_ACCO @SpringBootApplication @EnableScheduling +@Slf4j public class ServerApplication { + private final ProjectProperties projectProperties; + + public ServerApplication(ProjectProperties projectProperties) { + this.projectProperties = projectProperties; + printBuildInfo(); + } + public static void main(String[] args) { new SpringApplicationBuilder(ServerApplication.class) .bannerMode(Banner.Mode.OFF) .run(args); } + private void printBuildInfo() { + String version = projectProperties.getVersion(); + String commitId = projectProperties.getCommitSha(); + log.info("Application started with build version {}, and commitSha {}", version, commitId); + } + @Bean public OpenTelemetry openTelemetry() { String instanceName = diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/ProjectProperties.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/ProjectProperties.java index e6468f34c6..a49a022bc0 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/ProjectProperties.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/ProjectProperties.java @@ -1,23 +1,40 @@ package com.appsmith.server.configurations; +import com.appsmith.server.dtos.BuildInfo; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -/** - * Properties in this configuration object are loaded from the `pom.properties` file that is generated by Maven - * automatically. This file is included in the final JAR file at - * `META-INF/maven/{project.group}/{project.name}/pom.properties`. Outside the JAR file, it can be accessed from - * `target/maven-archiver/pom.properties`. - */ +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + @Configuration -@PropertySource(value = "classpath:META-INF/maven/com.appsmith/server/pom.properties", ignoreResourceNotFound = true) @Getter +@Slf4j public class ProjectProperties { + private static final String INFO_JSON_PATH = "/opt/appsmith/info.json"; + private static final ObjectMapper objectMapper = new ObjectMapper(); public static final String EDITION = "CE"; + private String version = "UNKNOWN"; + private String commitSha = "UNKNOWN"; - @Value("${version:UNKNOWN}") - private String version; + public ProjectProperties() { + try { + Path infoJsonPath = Paths.get(INFO_JSON_PATH); + if (Files.exists(infoJsonPath)) { + String jsonContent = Files.readString(infoJsonPath); + // Parse JSON content using the AppsmithInfo class + BuildInfo buildInfo = objectMapper.readValue(jsonContent, BuildInfo.class); + version = buildInfo.getVersion(); + commitSha = buildInfo.getCommitSha(); + } + } catch (IOException e) { + // Ignore the exception and return "UNKNOWN" as the version + log.debug("Error reading version from info.json {}", e.getMessage()); + } + } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/BuildInfo.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/BuildInfo.java new file mode 100644 index 0000000000..efb1002f6d --- /dev/null +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/BuildInfo.java @@ -0,0 +1,16 @@ +package com.appsmith.server.dtos; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * This class is used to parse the JSON content of the info.json file. This file is generated during the build process + * and contains the version of the Appsmith server. + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class BuildInfo { + private String version; + + private String commitSha; +} diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/controllers/ApplicationControllerTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/controllers/ApplicationControllerTest.java index 8b74d5f3ef..f7c318b961 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/controllers/ApplicationControllerTest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/controllers/ApplicationControllerTest.java @@ -1,6 +1,7 @@ package com.appsmith.server.controllers; import com.appsmith.server.applications.base.ApplicationService; +import com.appsmith.server.configurations.ProjectProperties; import com.appsmith.server.configurations.RedisTestContainerConfig; import com.appsmith.server.configurations.SecurityTestConfig; import com.appsmith.server.constants.Url; @@ -87,6 +88,9 @@ public class ApplicationControllerTest { @MockBean PartialImportService partialImportService; + @MockBean + ProjectProperties projectProperties; + private String getFileName(int length) { StringBuilder fileName = new StringBuilder(); for (int count = 0; count < length; count++) {