This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/struts-intellij-plugin.git


The following commit(s) were added to refs/heads/main by this push:
     new 629dab4  ci: convert pre-release from per-push to nightly schedule 
(#47)
629dab4 is described below

commit 629dab4579272c93eb96e5752f36becfdbf5ee0d
Author: Lukasz Lenart <[email protected]>
AuthorDate: Mon Feb 23 20:15:43 2026 +0100

    ci: convert pre-release from per-push to nightly schedule (#47)
    
    Move the createPrerelease job out of build.yml into a dedicated
    nightly.yml workflow that runs daily at 2:00 AM UTC. The new workflow
    checks for new commits since the last pre-release before building,
    avoiding redundant nightly versions when multiple PRs merge in a day.
    Manual trigger via workflow_dispatch is also supported.
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    Co-authored-by: Claude <[email protected]>
---
 .github/workflows/build.yml   | 143 ++----------------------------
 .github/workflows/nightly.yml | 198 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 204 insertions(+), 137 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index fbf87bf..3f122bf 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,13 +13,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# GitHub Actions Workflow is created for testing and preparing the plugin 
release in the following steps:
+# GitHub Actions Workflow for CI: testing and verifying the plugin.
 # - Validate Gradle Wrapper.
+# - Run 'buildPlugin' task and prepare artifact.
 # - Run 'test' and 'verifyPlugin' tasks.
 # - Run Qodana inspections.
-# - Run the 'buildPlugin' task and prepare artifact for further tests.
-# - Run the 'runPluginVerifier' task.
-# - Create a draft release.
+#
+# Pre-release publishing is handled by the separate nightly.yml workflow.
 #
 # The workflow is triggered on push and pull_request events.
 #
@@ -90,7 +90,7 @@ jobs:
         shell: bash
         run: |
           cd ${{ github.workspace }}/build/distributions
-          FILENAME=`ls *.zip`
+          FILENAME=$(ls *-signed.zip 2>/dev/null || ls *.zip | head -1)
           unzip "$FILENAME" -d content
           echo "filename=${FILENAME:0:-4}" >> $GITHUB_OUTPUT
 
@@ -234,135 +234,4 @@ jobs:
         uses: actions/upload-artifact@v6
         with:
           name: pluginVerifier-result
-          path: ${{ github.workspace }}/build/reports/pluginVerifier
-
-  # Create a pre-release for successful main branch builds
-  createPrerelease:
-    name: Create pre-release
-    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
-    needs: [ build, test, inspectCode, verify ]
-    runs-on: ubuntu-latest
-    permissions:
-      contents: write
-    outputs:
-      version: ${{ steps.version.outputs.version }}
-    steps:
-
-      # Check out the current repository
-      - name: Fetch Sources
-        uses: actions/checkout@v6
-
-      # Set up Java environment
-      - name: Setup Java
-        uses: actions/setup-java@v5
-        with:
-          distribution: zulu
-          java-version: 21
-
-      # Setup Gradle
-      - name: Setup Gradle
-        uses: gradle/actions/setup-gradle@v5
-        with:
-          gradle-home-cache-cleanup: true
-
-      # Generate version for pre-release
-      - name: Generate Version
-        id: version
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          # Get branch number from gradle.properties
-          BRANCH=$(grep "pluginSinceBuild" gradle.properties | cut -d '=' -f2 
| tr -d ' ')
-          
-          # Get the latest release version to determine next build number
-          LATEST_RELEASE=$(gh release list --limit 1 --json tagName --jq 
'.[0].tagName // "v242.18969.1"' 2>/dev/null || echo "v242.18969.1")
-          LATEST_BUILD=$(echo "$LATEST_RELEASE" | sed 
's/v[0-9]*\.\([0-9]*\)\.[0-9]*/\1/')
-          
-          # Increment build number for main branch builds
-          BUILD=$((LATEST_BUILD + 1))
-          
-          # Update pluginVersion in gradle.properties
-          sed -i "s/pluginVersion = [0-9]*\.[0-9]*\.[0-9]*/pluginVersion = 
${BRANCH}.${BUILD}-nightly.1/" gradle.properties
-          
-          # Get final version and changelog
-          PROPERTIES="$(./gradlew properties --no-configuration-cache 
--console=plain -q)"
-          VERSION="$(echo "$PROPERTIES" | grep "^version:" | cut -f2- -d ' ')"
-          CHANGELOG="$(./gradlew getChangelog --no-configuration-cache 
--unreleased --no-header --console=plain -q)"
-          
-          echo "version=$VERSION" >> $GITHUB_OUTPUT
-          echo "changelog<<EOF" >> $GITHUB_OUTPUT
-          echo "$CHANGELOG" >> $GITHUB_OUTPUT
-          echo "EOF" >> $GITHUB_OUTPUT
-
-      # Build plugin with new version
-      - name: Build Plugin
-        run: ./gradlew buildPlugin --no-configuration-cache
-
-      # Publish pre-release to JetBrains Marketplace nightly channel
-      - name: Publish Plugin to Marketplace (Nightly)
-        env:
-          PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }}
-          CERTIFICATE_CHAIN: ${{ secrets.CERTIFICATE_CHAIN }}
-          PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
-          PRIVATE_KEY_PASSWORD: ${{ secrets.PRIVATE_KEY_PASSWORD }}
-        run: ./gradlew publishPlugin --no-configuration-cache
-
-      # Prepare plugin archive content for creating artifact
-      - name: Prepare Plugin Artifact
-        id: artifact
-        shell: bash
-        run: |
-          cd ${{ github.workspace }}/build/distributions
-          FILENAME=`ls *.zip`
-          unzip "$FILENAME" -d content
-          
-          # Use the version-based filename for artifact
-          echo "filename=struts-intellij-plugin-v${{ 
steps.version.outputs.version }}" >> $GITHUB_OUTPUT
-
-      # Store already-built plugin as an artifact for downloading
-      - name: Upload artifact
-        uses: actions/upload-artifact@v6
-        with:
-          name: ${{ steps.artifact.outputs.filename }}
-          path: ./build/distributions/content/*/*
-
-      # Delete previous pre-release if it exists
-      - name: Delete Previous Pre-release
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          # Get the latest pre-release (excluding the current version we're 
about to create)
-          LATEST_PRERELEASE=$(gh release list --limit 50 --json 
tagName,isPrerelease --jq '.[] | select(.isPrerelease == true) | .tagName' | 
head -1 2>/dev/null || echo "")
-          
-          if [ -n "$LATEST_PRERELEASE" ] && [ "$LATEST_PRERELEASE" != "v${{ 
steps.version.outputs.version }}" ]; then
-            echo "Deleting previous pre-release: $LATEST_PRERELEASE"
-            gh release delete "$LATEST_PRERELEASE" --yes --cleanup-tag
-          else
-            echo "No previous pre-release found to delete"
-          fi
-
-      # Create a new pre-release
-      - name: Create Pre-release
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          CHANGELOG: ${{ steps.version.outputs.changelog }}
-        run: |
-          # Find the plugin zip file
-          PLUGIN_ZIP=$(find ./build/distributions -name "*.zip" -type f | head 
-1)
-
-          NOTES="🚀 **Pre-release v${{ steps.version.outputs.version }}**
-
-          This is an automated pre-release build from the main branch.
-
-          ## Changes
-          ${CHANGELOG}
-
-          ## Installation
-          Download the plugin zip file and install it manually in IntelliJ 
IDEA via:
-          \`Settings → Plugins → ⚙️ → Install Plugin from Disk...\`"
-
-          gh release create "v${{ steps.version.outputs.version }}" \
-            --prerelease \
-            --title "v${{ steps.version.outputs.version }}" \
-            --notes "$NOTES" \
-            "$PLUGIN_ZIP"
\ No newline at end of file
+          path: ${{ github.workspace }}/build/reports/pluginVerifier
\ No newline at end of file
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
new file mode 100644
index 0000000..2f075fe
--- /dev/null
+++ b/.github/workflows/nightly.yml
@@ -0,0 +1,198 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Nightly workflow for building and publishing pre-release plugin versions.
+#
+# Runs on a daily schedule (2:00 AM UTC) and checks if there are new commits
+# since the last pre-release. If changes are detected (or triggered manually),
+# it builds the plugin and publishes to the JetBrains Marketplace nightly 
channel
+# and creates a GitHub pre-release.
+
+name: Nightly
+on:
+  schedule:
+    - cron: '0 2 * * *'
+  workflow_dispatch:
+
+jobs:
+
+  # Check if there are new commits since the last pre-release
+  check-changes:
+    name: Check for changes
+    runs-on: ubuntu-latest
+    outputs:
+      has_changes: ${{ steps.check.outputs.has_changes }}
+    permissions:
+      contents: read
+    steps:
+
+      - name: Fetch Sources
+        uses: actions/checkout@v6
+        with:
+          fetch-depth: 0
+
+      - name: Check for new commits
+        id: check
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        run: |
+          # Fetch the tag from the latest GitHub pre-release
+          LATEST_TAG=$(gh release list --limit 50 --json tagName,isPrerelease \
+            --jq '.[] | select(.isPrerelease == true) | .tagName' | head -1)
+
+          if [ -z "$LATEST_TAG" ]; then
+            # No previous pre-release exists — first run, always build
+            echo "No previous pre-release found, will build"
+            echo "has_changes=true" >> $GITHUB_OUTPUT
+          else
+            # Count commits between last pre-release tag and HEAD
+            COUNT=$(git rev-list "${LATEST_TAG}..HEAD" --count 2>/dev/null || 
echo "999")
+            echo "Commits since ${LATEST_TAG}: ${COUNT}"
+            if [ "$COUNT" -gt 0 ]; then
+              echo "has_changes=true" >> $GITHUB_OUTPUT
+            else
+              echo "has_changes=false" >> $GITHUB_OUTPUT
+            fi
+          fi
+
+  # Build and publish nightly pre-release
+  nightly-release:
+    name: Nightly release
+    needs: [ check-changes ]
+    if: needs.check-changes.outputs.has_changes == 'true' || github.event_name 
== 'workflow_dispatch'
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+    steps:
+
+      # Check out the current repository
+      - name: Fetch Sources
+        uses: actions/checkout@v6
+
+      # Set up Java environment
+      - name: Setup Java
+        uses: actions/setup-java@v5
+        with:
+          distribution: zulu
+          java-version: 21
+
+      # Setup Gradle
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v5
+        with:
+          gradle-home-cache-cleanup: true
+
+      # Generate version for pre-release
+      - name: Generate Version
+        id: version
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        run: |
+          # Get branch number from gradle.properties
+          BRANCH=$(grep "pluginSinceBuild" gradle.properties | cut -d '=' -f2 
| tr -d ' ')
+
+          # Get the latest release version to determine next build number
+          LATEST_RELEASE=$(gh release list --limit 1 --json tagName --jq 
'.[0].tagName // "v242.18969.1"' 2>/dev/null || echo "v242.18969.1")
+          LATEST_BUILD=$(echo "$LATEST_RELEASE" | sed 
's/v[0-9]*\.\([0-9]*\)\.[0-9]*/\1/')
+
+          # Increment build number for nightly builds
+          BUILD=$((LATEST_BUILD + 1))
+
+          # Update pluginVersion in gradle.properties
+          sed -i "s/pluginVersion = [0-9]*\.[0-9]*\.[0-9]*/pluginVersion = 
${BRANCH}.${BUILD}-nightly.1/" gradle.properties
+
+          # Get final version and changelog
+          PROPERTIES="$(./gradlew properties --no-configuration-cache 
--console=plain -q)"
+          VERSION="$(echo "$PROPERTIES" | grep "^version:" | cut -f2- -d ' ')"
+          CHANGELOG="$(./gradlew getChangelog --no-configuration-cache 
--unreleased --no-header --console=plain -q)"
+
+          echo "version=$VERSION" >> $GITHUB_OUTPUT
+          echo "changelog<<EOF" >> $GITHUB_OUTPUT
+          echo "$CHANGELOG" >> $GITHUB_OUTPUT
+          echo "EOF" >> $GITHUB_OUTPUT
+
+      # Build plugin with new version
+      - name: Build Plugin
+        run: ./gradlew buildPlugin --no-configuration-cache
+
+      # Publish pre-release to JetBrains Marketplace nightly channel
+      - name: Publish Plugin to Marketplace (Nightly)
+        env:
+          PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }}
+          CERTIFICATE_CHAIN: ${{ secrets.CERTIFICATE_CHAIN }}
+          PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
+          PRIVATE_KEY_PASSWORD: ${{ secrets.PRIVATE_KEY_PASSWORD }}
+        run: ./gradlew publishPlugin --no-configuration-cache
+
+      # Prepare plugin archive content for creating artifact
+      - name: Prepare Plugin Artifact
+        id: artifact
+        shell: bash
+        run: |
+          cd ${{ github.workspace }}/build/distributions
+          FILENAME=$(ls *-signed.zip 2>/dev/null || ls *.zip | head -1)
+          unzip "$FILENAME" -d content
+
+          # Use the version-based filename for artifact
+          echo "filename=struts-intellij-plugin-v${{ 
steps.version.outputs.version }}" >> $GITHUB_OUTPUT
+
+      # Store already-built plugin as an artifact for downloading
+      - name: Upload artifact
+        uses: actions/upload-artifact@v6
+        with:
+          name: ${{ steps.artifact.outputs.filename }}
+          path: ./build/distributions/content/*/*
+
+      # Delete previous pre-release if it exists
+      - name: Delete Previous Pre-release
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        run: |
+          # Get the latest pre-release (excluding the current version we're 
about to create)
+          LATEST_PRERELEASE=$(gh release list --limit 50 --json 
tagName,isPrerelease --jq '.[] | select(.isPrerelease == true) | .tagName' | 
head -1 2>/dev/null || echo "")
+
+          if [ -n "$LATEST_PRERELEASE" ] && [ "$LATEST_PRERELEASE" != "v${{ 
steps.version.outputs.version }}" ]; then
+            echo "Deleting previous pre-release: $LATEST_PRERELEASE"
+            gh release delete "$LATEST_PRERELEASE" --yes --cleanup-tag
+          else
+            echo "No previous pre-release found to delete"
+          fi
+
+      # Create a new pre-release
+      - name: Create Pre-release
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          CHANGELOG: ${{ steps.version.outputs.changelog }}
+        run: |
+          # Find the plugin zip file
+          PLUGIN_ZIP=$(find ./build/distributions -name "*-signed.zip" -type f 
| head -1)
+          [ -z "$PLUGIN_ZIP" ] && PLUGIN_ZIP=$(find ./build/distributions 
-name "*.zip" -type f | head -1)
+
+          NOTES="🚀 **Nightly build v${{ steps.version.outputs.version }}**
+
+          This is an automated nightly build from the main branch.
+
+          ## Changes
+          ${CHANGELOG}
+
+          ## Installation
+          Download the plugin zip file and install it manually in IntelliJ 
IDEA via:
+          \`Settings → Plugins → ⚙️ → Install Plugin from Disk...\`"
+
+          gh release create "v${{ steps.version.outputs.version }}" \
+            --prerelease \
+            --title "v${{ steps.version.outputs.version }}" \
+            --notes "$NOTES" \
+            "$PLUGIN_ZIP"

Reply via email to