diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 70d86ad..9be205f 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -3,7 +3,15 @@
version: 2
updates:
+ # Maintain dependencies for Gradle dependencies
- package-ecosystem: "gradle"
directory: "/"
+ target-branch: "next"
+ schedule:
+ interval: "daily"
+ # Maintain dependencies for GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ target-branch: "next"
schedule:
interval: "daily"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f9ada39..6c59cf6 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,111 +1,58 @@
# GitHub Actions Workflow created for testing and preparing the plugin release in following steps:
# - validate Gradle Wrapper,
-# - run test and verifyPlugin tasks,
-# - run buildPlugin task and prepare artifact for the further tests,
-# - run IntelliJ Plugin Verifier,
+# - run 'test' and 'verifyPlugin' tasks,
+# - run Qodana inspections,
+# - run 'buildPlugin' task and prepare artifact for the further tests,
+# - run 'runPluginVerifier' task,
# - create a draft release.
#
# Workflow is triggered on push and pull_request events.
#
-# Docs:
-# - GitHub Actions: https://help.github.com/en/actions
-# - IntelliJ Plugin Verifier GitHub Action: https://github.com/ChrisCarini/intellij-platform-plugin-verifier-action
+# GitHub Actions reference: https://help.github.com/en/actions
#
## JBIJPPTPL
name: Build
-on: [push, pull_request]
+on:
+ # Trigger the workflow on pushes to only the 'main' branch (this avoids duplicate checks being run e.g. for dependabot pull requests)
+ push:
+ branches: [main]
+ # Trigger the workflow on any pull request
+ pull_request:
+
jobs:
# Run Gradle Wrapper Validation Action to verify the wrapper's checksum
- gradleValidation:
- name: Gradle Wrapper
- runs-on: ubuntu-latest
- steps:
-
- # Check out current repository
- - name: Fetch Sources
- uses: actions/checkout@v2
-
- # Validate wrapper
- - name: Gradle Wrapper Validation
- uses: gradle/wrapper-validation-action@v1.0.3
-
- # Run verifyPlugin and test Gradle tasks
- test:
- name: Test
- needs: gradleValidation
- runs-on: ubuntu-latest
- steps:
-
- # Setup Java 1.8 environment for the next steps
- - name: Setup Java
- uses: actions/setup-java@v1
- with:
- java-version: 11
-
- # Check out current repository
- - name: Fetch Sources
- uses: actions/checkout@v2
-
- # Cache Gradle dependencies
- - name: Setup Gradle Dependencies Cache
- uses: actions/cache@v2
- with:
- path: ~/.gradle/caches
- key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/*.gradle', '**/*.gradle.kts', 'gradle.properties') }}
-
- # Cache Gradle Wrapper
- - name: Setup Gradle Wrapper Cache
- uses: actions/cache@v2
- with:
- path: ~/.gradle/wrapper
- key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
-
- # Run detekt, ktlint and tests
- - name: Run Linters and Test
- run: ./gradlew check
-
- # Run verifyPlugin Gradle task
- - name: Verify Plugin
- run: ./gradlew verifyPlugin
-
- # Build plugin with buildPlugin Gradle task and provide the artifact for the next workflow jobs
- # Requires test job to be passed
+ # Run verifyPlugin, IntelliJ Plugin Verifier, and test Gradle tasks
+ # Build plugin and provide the artifact for the next workflow jobs
build:
name: Build
- needs: test
runs-on: ubuntu-latest
outputs:
- name: ${{ steps.properties.outputs.name }}
version: ${{ steps.properties.outputs.version }}
changelog: ${{ steps.properties.outputs.changelog }}
- artifact: ${{ steps.properties.outputs.artifact }}
steps:
- # Setup Java 1.8 environment for the next steps
- - name: Setup Java
- uses: actions/setup-java@v1
- with:
- java-version: 11
-
+ # Free GitHub Actions Environment Disk Space
+ - name: Maximize Build Space
+ run: |
+ sudo rm -rf /usr/share/dotnet
+ sudo rm -rf /usr/local/lib/android
+ sudo rm -rf /opt/ghc
# Check out current repository
- name: Fetch Sources
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
- # Cache Gradle Dependencies
- - name: Setup Gradle Dependencies Cache
- uses: actions/cache@v2
- with:
- path: ~/.gradle/caches
- key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/*.gradle', '**/*.gradle.kts', 'gradle.properties') }}
+ # Validate wrapper
+ - name: Gradle Wrapper Validation
+ uses: gradle/wrapper-validation-action@v1.0.4
- # Cache Gradle Wrapper
- - name: Setup Gradle Wrapper Cache
- uses: actions/cache@v2
+ # Setup Java 11 environment for the next steps
+ - name: Setup Java
+ uses: actions/setup-java@v3
with:
- path: ~/.gradle/wrapper
- key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
+ distribution: zulu
+ java-version: 11
# Set environment variables
- name: Export Properties
@@ -119,128 +66,91 @@ jobs:
CHANGELOG="${CHANGELOG//'%'/'%25'}"
CHANGELOG="${CHANGELOG//$'\n'/'%0A'}"
CHANGELOG="${CHANGELOG//$'\r'/'%0D'}"
- ARTIFACT="${NAME}-${VERSION}.zip"
-
echo "::set-output name=version::$VERSION"
echo "::set-output name=name::$NAME"
echo "::set-output name=changelog::$CHANGELOG"
- echo "::set-output name=artifact::$ARTIFACT"
-
- # Build artifact using buildPlugin Gradle task
- - name: Build Plugin
- run: ./gradlew buildPlugin
-
- # Upload plugin artifact to make it available in the next jobs
- - name: Upload artifact
- uses: actions/upload-artifact@v1
+ echo "::set-output name=pluginVerifierHomeDir::~/.pluginVerifier"
+ ./gradlew listProductsReleases # prepare list of IDEs for Plugin Verifier
+ # Run tests
+ - name: Run Tests
+ run: ./gradlew test
+
+ # Collect Tests Result of failed tests
+ - name: Collect Tests Result
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
with:
- name: plugin-artifact
- path: ./build/distributions/${{ steps.properties.outputs.artifact }}
-
- # Verify built plugin using IntelliJ Plugin Verifier tool
- # Requires build job to be passed
- verify:
- name: Verify
- needs: build
- runs-on: ubuntu-latest
- steps:
+ name: tests-result
+ path: ${{ github.workspace }}/build/reports/tests
- # Setup Java 1.8 environment for the next steps
- - name: Setup Java
- uses: actions/setup-java@v1
+ # Cache Plugin Verifier IDEs
+ - name: Setup Plugin Verifier IDEs Cache
+ uses: actions/cache@v3
with:
- java-version: 11
-
- # Check out current repository
- - name: Fetch Sources
- uses: actions/checkout@v2
+ path: ${{ steps.properties.outputs.pluginVerifierHomeDir }}/ides
+ key: plugin-verifier-${{ hashFiles('build/listProductsReleases.txt') }}
- # Cache Gradle Dependencies
- - name: Setup Gradle Dependencies Cache
- uses: actions/cache@v2
- with:
- path: ~/.gradle/caches
- key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/*.gradle', '**/*.gradle.kts', 'gradle.properties') }}
+ # Run Verify Plugin task and IntelliJ Plugin Verifier tool
+ - name: Run Plugin Verification tasks
+ run: ./gradlew runPluginVerifier -Pplugin.verifier.home.dir=${{ steps.properties.outputs.pluginVerifierHomeDir }}
- # Cache Gradle Wrapper
- - name: Setup Gradle Wrapper Cache
- uses: actions/cache@v2
+ # Collect Plugin Verifier Result
+ - name: Collect Plugin Verifier Result
+ if: ${{ always() }}
+ uses: actions/upload-artifact@v3
with:
- path: ~/.gradle/wrapper
- key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
+ name: pluginVerifier-result
+ path: ${{ github.workspace }}/build/reports/pluginVerifier
- # Set environment variables
- - name: Export Properties
- id: properties
+ # Prepare plugin archive content for creating artifact
+ - name: Prepare Plugin Artifact
+ id: artifact
shell: bash
run: |
- PROPERTIES="$(./gradlew properties --console=plain -q)"
- IDE_VERSIONS="$(echo "$PROPERTIES" | grep "^pluginVerifierIdeVersions:" | base64)"
+ cd ${{ github.workspace }}/build/distributions
+ FILENAME=`ls *.zip`
+ unzip "$FILENAME" -d content
+ echo "::set-output name=filename::${FILENAME:0:-4}"
- echo "::set-output name=ideVersions::$IDE_VERSIONS"
- echo "::set-output name=pluginVerifierHomeDir::~/.pluginVerifier"
-
- # Cache Plugin Verifier IDEs
- - name: Setup Plugin Verifier IDEs Cache
- uses: actions/cache@v2
+ # Store already-built plugin as an artifact for downloading
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
with:
- path: ${{ steps.properties.outputs.pluginVerifierHomeDir }}/ides
- key: ${{ runner.os }}-plugin-verifier-${{ steps.properties.outputs.ideVersions }}
-
- # Run IntelliJ Plugin Verifier action using GitHub Action
- - name: Verify Plugin
- run: ./gradlew runPluginVerifier -Pplugin.verifier.home.dir=${{ steps.properties.outputs.pluginVerifierHomeDir }}
+ name: ${{ steps.artifact.outputs.filename }}
+ path: ./build/distributions/content/*/*
# Prepare a draft release for GitHub Releases page for the manual verification
# If accepted and published, release workflow would be triggered
releaseDraft:
name: Release Draft
if: github.event_name != 'pull_request'
- needs: [build, verify]
+ needs: build
runs-on: ubuntu-latest
+ permissions:
+ contents: write
steps:
# Check out current repository
- name: Fetch Sources
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
# Remove old release drafts by using the curl request for the available releases with draft flag
- name: Remove Old Release Drafts
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
- curl -H "Authorization: Bearer $GITHUB_TOKEN" https://api.github.com/repos/$GITHUB_REPOSITORY/releases \
- | tr '\r\n' ' ' \
- | jq '.[] | select(.draft == true) | .id' \
- | xargs -I '{}' \
- curl -X DELETE -H "Authorization: Bearer $GITHUB_TOKEN" https://api.github.com/repos/$GITHUB_REPOSITORY/releases/{}
-
+ gh api repos/{owner}/{repo}/releases \
+ --jq '.[] | select(.draft == true) | .id' \
+ | xargs -I '{}' gh api -X DELETE repos/{owner}/{repo}/releases/{}
# Create new release draft - which is not publicly visible and requires manual acceptance
- name: Create Release Draft
- id: createDraft
- uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- tag_name: v${{ needs.build.outputs.version }}
- release_name: v${{ needs.build.outputs.version }}
- body: ${{ needs.build.outputs.changelog }}
- draft: true
-
- # Download plugin artifact provided by the previous job
- - name: Download Artifact
- uses: actions/download-artifact@v2
- with:
- name: plugin-artifact
-
- # Upload artifact as a release asset
- - name: Upload Release Asset
- id: upload-release-asset
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.createDraft.outputs.upload_url }}
- asset_path: ./${{ needs.build.outputs.artifact }}
- asset_name: ${{ needs.build.outputs.artifact }}
- asset_content_type: application/zip
+ run: |
+ gh release create v${{ needs.build.outputs.version }} \
+ --draft \
+ --title "v${{ needs.build.outputs.version }}" \
+ --notes "$(cat << 'EOM'
+ ${{ needs.build.outputs.changelog }}
+ EOM
+ )"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index a7afcbe..add5d95 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -12,59 +12,75 @@ jobs:
release:
name: Publish Plugin
runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
steps:
- # Setup Java 1.8 environment for the next steps
- - name: Setup Java
- uses: actions/setup-java@v1
- with:
- java-version: 11
-
# Check out current repository
- name: Fetch Sources
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
with:
ref: ${{ github.event.release.tag_name }}
+ # Setup Java 11 environment for the next steps
+ - name: Setup Java
+ uses: actions/setup-java@v3
+ with:
+ distribution: zulu
+ java-version: 11
+
+ # Set environment variables
+ - name: Export Properties
+ id: properties
+ shell: bash
+ run: |
+ CHANGELOG="$(cat << 'EOM' | sed -e 's/^[[:space:]]*$//g' -e '/./,$!d'
+ ${{ github.event.release.body }}
+ EOM
+ )"
+
+ CHANGELOG="${CHANGELOG//'%'/'%25'}"
+ CHANGELOG="${CHANGELOG//$'\n'/'%0A'}"
+ CHANGELOG="${CHANGELOG//$'\r'/'%0D'}"
+ echo "::set-output name=changelog::$CHANGELOG"
+ # Update Unreleased section with the current release note
+ - name: Patch Changelog
+ if: ${{ steps.properties.outputs.changelog != '' }}
+ env:
+ CHANGELOG: ${{ steps.properties.outputs.changelog }}
+ run: |
+ ./gradlew patchChangelog --release-note="$CHANGELOG"
# Publish the plugin to the Marketplace
- name: Publish Plugin
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
- # Patch changelog, commit and push to the current repository
- changelog:
- name: Update Changelog
- needs: release
- runs-on: ubuntu-latest
- steps:
-
- # Setup Java 1.8 environment for the next steps
- - name: Setup Java
- uses: actions/setup-java@v1
- with:
- java-version: 11
-
- # Check out current repository
- - name: Fetch Sources
- uses: actions/checkout@v2
- with:
- ref: ${{ github.event.release.tag_name }}
-
- # Update Unreleased section with the current version
- - name: Patch Changelog
- run: ./gradlew patchChangelog
+ # Upload artifact as a release asset
+ - name: Upload Release Asset
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: gh release upload ${{ github.event.release.tag_name }} ./build/distributions/*
- # Commit patched Changelog
- - name: Commit files
+ # Create pull request
+ - name: Create Pull Request
+ if: ${{ steps.properties.outputs.changelog != '' }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
- git config --local user.email "action@github.com"
- git config --local user.name "GitHub Action"
- git commit -m "Update changelog" -a
-
- # Push changes
- - name: Push changes
- uses: ad-m/github-push-action@master
- with:
- branch: main
- github_token: ${{ secrets.GITHUB_TOKEN }}
+ VERSION="${{ github.event.release.tag_name }}"
+ BRANCH="changelog-update-$VERSION"
+ git config user.email "action@github.com"
+ git config user.name "GitHub Action"
+ git checkout -b $BRANCH
+ git commit -am "Changelog update - $VERSION"
+ git push --set-upstream origin $BRANCH
+ gh pr create \
+ --title "Changelog update - \`$VERSION\`" \
+ --body "Current pull request contains patched \`CHANGELOG.md\` file for the \`$VERSION\` version." \
+ --base main \
+ --head $BRANCH
diff --git a/.github/workflows/run-ui-tests.yml b/.github/workflows/run-ui-tests.yml
new file mode 100644
index 0000000..1e4456d
--- /dev/null
+++ b/.github/workflows/run-ui-tests.yml
@@ -0,0 +1,59 @@
+# GitHub Actions Workflow for launching UI tests on Linux, Windows, and Mac in the following steps:
+# - prepare and launch IDE with your plugin and robot-server plugin, which is needed to interact with UI
+# - wait for IDE to start
+# - run UI tests with separate Gradle task
+#
+# Please check https://github.com/JetBrains/intellij-ui-test-robot for information about UI tests with IntelliJ Platform
+#
+# Workflow is triggered manually.
+
+name: Run UI Tests
+on:
+ workflow_dispatch
+
+jobs:
+
+ testUI:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - os: ubuntu-latest
+ runIde: |
+ export DISPLAY=:99.0
+ Xvfb -ac :99 -screen 0 1920x1080x16 &
+ gradle runIdeForUiTests &
+ - os: windows-latest
+ runIde: start gradlew.bat runIdeForUiTests
+ - os: macos-latest
+ runIde: ./gradlew runIdeForUiTests &
+
+ steps:
+
+ # Check out current repository
+ - name: Fetch Sources
+ uses: actions/checkout@v3
+
+ # Setup Java 11 environment for the next steps
+ - name: Setup Java
+ uses: actions/setup-java@v3
+ with:
+ distribution: zulu
+ java-version: 11
+
+ # Run IDEA prepared for UI testing
+ - name: Run IDE
+ run: ${{ matrix.runIde }}
+
+ # Wait for IDEA to be started
+ - name: Health Check
+ uses: jtalk/url-health-check-action@v2
+ with:
+ url: http://127.0.0.1:8082
+ max-attempts: 15
+ retry-delay: 30s
+
+ # Run tests
+ - name: Tests
+ run: ./gradlew test
diff --git a/.run/Run IDE for UI Tests.run.xml b/.run/Run IDE for UI Tests.run.xml
new file mode 100644
index 0000000..e119d59
--- /dev/null
+++ b/.run/Run IDE for UI Tests.run.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ false
+
+
+
diff --git a/.run/Run Plugin Tests.run.xml b/.run/Run Plugin Tests.run.xml
index 03d0287..ae9ae13 100644
--- a/.run/Run Plugin Tests.run.xml
+++ b/.run/Run Plugin Tests.run.xml
@@ -11,7 +11,7 @@
@@ -21,4 +21,4 @@
false
-
\ No newline at end of file
+