name: "Build PyPI Nightly" on: workflow_dispatch: schedule: - cron: '0 0 * * 1-5' # Run at midnight UTC Monday through Friday jobs: calculate-version: name: "Calculate Version" runs-on: ubuntu-latest if: github.repository_owner == 'HumanSignal' outputs: version: ${{ steps.set-nightly-version.outputs.version }} steps: - name: Set nightly version id: set-nightly-version run: | set -e version=$(curl -s "https://raw.githubusercontent.com/HumanSignal/label-studio/refs/heads/${{ github.event.repository.default_branch }}/pyproject.toml" | grep '^version' | cut -d'"' -f2) version="${version%dev*}dev$(date +'%Y%m%d')" echo "version=${version}" >> $GITHUB_OUTPUT create-nightly-release: name: "Create Nightly Release" runs-on: ubuntu-latest if: github.repository_owner == 'HumanSignal' needs: calculate-version outputs: release_id: ${{ steps.create_release.outputs.id }} steps: - name: Get previous nightly release id: previous-nightly uses: actions/github-script@v8 with: github-token: ${{ secrets.GIT_PAT }} script: | const { repo, owner } = context.repo; try { const nightlyRelease = await github.rest.repos.getReleaseByTag({ owner, repo, tag: 'nightly' }); await github.rest.repos.deleteRelease({ owner, repo, release_id: nightlyRelease.data.id }); await github.rest.git.deleteRef({ owner, repo, ref: 'tags/nightly' }); } catch (error) { if (error.status === 404) { console.log('No previous nightly release found'); } else { throw error; } } - name: Generate Changelog uses: actions/github-script@v8 with: github-token: ${{ secrets.GIT_PAT }} script: | const { repo, owner } = context.repo; const latestRelease = await github.rest.repos.getLatestRelease({ owner, repo }); const latestTag = latestRelease.data.tag_name; const message = `# Nightly Build This is an automated nightly build that is recreated every night with the latest changes from the \`${{ github.event.repository.default_branch }}\` branch. ## Installation You can install this nightly build by downloading the wheel package (the file ending in \`.whl\`) from the \`Assets\` section below this description. After downloading, you can install it using the following commands from your terminal: For Windows: \`\`\`bash pip install %USERPROFILE%\\Downloads\\label_studio-${{ needs.calculate-version.outputs.version }}-py3-none-any.whl \`\`\` For macOS/Linux: \`\`\`bash pip install ~/Downloads/label_studio-${{ needs.calculate-version.outputs.version }}-py3-none-any.whl \`\`\` ## Important Notes - This is a development build and may contain bugs or incomplete features - Use in production environments is not recommended - Please report any issues you encounter in our [GitHub Issues](https://github.com/${owner}/${repo}/issues) - This release is automatically recreated every night with the latest changes ## Changes Changes since ${latestTag}: https://github.com/${owner}/${repo}/compare/${latestTag}...nightly`; const fs = require('fs'); fs.writeFileSync('${{ github.workspace }}-CHANGELOG.txt', message); - name: Create Nightly Release id: create_release uses: softprops/action-gh-release@v2.4.2 with: token: ${{ secrets.GIT_PAT }} body_path: ${{ github.workspace }}-CHANGELOG.txt tag_name: nightly name: ${{ needs.calculate-version.outputs.version }} generate_release_notes: false draft: false prerelease: true append_body: false build-pypi: name: "Build" if: github.repository_owner == 'HumanSignal' needs: [calculate-version, create-nightly-release] permissions: contents: write uses: ./.github/workflows/build_pypi.yml with: version: ${{ needs.calculate-version.outputs.version }} ref: ${{ github.ref_name }} upload_to_pypi: false release_type: nightly release-id: ${{ needs.create-nightly-release.outputs.release_id }} secrets: inherit notify_slack_on_failure: name: "Notify Slack on Failure" needs: - build-pypi - create-nightly-release runs-on: ubuntu-latest if: failure() steps: - name: Send Notification to Slack id: slack_notify_ops_release uses: slackapi/slack-github-action@v1.27 with: channel-id: 'C01RJV08UJK' slack-message: | ❌ Nightly PyPI build failed! > env: SLACK_BOT_TOKEN: ${{ secrets.SLACK_LSE_BOT_TOKEN }}