# This composite action is designed for Gitea Actions runners. # Gitea Actions supports GitHub Actions syntax including $GITHUB_OUTPUT, # actions/cache, and actions/checkout. name: 'AI Code Review' description: 'Run AI-powered code review on a pull request using review-bot' inputs: gitea-url: description: 'Gitea instance URL (defaults to server_url)' required: false default: '' repo: description: 'Repository (owner/name, defaults to current)' required: false default: '' pr-number: description: 'Pull request number (defaults to current PR)' required: false default: '' reviewer-token: description: 'Gitea token for posting the review' required: true reviewer-name: description: 'Display name for the reviewer' required: false default: '' llm-base-url: description: 'OpenAI-compatible LLM API base URL' required: true llm-api-key: description: 'LLM API key' required: true llm-model: description: 'LLM model name' required: true conventions-file: description: 'Path to conventions file in the repo (e.g. CLAUDE.md)' required: false default: '' patterns-repo: description: 'Repo with language patterns (e.g. rodin/elixir-patterns)' required: false default: '' patterns-files: description: 'Comma-separated file paths to fetch from patterns repo' required: false default: 'README.md' temperature: description: 'LLM temperature (0 = server default)' required: false default: '0' version: description: 'review-bot version to install (e.g. v0.1.0, defaults to latest)' required: false default: 'latest' dry-run: description: 'Print review to stdout instead of posting' required: false default: 'false' runs: using: 'composite' steps: - name: Determine version id: version shell: bash run: | GITEA_URL="${{ inputs.gitea-url || github.server_url }}" REPO="${{ inputs.repo || 'rodin/review-bot' }}" if [ "${{ inputs.version }}" = "latest" ]; then VERSION=$(curl -sSf "${GITEA_URL}/api/v1/repos/${REPO}/releases?limit=1" \ | python3 -c "import sys, json; releases = json.load(sys.stdin); print(releases[0]['tag_name'] if releases else '')") if [ -z "$VERSION" ]; then echo "Failed to determine latest version" >&2 exit 1 fi else VERSION="${{ inputs.version }}" fi echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - name: Cache review-bot binary id: cache uses: actions/cache@v4 with: path: ${{ runner.temp }}/review-bot key: review-bot-linux-amd64-${{ steps.version.outputs.version }} - name: Install review-bot if: steps.cache.outputs.cache-hit != 'true' shell: bash run: | GITEA_URL="${{ inputs.gitea-url || github.server_url }}" REPO="${{ inputs.repo || 'rodin/review-bot' }}" VERSION="${{ steps.version.outputs.version }}" BINARY="review-bot-linux-amd64" curl -sSfL "${GITEA_URL}/${REPO}/releases/download/${VERSION}/${BINARY}" \ -o "${{ runner.temp }}/review-bot" curl -sSfL "${GITEA_URL}/${REPO}/releases/download/${VERSION}/checksums.txt" \ -o "${{ runner.temp }}/checksums.txt" # Verify SHA-256 checksum cd "${{ runner.temp }}" EXPECTED=$(grep "${BINARY}" checksums.txt | awk '{print $1}') ACTUAL=$(sha256sum review-bot | awk '{print $1}') if [ -z "$EXPECTED" ]; then echo "Error: no checksum found for ${BINARY}" >&2 exit 1 fi if [ "$EXPECTED" != "$ACTUAL" ]; then echo "Error: checksum mismatch!" >&2 echo " Expected: $EXPECTED" >&2 echo " Actual: $ACTUAL" >&2 exit 1 fi chmod +x "${{ runner.temp }}/review-bot" echo "Installed review-bot ${VERSION} (checksum verified)" - name: Run review shell: bash env: GITEA_URL: ${{ inputs.gitea-url || github.server_url }} GITEA_REPO: ${{ inputs.repo || github.repository }} PR_NUMBER: ${{ inputs.pr-number || github.event.pull_request.number }} REVIEWER_TOKEN: ${{ inputs.reviewer-token }} REVIEWER_NAME: ${{ inputs.reviewer-name }} LLM_BASE_URL: ${{ inputs.llm-base-url }} LLM_API_KEY: ${{ inputs.llm-api-key }} LLM_MODEL: ${{ inputs.llm-model }} CONVENTIONS_FILE: ${{ inputs.conventions-file }} PATTERNS_REPO: ${{ inputs.patterns-repo }} PATTERNS_FILES: ${{ inputs.patterns-files }} LLM_TEMPERATURE: ${{ inputs.temperature }} run: | ARGS="" if [ "${{ inputs.dry-run }}" = "true" ]; then ARGS="--dry-run" fi ${{ runner.temp }}/review-bot $ARGS