Skip to content

Create release info json #123

Create release info json

Create release info json #123

Workflow file for this run

name: Create release info json
on:
release:
types: [published, prereleased]
jobs:
generate-release-json:
runs-on: windows-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get branch name, commit SHA, tag name, release name, release date, release time, and first commit SHA
id: get_branch_commit
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
$commit_sha = $(git rev-list -n 1 $env:GITHUB_REF)
$branch_name = $(git branch -r --contains $commit_sha | Select-String -Pattern 'origin/' | ForEach-Object { $_.ToString().Trim() -replace 'origin/', '' } | Sort-Object -Descending | Select-Object -First 1)
$release_info = (Invoke-RestMethod -Uri "https://api.github.com/repos/${{ github.repository_owner }}/${{ github.event.repository.name }}/releases/tags/${{ github.event.release.tag_name }}" -Headers @{"Authorization"="token ${{ secrets.GITHUB_TOKEN }}"})
$release_name = $release_info.name
$published_at = $release_info.published_at.ToString("yyyy-MM-ddTHH:mm:ssZ")
$release_date = $published_at.Split("T")[0]
$release_time = $published_at.Split("T")[1].Split("Z")[0]
$first_commit = $(git rev-list --max-parents=0 HEAD)
echo "BRANCH_NAME=$branch_name" >> $env:GITHUB_ENV
echo "COMMIT_SHA=$commit_sha" >> $env:GITHUB_ENV
echo "TAG_NAME=${{ github.event.release.tag_name }}" >> $env:GITHUB_ENV
echo "RELEASE_NAME=$release_name" >> $env:GITHUB_ENV
echo "RELEASE_DATE=$release_date" >> $env:GITHUB_ENV
echo "RELEASE_TIME=$release_time" >> $env:GITHUB_ENV
echo "FIRST_COMMIT=$first_commit" >> $env:GITHUB_ENV
- name: Verify and display branch name, commit SHA, tag name, release name, release date, release time, and first commit SHA
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
if ($env:BRANCH_NAME -eq "") {
Write-Host "Branch name is empty. Exiting..."
exit 1
}
Write-Host "Branch name is: $env:BRANCH_NAME"
Write-Host "Commit SHA is: $env:COMMIT_SHA"
Write-Host "Tag Name is: $env:TAG_NAME"
Write-Host "Release Name is: $env:RELEASE_NAME"
Write-Host "Release Date is: $env:RELEASE_DATE"
Write-Host "Release Time is: $env:RELEASE_TIME"
Write-Host "First Commit SHA is: $env:FIRST_COMMIT"
- name: Checkout release branch and ensure HEAD is not detached
run: |
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
git fetch origin
git checkout $env:BRANCH_NAME
#git checkout $env:COMMIT_SHA
git switch -C temp-branch
git switch $env:BRANCH_NAME
shell: pwsh
- name: Ensure branch is writable
run: |
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
#git pull origin $env:BRANCH_NAME
$branchStatus = git status
Write-Host "Branch status: $branchStatus"
if ($branchStatus -match 'Your branch is up to date with') {
echo "Branch $env:BRANCH_NAME is writable."
} else {
throw "Branch $env:BRANCH_NAME is not writable. Status: $branchStatus"
}
shell: pwsh
- name: Generate JSONs
run: |
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
$releases = Invoke-RestMethod -Uri "https://api.github.com/repos/${{ github.repository }}/releases" -Headers @{"Authorization"="token ${{ secrets.GITHUB_TOKEN }}"}
$sortedReleases = $releases | Sort-Object {[datetime]::Parse($_.published_at)} -Descending
$owner = '${{ github.repository_owner }}'
$repo = '${{ github.event.repository.name }}'
$releaseObjs = $sortedReleases | Where-Object { -not $_.prerelease } | ForEach-Object {
$tag_commit_info = (Invoke-RestMethod -Uri "https://api.github.com/repos/${{ github.repository_owner }}/${{ github.event.repository.name }}/git/refs/tags/$($_.tag_name)" -Headers @{"Authorization"="token ${{ secrets.GITHUB_TOKEN }}"})
$commit_sha = $tag_commit_info.object.sha
if ($tag_commit_info.object.type -eq "tag") {
$commit_info = (Invoke-RestMethod -Uri $tag_commit_info.object.url -Headers @{"Authorization"="token ${{ secrets.GITHUB_TOKEN }}"})
$commit_sha = $commit_info.object.sha
}
$downloads = $_.assets | ForEach-Object {
[PSCustomObject]@{
name = $_.name
url = $_.browser_download_url
count = $_.download_count
}
}
[PSCustomObject]@{
owner = $owner
repo = $repo
branch = $_.target_commitish
commit = $commit_sha
details = [PSCustomObject]@{
name = $_.name
tag = $_.tag_name
date = ([datetime]::Parse($_.published_at)).ToString('yyyy-MM-dd')
time = ([datetime]::Parse($_.published_at)).ToString('HH:mm:ss')
downloads = $downloads
}
}
}
$prereleaseObjs = $sortedReleases | Where-Object { $_.prerelease } | ForEach-Object {
$tag_commit_info = (Invoke-RestMethod -Uri "https://api.github.com/repos/${{ github.repository_owner }}/${{ github.event.repository.name }}/git/refs/tags/$($_.tag_name)" -Headers @{"Authorization"="token ${{ secrets.GITHUB_TOKEN }}"})
$commit_sha = $tag_commit_info.object.sha
if ($tag_commit_info.object.type -eq "tag") {
$commit_info = (Invoke-RestMethod -Uri $tag_commit_info.object.url -Headers @{"Authorization"="token ${{ secrets.GITHUB_TOKEN }}"})
$commit_sha = $commit_info.object.sha
}
$downloads = $_.assets | ForEach-Object {
[PSCustomObject]@{
name = $_.name
url = $_.browser_download_url
count = $_.download_count
}
}
[PSCustomObject]@{
owner = $owner
repo = $repo
branch = $_.target_commitish
commit = $commit_sha
details = [PSCustomObject]@{
name = $_.name
tag = $_.tag_name
date = ([datetime]::Parse($_.published_at)).ToString('yyyy-MM-dd')
time = ([datetime]::Parse($_.published_at)).ToString('HH:mm:ss')
downloads = $downloads
}
}
}
$releaseObjs | ConvertTo-Json -Depth 100 > releases.json
$prereleaseObjs | ConvertTo-Json -Depth 100 > prereleases.json
shell: pwsh
- name: Commit and force push JSONs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
git config --global user.name '${{ github.actor }}'
git config --global user.email '${{ github.actor }}@users.noreply.github.com'
if (Test-Path -Path releases.json) {
git add releases.json
}
if (Test-Path -Path prereleases.json) {
git add prereleases.json
}
git commit --amend --no-edit
git push --force-with-lease
shell: pwsh
- name: Update release tag to point to new commit SHA
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
$tag_name = "${{ github.event.release.tag_name }}"
$commit_sha = "${{ env.COMMIT_SHA }}"
git fetch origin
git tag -d $tag_name
git tag $tag_name $commit_sha
git push origin :refs/tags/$tag_name
git push origin refs/tags/$tag_name