| name: Kernel-Auto-Release |
| |
| on: |
| workflow_dispatch: |
| inputs: |
| commit_id: |
| description: 'Commit ID' |
| required: true |
| default: 'HEAD' |
| version_number: |
| description: 'Version Number (Ex. 10.4.4)' |
| required: true |
| default: '10.4.4' |
| main_br_version: |
| description: "Version String for task.h on main branch (leave empty to leave as-is)." |
| required: false |
| default: '' |
| |
| jobs: |
| release-packager: |
| permissions: |
| contents: write |
| pull-requests: write |
| id-token: write |
| name: Release Packager |
| runs-on: ubuntu-latest |
| steps: |
| # Install python 3 |
| - name: Tool Setup |
| uses: actions/setup-python@v2 |
| with: |
| architecture: x64 |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: Install GitHub CLI |
| run: | |
| command -v gh >/dev/null 2>&1 || { |
| curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg |
| sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg |
| echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null |
| sudo apt update |
| sudo apt install gh |
| } |
| |
| # Currently FreeRTOS/.github/scripts houses the release script. Download it for upcoming usage |
| - name: Checkout FreeRTOS Release Tools |
| uses: actions/checkout@v4.1.1 |
| with: |
| repository: FreeRTOS/FreeRTOS |
| path: tools |
| |
| # Simpler git auth if we use checkout action and forward the repo to release script |
| - name: Checkout FreeRTOS Kernel |
| uses: actions/checkout@v4.1.1 |
| with: |
| path: local_kernel |
| fetch-depth: 0 |
| |
| - name: Configure git identity |
| env: |
| ACTOR: ${{ github.actor }} |
| run: | |
| git config --global user.name "$ACTOR" |
| git config --global user.email "$ACTOR"@users.noreply.github.com |
| |
| - name: Create version branch |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| COMMIT_ID: ${{ github.event.inputs.commit_id }} |
| working-directory: ./local_kernel |
| run: | |
| git checkout -b "$VERSION_NUMBER" "$COMMIT_ID" |
| git push -u origin "$VERSION_NUMBER" |
| echo "COMMIT_SHA_1=$(git rev-parse HEAD)" >> $GITHUB_ENV |
| |
| - name: Create release preparation branch |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| working-directory: ./local_kernel |
| run: | |
| git checkout -b "release-prep-$VERSION_NUMBER" |
| |
| - name: Update source files with version info |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| MAIN_BR_VERSION_NUMBER: ${{ github.event.inputs.main_br_version }} |
| COMMIT_SHA_1: ${{ env.COMMIT_SHA_1 }} |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| run: | |
| # Install deps and run |
| pip install -r ./tools/.github/scripts/release-requirements.txt |
| ./tools/.github/scripts/update_src_version.py FreeRTOS --kernel-repo-path=local_kernel --kernel-commit="$COMMIT_SHA_1" --new-kernel-version="$VERSION_NUMBER" --new-kernel-main-br-version="$MAIN_BR_VERSION_NUMBER" |
| exit $? |
| |
| - name: Update version number in manifest.yml |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| working-directory: ./local_kernel |
| run: | |
| ./.github/scripts/manifest_updater.py -v "$VERSION_NUMBER" |
| exit $? |
| |
| - name: Commit and push release preparation branch |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| working-directory: ./local_kernel |
| run: | |
| # The update_src_version.py script detaches HEAD by checking out a SHA. |
| # Re-attach HEAD to the release prep branch, keeping all commits. |
| git branch -f "release-prep-$VERSION_NUMBER" HEAD |
| git checkout "release-prep-$VERSION_NUMBER" |
| |
| git add . |
| if git diff --cached --quiet; then |
| echo "No new changes to commit — source files and manifest already up to date." |
| else |
| git commit -m '[AUTO][RELEASE]: Update version number in manifest.yml and source files' |
| fi |
| git push -u origin "release-prep-$VERSION_NUMBER" |
| |
| - name: Create pull request |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| REPO_FULL_NAME: ${{ github.repository }} |
| working-directory: ./local_kernel |
| run: | |
| PR_URL=$(gh pr create \ |
| --repo "$REPO_FULL_NAME" \ |
| --base "$VERSION_NUMBER" \ |
| --head "release-prep-$VERSION_NUMBER" \ |
| --title "[AUTO][RELEASE]: Release $VERSION_NUMBER" \ |
| --body "Automated release preparation for $VERSION_NUMBER. Updates version numbers in source files and manifest.yml.") |
| echo "PR_URL=$PR_URL" >> $GITHUB_ENV |
| |
| - name: Wait for PR to be merged |
| env: |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| REPO_FULL_NAME: ${{ github.repository }} |
| working-directory: ./local_kernel |
| run: | |
| PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$') |
| while true; do |
| STATE=$(gh pr view "$PR_NUMBER" --repo "$REPO_FULL_NAME" --json state --jq .state) |
| if [ "$STATE" = "MERGED" ]; then |
| echo "PR merged successfully" |
| break |
| elif [ "$STATE" = "CLOSED" ]; then |
| echo "Error: PR was closed without merging" |
| exit 1 |
| fi |
| echo "Waiting for PR to be merged... (current state: $STATE)" |
| sleep 30 |
| done |
| |
| - name: Re-checkout after merge |
| uses: actions/checkout@v4.1.1 |
| with: |
| path: local_kernel |
| ref: ${{ github.event.inputs.version_number }} |
| fetch-depth: 0 |
| |
| - name: Generate SBOM |
| uses: FreeRTOS/CI-CD-Github-Actions/sbom-generator@main |
| with: |
| directory: ./local_kernel |
| distribution-type: repository |
| creator: Amazon Web Services, Inc. |
| download-location: git+https://github.com/${{ github.repository_owner }}/${{ github.event.repository.name }}.git@${{ github.event.inputs.version_number }} |
| homepage: https://github.com/${{ github.repository_owner }}/${{ github.event.repository.name }} |
| namespace-prefix: https://github.com/${{ github.repository_owner }}/${{ github.event.repository.name }}/releases/download/V${{ github.event.inputs.version_number }}/ |
| include-file-hashes: true |
| |
| - name: Commit SBOM file |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| run: | |
| # SBOM generator writes files to the workspace root — copy them into the repo |
| cp *SPDX* ./local_kernel/ 2>/dev/null || cp *spdx* ./local_kernel/ 2>/dev/null || true |
| cd ./local_kernel |
| git add . |
| if git diff --cached --quiet; then |
| echo "No SBOM changes to commit." |
| else |
| git commit -m '[AUTO][RELEASE]: Update SBOM' |
| git push -u origin "$VERSION_NUMBER" |
| fi |
| echo "COMMIT_SHA_2=$(git rev-parse HEAD)" >> $GITHUB_ENV |
| |
| - name: Release |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| MAIN_BR_VERSION_NUMBER: ${{ github.event.inputs.main_br_version }} |
| COMMIT_SHA_2: ${{ env.COMMIT_SHA_2 }} |
| REPO_OWNER: ${{ github.repository_owner }} |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| run: | |
| # Install deps and run |
| pip install -r ./tools/.github/scripts/release-requirements.txt |
| ./tools/.github/scripts/release.py "$REPO_OWNER" --kernel-repo-path=local_kernel --kernel-commit="$COMMIT_SHA_2" --new-kernel-version="$VERSION_NUMBER" --new-kernel-main-br-version="$MAIN_BR_VERSION_NUMBER" |
| exit $? |
| |
| - name: Backup Release Asset |
| uses: FreeRTOS/CI-CD-Github-Actions/artifact-backup@main |
| with: |
| # This is dependent on the release script putting this zip file |
| # in this exact location. |
| artifact_path: ./FreeRTOS-KernelV${{ github.event.inputs.version_number }}.zip |
| release_tag: V${{ github.event.inputs.version_number }} |
| |
| - name: Delete release preparation branch |
| if: always() |
| env: |
| VERSION_NUMBER: ${{ github.event.inputs.version_number }} |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| working-directory: ./local_kernel |
| run: | |
| # Only delete release-prep branch if the PR was already merged |
| PR_STATE=$(gh pr list --repo "${{ github.repository }}" --head "release-prep-$VERSION_NUMBER" --json state --jq '.[0].state' 2>/dev/null || echo "") |
| if [ "$PR_STATE" = "MERGED" ] || [ -z "$PR_STATE" ]; then |
| git push origin --delete "release-prep-$VERSION_NUMBER" || true |
| else |
| echo "Skipping release-prep branch deletion — PR is still open (state: $PR_STATE)" |
| fi |