diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml new file mode 100644 index 0000000000..ad96caf843 --- /dev/null +++ b/.github/workflows/publish-release.yml @@ -0,0 +1,80 @@ +name: Publish release + +on: + workflow_dispatch: + +jobs: + publish-release: + runs-on: ubuntu-latest + timeout-minutes: 60 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 21.0.3 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Set Up Ballerina + uses: ballerina-platform/setup-ballerina@v1.1.1 + with: + version: 2201.12.3 + + - name: Cache Ballerina dependencies + uses: actions/cache@v4 + id: cache-ballerina + with: + path: /home/runner/.ballerina/repositories/ + key: ${{ runner.os }}-ballerina-${{ hashFiles('**/gradle.properties') }} + restore-keys: | + ${{ runner.os }}-ballerina- + + - name: Set version env variable + run: echo VERSION=$((grep -w "version" | cut -d= -f2) < gradle.properties | cut -d- -f1) >> $GITHUB_ENV + + - name: Pre release depenency version update + env: + GITHUB_TOKEN: ${{ secrets.BALLERINA_BOT_TOKEN }} + run: | + echo "Version: ${VERSION}" + git config user.name ${{ secrets.BALLERINA_BOT_USERNAME }} + git config user.email ${{ secrets.BALLERINA_BOT_EMAIL }} + git checkout -b release-${VERSION} + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Release and publish artifacts + env: + GITHUB_TOKEN: ${{ secrets.BALLERINA_BOT_TOKEN }} + BALLERINA_CENTRAL_ACCESS_TOKEN: ${{ secrets.BALLERINA_CENTRAL_ACCESS_TOKEN }} + packageUser: ${{ secrets.BALLERINA_BOT_USERNAME }} + packagePAT: ${{ secrets.BALLERINA_BOT_TOKEN }} + run: | + ./gradlew release -Prelease.useAutomaticVersion=true -x test + ./gradlew -Pversion=${VERSION} publish -x test + + - name: Create Github release from the release tag + env: + GITHUB_TOKEN: ${{ secrets.BALLERINA_BOT_TOKEN }} + run: | + curl --request POST 'https://api.github.com/repos/ballerina-platform/ballerina-language-server/releases' \ + --header 'Accept: application/vnd.github.v3+json' \ + --header 'Authorization: Bearer ${{ secrets.BALLERINA_BOT_TOKEN }}' \ + --header 'Content-Type: application/json' \ + --data-raw '{ + "tag_name": "v'"$VERSION"'", + "name": "ballerina-language-server-v'"$VERSION"'" + }' + + - name: Post release PR + env: + GITHUB_TOKEN: ${{ secrets.BALLERINA_BOT_TOKEN }} + run: | + curl -fsSL https://github.com/github/hub/raw/master/script/get | bash -s 2.14.1 + bin/hub pull-request --base main -m "[Automated] Sync main after "$VERSION" release" diff --git a/architecture-model-generator/modules/architecture-model-generator-core/build.gradle b/architecture-model-generator/modules/architecture-model-generator-core/build.gradle index e402c09ef2..ed6f812042 100644 --- a/architecture-model-generator/modules/architecture-model-generator-core/build.gradle +++ b/architecture-model-generator/modules/architecture-model-generator-core/build.gradle @@ -112,5 +112,3 @@ compileJava { classpath = files() } } - -defineSyncTask("bre/lib") diff --git a/architecture-model-generator/modules/architecture-model-generator-ls-extension/build.gradle b/architecture-model-generator/modules/architecture-model-generator-ls-extension/build.gradle index 2609088265..3b79da155c 100644 --- a/architecture-model-generator/modules/architecture-model-generator-ls-extension/build.gradle +++ b/architecture-model-generator/modules/architecture-model-generator-ls-extension/build.gradle @@ -129,5 +129,3 @@ compileJava { classpath = files() } } - -defineSyncTask("lib/tools/lang-server/lib") diff --git a/build.gradle b/build.gradle index 8e4809ffb7..624b350fc6 100644 --- a/build.gradle +++ b/build.gradle @@ -96,59 +96,6 @@ subprojects { /* Ballerina Persist Tool */ ballerinaStdLibs "io.ballerina:persist-tools:${persistToolVersion}" } - - ext.defineSyncTask = { String pathParam -> - tasks.register('localSync') { - doLast { - def distVersion = "" - def distributionsDir = new File("${System.getProperty('user.home')}/.ballerina/ballerina-home/distributions/") - if (distributionsDir.exists()) { - def ballerinaDirectories = distributionsDir.listFiles().findAll { - it.isDirectory() && it.name.startsWith("ballerina-") - } - - if (ballerinaDirectories) { - ballerinaDirectories.sort { a, b -> b.name <=> a.name } - def latestDir = ballerinaDirectories[0] - distVersion = latestDir.name.substring("ballerina-".length()) - } else { - println "No Ballerina distributions found." - return - } - } else { - println "Distributions directory does not exist at: ${distributionsDir.absolutePath}" - return - } - - def buildLibsDir = file('build/libs') - def destinationPath = "${System.getProperty('user.home')}/.ballerina/ballerina-home/distributions/ballerina-${distVersion}/${pathParam}" - - if (buildLibsDir.exists() && buildLibsDir.listFiles()) { - def jarFiles = buildLibsDir.listFiles().findAll { it.name.endsWith('.jar') } - if (jarFiles) { - // Get module name from the built jar (removing version part) - def jarName = jarFiles[0].name - def moduleJarName = jarName.contains('-') ? jarName.substring(0, jarName.lastIndexOf('-')) : jarName.replace('.jar', '') - - def jarsToRemove = fileTree(destinationPath).matching { - include "${moduleJarName}*.jar" - } - if (!jarsToRemove.isEmpty()) { - jarsToRemove.each { jar -> - println "Removing existing jar: ${jar}" - jar.delete() - } - } - } - } - copy { - from fileTree(dir: 'build/libs', include: '*.jar') - println "Updating ${destinationPath}" - into destinationPath - } - } - } - } } def moduleVersion = project.version @@ -190,37 +137,11 @@ def pullBallerinaModule(String packageName, String version = null, String orgNam } } -publishing { - repositories { - maven { - name = "GitHubPackages" - url = uri("https://maven.pkg.github.com/ballerina-platform/ballerina-language-server") - credentials { - username = System.getenv("packageUser") - password = System.getenv("packagePAT") - } - } - } -} - -release { - failOnPublishNeeded = false - - buildTasks = ['build'] - versionPropertyFile = 'gradle.properties' - tagTemplate = 'v${version}' - git { - // To release from any branch - requireBranch = "release-${moduleVersion}" - pushToRemote = 'origin' - } -} - - configurations { externalJarDeps } +// Defines the third party dependencies to be included in the final JAR dependencies { externalJarDeps "org.eclipse.lsp4j:org.eclipse.lsp4j:${eclipseLsp4jVersion}" externalJarDeps "com.google.code.gson:gson:${gsonVersion}" @@ -234,6 +155,7 @@ dependencies { externalJarDeps "commons-io:commons-io:${commonsIoVersion}" externalJarDeps "com.google.guava:guava:${guavaVersion}" externalJarDeps "com.moandjiezana.toml:toml4j:${moandjiezanaToml4jVersion}" + externalJarDeps "com.github.zafarkhaja:java-semver:${javaSemverVersion}" } task pack(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { @@ -320,6 +242,40 @@ task buildCommons { dependsOn(":model-generator-commons:build") } +publishing { + publications { + shadow(MavenPublication) { publication -> + publication.artifact(tasks.pack) { + classifier = null + } + from components.java + } + } + + repositories { + maven { + name = "GitHubPackages" + url = uri("https://maven.pkg.github.com/ballerina-platform/ballerina-language-server") + credentials { + username = System.getenv("packageUser") + password = System.getenv("packagePAT") + } + } + } +} + +release { + failOnPublishNeeded = false + + buildTasks = ['build'] + versionPropertyFile = 'gradle.properties' + tagTemplate = 'v${version}' + git { + // To release from any branch + requireBranch = "release-${moduleVersion}" + pushToRemote = 'origin' + } +} build.dependsOn test build.doNotTrackState("build needs to run every time") diff --git a/flow-model-generator/modules/flow-model-generator-core/build.gradle b/flow-model-generator/modules/flow-model-generator-core/build.gradle index c6a87b69e1..ce98234a7f 100644 --- a/flow-model-generator/modules/flow-model-generator-core/build.gradle +++ b/flow-model-generator/modules/flow-model-generator-core/build.gradle @@ -112,8 +112,6 @@ task copyStdlibs() { } } -defineSyncTask("bre/lib") - test { dependsOn { copyStdlibs diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle index fb7a329e2e..abfd75634d 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle @@ -142,5 +142,3 @@ compileJava { classpath = files() } } - -defineSyncTask("lib/tools/lang-server/lib") diff --git a/gradle.properties b/gradle.properties index 3a4ee38083..d905402dbc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,6 +29,7 @@ commonsIoVersion=2.15.1 guavaVersion=32.0.1-jre moandjiezanaToml4jVersion=0.7.2 awaitilityVersion=3.1.6 +javaSemverVersion=0.9.0 # Ballerinax Observer observeVersion=1.5.0-20250311-132700-a89f57a diff --git a/model-generator-commons/build.gradle b/model-generator-commons/build.gradle index 2ad46e3952..a56b7fe0ed 100644 --- a/model-generator-commons/build.gradle +++ b/model-generator-commons/build.gradle @@ -63,5 +63,3 @@ compileJava { classpath = files() } } - -defineSyncTask("bre/lib") diff --git a/sequence-model-generator/modules/sequence-model-generator-core/build.gradle b/sequence-model-generator/modules/sequence-model-generator-core/build.gradle index 82f98fc9f5..43b333b8d2 100644 --- a/sequence-model-generator/modules/sequence-model-generator-core/build.gradle +++ b/sequence-model-generator/modules/sequence-model-generator-core/build.gradle @@ -94,5 +94,3 @@ compileJava { classpath = files() } } - -defineSyncTask("bre/lib") diff --git a/sequence-model-generator/modules/sequence-model-generator-ls-extension/build.gradle b/sequence-model-generator/modules/sequence-model-generator-ls-extension/build.gradle index 220374ab14..9ae3b5a958 100644 --- a/sequence-model-generator/modules/sequence-model-generator-ls-extension/build.gradle +++ b/sequence-model-generator/modules/sequence-model-generator-ls-extension/build.gradle @@ -126,5 +126,3 @@ compileJava { classpath = files() } } - -defineSyncTask("lib/tools/lang-server/lib")