This repository was archived by the owner on Jul 12, 2025. It is now read-only.
Build OS Image #24
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build OS Image | |
| on: | |
| schedule: | |
| - cron: '0 0 */14 * *' # Every 2 weeks | |
| workflow_dispatch: | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| if: github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Important: get full history for merge-base | |
| - name: Check for new commits | |
| id: check-commits | |
| run: | | |
| # Get the latest release tag | |
| LATEST_TAG=$(curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{ secrets.UPLOAD_TOKEN }}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) | |
| # If no releases exist yet, we should proceed | |
| if [ "$LATEST_TAG" = "null" ]; then | |
| echo "No previous releases found - proceeding with build" | |
| echo "has_new_commits=true" >> $GITHUB_OUTPUT | |
| exit 0 | |
| fi | |
| # Check if there are any commits since the last release | |
| COMMITS_SINCE_LAST_RELEASE=$(git log $LATEST_TAG..HEAD --oneline | wc -l) | |
| if [ "$COMMITS_SINCE_LAST_RELEASE" -gt 0 ]; then | |
| echo "Found $COMMITS_SINCE_LAST_RELEASE new commits since last release - proceeding with build" | |
| echo "has_new_commits=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "No new commits since last release $LATEST_TAG - skipping build" | |
| echo "has_new_commits=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Install dependencies | |
| if: steps.check-commits.outputs.has_new_commits == 'true' | |
| run: | | |
| sudo apt update | |
| sudo apt install -y nasm gcc binutils qemu-system-x86_64 imagemagick curl jq | |
| - name: Convert logo-128.bmp to image.raw | |
| if: steps.check-commits.outputs.has_new_commits == 'true' | |
| run: | | |
| if [ -f logo-128.bmp ]; then | |
| convert logo-128.bmp -resize 320x200 -depth 8 -colors 256 rgb:image.raw | |
| # Verify image size | |
| size=$(wc -c < image.raw) | |
| if [ "$size" -ne 64000 ]; then | |
| echo "Error: image.raw is not 64000 bytes (is $size bytes)" | |
| exit 1 | |
| fi | |
| else | |
| echo "Warning: logo-128.bmp not found. Creating placeholder image.raw." | |
| # Create a placeholder image.raw (black with blue rectangle) | |
| dd if=/dev/zero of=image.raw bs=1 count=64000 2>/dev/null | |
| printf '\x01' | dd of=image.raw bs=1 seek=32100 count=50 conv=notrunc 2>/dev/null | |
| fi | |
| - name: Get latest release and compute next version | |
| if: steps.check-commits.outputs.has_new_commits == 'true' | |
| id: version | |
| run: | | |
| LATEST=$(curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{ secrets.UPLOAD_TOKEN }}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) | |
| echo "Latest release tag: $LATEST" | |
| if [[ "$LATEST" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then | |
| MAJOR="${BASH_REMATCH[1]}" | |
| MINOR="${BASH_REMATCH[2]}" | |
| PATCH="${BASH_REMATCH[3]}" | |
| else | |
| MAJOR=0; MINOR=0; PATCH=0 | |
| fi | |
| PATCH=$((PATCH + 1)) | |
| if [ $PATCH -ge 10 ]; then | |
| PATCH=0 | |
| MINOR=$((MINOR + 1)) | |
| fi | |
| if [ $MINOR -ge 10 ]; then | |
| MINOR=0 | |
| MAJOR=$((MAJOR + 1)) | |
| fi | |
| VERSION="v${MAJOR}.${MINOR}.${PATCH}" | |
| NAME="CopperOS - ${VERSION}" | |
| echo "Next version: $VERSION" | |
| echo "tag_name=$VERSION" >> $GITHUB_OUTPUT | |
| echo "version_name=$NAME" >> $GITHUB_OUTPUT | |
| - name: Build OS image | |
| if: steps.check-commits.outputs.has_new_commits == 'true' | |
| run: | | |
| nasm -f bin boot.asm -o boot.bin | |
| nasm -f bin boot32.asm -o boot32.bin | |
| nasm -f bin boot64.asm -o boot64.bin | |
| nasm -f bin second_stage.asm -o second_stage.bin | |
| gcc -ffreestanding -mcmodel=large -mno-red-zone -m64 -c kernel.c -o kernel.o -fno-pie -no-pie | |
| ld -T linker.ld -nostdlib kernel.o -o kernel.bin | |
| cat boot.bin second_stage.bin boot32.bin boot64.bin kernel.bin > os_image.bin | |
| - name: Github Actions Create Release | |
| if: steps.check-commits.outputs.has_new_commits == 'true' | |
| uses: idev-coder/github-actions-release@v1.0.0 | |
| with: | |
| github_token: ${{ secrets.UPLOAD_TOKEN }} | |
| tag: ${{ steps.version.outputs.tag_name }} | |
| body: "Release made by GitHub Actions..." | |
| name: ${{ steps.version.outputs.version_name }} | |
| env: | |
| RELEASE_TOKEN: ${{ secrets.UPLOAD_TOKEN }} | |
| - name: Publish Release Assets | |
| if: steps.check-commits.outputs.has_new_commits == 'true' | |
| uses: vinayaja/publish-release-assets@v1.1.0 | |
| with: | |
| gh-token: ${{ secrets.UPLOAD_TOKEN }} | |
| release-tag: ${{ steps.version.outputs.tag_name }} | |
| asset-names: "os_image.bin,image.raw" | |
| overwrite: false |