Update to support 2024.2 #844
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# GitHub Actions Workflow created for testing and preparing the plugin release in following steps: | |
# - compute properties | |
# - validate Gradle Wrapper, | |
# - run 'test' task, | |
# - run 'runPluginVerifier' task, | |
# - run 'buildPlugin' task and prepare artifact for the further tests, | |
# - create a 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 | |
name: Build | |
on: | |
push: | |
branches: [ '**' ] | |
pull_request: | |
branches: [ '**' ] | |
jobs: | |
# Compute Properties for other jobs to use | |
properties: | |
name: Compute Properties | |
runs-on: ubuntu-latest | |
outputs: | |
shouldRelease: ${{ steps._properties.outputs.shouldRelease == 'true' && github.ref == 'refs/heads/main' }} | |
shouldVerify: | |
${{ | |
( | |
(steps._properties.outputs.shouldRelease == 'true' && github.ref == 'refs/heads/main') | |
|| github.event_name == 'pull_request' | |
) | |
&& steps._properties.outputs.skipVerify == 'false' | |
|| steps._properties.outputs.shouldVerify == 'true' | |
}} | |
steps: | |
# Set environment variables | |
- name: Export Properties | |
id: _properties | |
shell: bash | |
run: | | |
SKIP_VERIFY="$(echo '${{ github.event.head_commit.message }}' | grep -Eq "\[\s*(skip|no)(\s*|-|_)verify\s*\]" && echo 'true' || echo 'false' )" | |
SHOULD_VERIFY="$(echo '${{ github.event.head_commit.message }}' | grep -Eq "\[\s*verify\s*\]" && echo 'true' || echo 'false' )" | |
SHOULD_RELEASE="$(echo '${{ github.event.head_commit.message }}' | grep -Eq "\[\s*release\s*\]" && echo 'true' || echo 'false' )" | |
echo "::set-output name=skipVerify::$SKIP_VERIFY" | |
echo "::set-output name=shouldVerify::$SHOULD_VERIFY" | |
echo "::set-output name=shouldRelease::$SHOULD_RELEASE" | |
# 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/[email protected] | |
# Validate wrapper | |
- name: Gradle Wrapper Validation | |
uses: gradle/[email protected] | |
# Run test Gradle tasks | |
test: | |
name: Test | |
needs: [ properties, gradleValidation ] | |
runs-on: ubuntu-latest | |
steps: | |
# Check out current repository | |
- name: Fetch Sources | |
uses: actions/[email protected] | |
# Setup Java 17 environment for the next steps | |
- name: Setup Java | |
uses: actions/setup-java@v4 | |
with: | |
distribution: corretto | |
java-version: 17 | |
cache: gradle | |
# Run tests | |
- name: Run Tests | |
run: ./gradlew test | |
# Collect Tests Result of failed tests | |
- name: Collect Tests Result | |
if: ${{ failure() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: tests-result | |
path: ${{ github.workspace }}/build/reports/tests | |
# Verify plugin using IntelliJ Plugin Verifier tool only on pull_requests as it takes a long time | |
# Run plugin structure verification along with IntelliJ Plugin Verifier | |
verify: | |
name: Verify plugin | |
if: needs.properties.outputs.shouldVerify == 'true' | |
needs: [ properties, gradleValidation ] | |
runs-on: ubuntu-latest | |
steps: | |
# Free GitHub Actions Environment Disk Space | |
- name: Maximize Build Space | |
uses: jlumbroso/free-disk-space@main | |
with: | |
tool-cache: false | |
large-packages: false | |
# Check out the current repository | |
- name: Fetch Sources | |
uses: actions/checkout@v4 | |
# Set up Java environment for the next steps | |
- name: Setup Java | |
uses: actions/setup-java@v4 | |
with: | |
distribution: zulu | |
java-version: 17 | |
# Setup Gradle | |
- name: Setup Gradle | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
gradle-home-cache-cleanup: true | |
# Cache Plugin Verifier IDEs | |
- name: Setup Plugin Verifier IDEs Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ needs.build.outputs.pluginVerifierHomeDir }}/ides | |
key: plugin-verifier-${{ hashFiles('build/listProductsReleases.txt') }} | |
# Run Verify Plugin task and IntelliJ Plugin Verifier tool | |
- name: Run Plugin Verification tasks | |
run: ./gradlew verifyPlugin -Dplugin.verifier.home.dir=${{ needs.build.outputs.pluginVerifierHomeDir }} | |
# Collect Plugin Verifier Result | |
- name: Collect Plugin Verifier Result | |
if: ${{ always() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: pluginVerifier-result | |
path: ${{ github.workspace }}/build/reports/pluginVerifier | |
# Build plugin and provide the artifact for the next workflow jobs | |
build: | |
name: Build | |
needs: [ properties, gradleValidation ] | |
runs-on: ubuntu-latest | |
outputs: | |
name: ${{ steps._properties.outputs.name }} | |
version: ${{ steps._properties.outputs.version }} | |
changelog: ${{ steps._properties.outputs.changelog }} | |
prerelease: ${{ contains(steps._properties.outputs.version,'-eap') }} | |
steps: | |
# Check out current repository | |
- name: Fetch Sources | |
uses: actions/[email protected] | |
# Setup Java 17 environment for the next steps | |
- name: Setup Java | |
uses: actions/setup-java@v4 | |
with: | |
distribution: corretto | |
java-version: 17 | |
cache: gradle | |
# insert Analytics secrets | |
- name: Applying Analytics Secrets | |
run: | | |
echo "analytics_api_secrets=${{ secrets.ANALYTICS_API_SECRETS }}" > src/main/resources/messages/secrets.properties | |
echo "analytics_measurement_id=${{ secrets.ANALYTICS_MEASUREMENT_ID }}" >> src/main/resources/messages/secrets.properties | |
# Build artifact using buildPlugin Gradle task | |
- name: Build Plugin | |
run: ./gradlew buildPlugin | |
# Set environment variables | |
- name: Export Properties | |
if: needs.properties.outputs.shouldRelease == 'true' | |
id: _properties | |
shell: bash | |
run: | | |
PROPERTIES="$(./gradlew properties --console=plain -q)" | |
VERSION="$(echo "$PROPERTIES" | grep "^version:" | cut -f2- -d ' ')" | |
NAME="$(echo "$PROPERTIES" | grep "^pluginName:" | cut -f2- -d ' ')" | |
CHANGELOG="$(./gradlew getChangelog --unreleased --no-header --console=plain -q)" | |
CHANGELOG="${CHANGELOG//'%'/'%25'}" | |
CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" | |
CHANGELOG="${CHANGELOG//$'\r'/'%0D'}" | |
echo "::set-output name=version::$VERSION" | |
echo "::set-output name=name::$NAME" | |
echo "::set-output name=changelog::$CHANGELOG" | |
# Prepare plugin archive content for creating artifact | |
- name: Prepare Plugin Artifact | |
if: needs.properties.outputs.shouldRelease == 'true' | |
id: artifact | |
shell: bash | |
run: | | |
cd ${{ github.workspace }}/build/distributions | |
FILENAME=`ls *.zip` | |
unzip "$FILENAME" -d content | |
echo "::set-output name=filename::$FILENAME" | |
# Store already-built plugin as an artifact for downloading | |
- name: Upload artifact | |
if: needs.properties.outputs.shouldRelease == 'true' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ steps.artifact.outputs.filename }} | |
path: ./build/distributions/content/*/* | |
# Publish a release for GitHub Releases page which in turn triggers release workflow | |
release: | |
name: Release | |
if: ${{ | |
always() | |
&& needs.properties.outputs.shouldRelease == 'true' | |
&& !contains(needs.*.result, 'failure') | |
&& !contains(needs.*.result, 'cancelled') | |
}} | |
needs: [ properties, build, verify, test ] | |
concurrency: | |
group: release | |
cancel-in-progress: true | |
runs-on: ubuntu-latest | |
steps: | |
# Check out current repository | |
- name: Fetch Sources | |
uses: actions/[email protected] | |
# Create new release | |
- name: Create Release | |
env: | |
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} | |
run: | | |
gh release create ${{ needs.build.outputs.version }} \ | |
${{ (needs.build.outputs.prerelease == 'true') && '--prerelease ' || '' }} \ | |
--title "${{ needs.build.outputs.version }}" \ | |
--notes "$(cat << 'EOM' | |
${{ needs.build.outputs.changelog }} | |
EOM | |
)" |