Skip to content

.github/workflows/publish-step-1.yml #5

.github/workflows/publish-step-1.yml

.github/workflows/publish-step-1.yml #5

# Manually triggered for creating a TA-Lib release.
#
# More info: README-DEVS.md
name: publish-step-1
# Controls when the workflow will run
on:
workflow_dispatch:
jobs:
create_release:
runs-on: ubuntu-latest
steps:
- name: Checkout main branch
uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0 # Fetch all history for all tags
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Prepare shell envs
shell: bash
run: |
VERSION=$(cat VERSION)
echo "VERSION=${VERSION}" >> $GITHUB_ENV
TAG="v${VERSION}"
echo "TAG=${TAG}" >> $GITHUB_ENV
echo "PYTHON=python3" >> $GITHUB_ENV
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Tagging
shell: bash
env:
TAG: ${{ env.TAG }}
run: |
# Ensure latest commit is tag with '$TAG'
LATEST_COMMIT=$(git rev-parse HEAD)
if git rev-parse --verify "$TAG" >/dev/null 2>&1; then
EXISTING_TAG_COMMIT=$(git rev-parse --verify "$TAG")
if [ "$LATEST_COMMIT" != "$EXISTING_TAG_COMMIT" ]; then
echo "Deleting tag $TAG on older commit $EXISTING_TAG_COMMIT"
git tag -d "$TAG"
git push --delete origin "$TAG"
else
echo "Tag $TAG already exists for latest commit. No changes needed."
exit 0
fi
fi
echo "Creating new tag $TAG on latest commit $LATEST_COMMIT"
git tag "$TAG"
git push origin "$TAG"
- name: Ensure Release exists and init release_vars
id: release_vars
uses: actions/github-script@v7
env:
TAG: ${{ env.TAG }}
with:
script: |
let tag_name = process.env.TAG;
console.log(`tag_name: ${tag_name}`);
let upload_url;
try {
// Check if the release already exists
const { data: releases } = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
});
let release = releases.find(release => release.tag_name === tag_name);
if (release) {
if (!release.draft) {
console.log(`Release for tag ${tag_name} is already published. Exiting with error.`);
core.setFailed(`Release for tag ${tag_name} is already published.`);
return;
}
console.log(`Release for tag ${tag_name} already exists.`);
// Update the release to point to potentially new commit (noop when no change)
release = await github.rest.repos.updateRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.id,
tag_name: tag_name,
target_commitish: context.sha,
});
upload_url = release.upload_url;
} else {
// Release does not exists, so create it.
const response = await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: tag_name,
name: tag_name,
draft: true,
prerelease: false,
});
if (response.status >= 200 && response.status < 300 && response.data.upload_url) {
console.log(`Release created with tag [${tag_name}]`);
upload_url = response.data.upload_url;
} else {
core.setFailed(`Failed to create release with tag [${tag_name}] Status: ${response.status}`);
return;
}
}
} catch (error) {
core.setFailed(`Error while listing or creating releases: ${error.message}`);
return;
}
console.log(`upload_url: ${upload_url}`);
core.setOutput("upload_url", upload_url);
outputs:
upload_url: ${{ steps.release_vars.outputs.upload_url }}