Skip to content

next version

next version #1971

Workflow file for this run

# 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,
# - 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
#
name: Build
on:
push:
# dependabot will create both branches and pull request
# only run on pull requests to avoid running twice and creating a release draft
branches-ignore:
- 'dependabot/**'
paths-ignore:
- 'doc/**'
- 'README.adoc'
- '.github/**/*.md'
- '.github/workflows/docs.yml'
- 'qodana.yml'
pull_request:
paths-ignore:
- 'doc/**'
- 'qodana.yaml'
- 'README.adoc'
- '.github/**/*.md'
- '.github/workflows/docs.yml'
concurrency:
# Only run once for latest commit per ref and cancel other (previous) runs.
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
# Build plugin with buildPlugin Gradle task and provide the artifact for the next workflow jobs
# Requires gradle validation job to be passed
build:
name: Build
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:
- name: Setup Java
uses: actions/[email protected]
with:
java-version: 21
distribution: 'corretto'
# Check out current repository
- name: Fetch Sources
uses: actions/checkout@v4
# Setup Gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
# Set environment variables
- name: Export Properties
id: properties
shell: bash
run: |
PROPERTIES="$(./gradlew properties --console=plain -q)"
VERSION="$(perl -0777 -ne '/=== ([.0-9]*)/s && print $1; ' CHANGELOG.adoc)"
NAME="asciidoctor-intellij-plugin"
CHANGELOG="$(perl -0777 -ne '/===.*?\n\s*(.*?)\s*===/s && print $1; ' CHANGELOG.adoc)"
ARTIFACT="${NAME}-${VERSION}.zip"
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "name=$NAME" >> $GITHUB_OUTPUT
echo "changelog<<EOF" >> $GITHUB_OUTPUT
echo "$CHANGELOG" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "artifact=$ARTIFACT" >> $GITHUB_OUTPUT
# Build artifact using buildPlugin Gradle task
- name: Build Plugin
run: ./gradlew check verifyPlugin buildPlugin
# Upload plugin artifact to make it available in the next jobs
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: plugin-artifact
path: ./build/distributions/${{ needs.build.outputs.artifact }}
if-no-files-found: error
# 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
runs-on: ubuntu-latest
steps:
# Check out current repository
- name: Fetch Sources
uses: actions/checkout@v4
# 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: |
gh api repos/${{ github.repository }}/releases \
--jq '.[] | select(.draft == true) | .id' \
| xargs -I '{}' gh api -X DELETE repos/${{ github.repository }}/releases/{}
# Create new release draft - which is not publicly visible and requires manual acceptance
- name: Create Release Draft
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release create "${{ needs.build.outputs.version }}" \
--draft \
--title "v${{ needs.build.outputs.version }}" \
--notes "$(cat << 'EOM'
${{ needs.build.outputs.changelog }}
EOM
)"
# Download plugin artifact provided by the previous job
- name: Download Artifact
uses: actions/download-artifact@v4
with:
name: plugin-artifact
# Upload artifact as a release asset
- name: Upload Release Asset
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload ${{ needs.build.outputs.version }} ./${{ needs.build.outputs.artifact }}
cleanup:
name: Cleanup old builds
# avoid 403 error with message "Resource not accessible by integration" (seen with dependabot)
if: github.event_name != 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Cleanup old runs
uses: actions/github-script@v7
# language=js
with:
script: |
const days_to_expiration = 30;
const ms_in_day = 86400000;
const now = Date.now();
let response = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 30,
workflow_id: 'build.yml'
});
// traverse from the end to delete from the end to not get confused when deleting items
let page = Math.ceil(response.data.total_count / 30)
while (page > 1) {
response = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
page: page,
workflow_id: 'build.yml'
});
for (const run of response.data.workflow_runs) {
const days_old = Math.ceil((now - Date.parse(run.created_at)) / ms_in_day)
if (days_old > days_to_expiration) {
console.log(`Run id ${run.id} is ${days_old} day old. Deleting...`);
await github.rest.actions.deleteWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: run.id
});
} else {
console.log(`Run id ${run.id} is ${days_old} day old. Keeping...`);
}
}
-- page
}