ci: add gitea ci/cd pipeline
This commit is contained in:
121
.gitea/workflows/README.md
Normal file
121
.gitea/workflows/README.md
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
# Gitea CI/CD Pipeline
|
||||||
|
|
||||||
|
This directory contains Gitea Actions workflows for automated code quality checks and Docker image publishing.
|
||||||
|
|
||||||
|
## Workflows
|
||||||
|
|
||||||
|
### 1. Code Quality (`code-quality.yml`)
|
||||||
|
|
||||||
|
Runs on every push to main and pull requests targeting main. This workflow:
|
||||||
|
|
||||||
|
- Sets up Elixir 1.15 with OTP 26
|
||||||
|
- Installs dependencies and restores caches for faster builds
|
||||||
|
- Checks for unused dependencies
|
||||||
|
- Compiles with warnings as errors (enforces clean compilation)
|
||||||
|
- Validates code formatting (`mix format --check-formatted`)
|
||||||
|
- Runs the full test suite
|
||||||
|
- Executes `mix precommit` to ensure all quality checks pass
|
||||||
|
|
||||||
|
**Important**: This workflow will fail if `mix precommit` hasn't been run locally, ensuring code quality standards are maintained.
|
||||||
|
|
||||||
|
### 2. Docker Build and Publish (`docker-build.yml`)
|
||||||
|
|
||||||
|
Publishes Docker images to the Gitea container registry:
|
||||||
|
|
||||||
|
- **Snapshot builds**: For every commit to main branch
|
||||||
|
- Tagged as: `latest`, `main`, `snapshot-{sha}`
|
||||||
|
- **Release builds**: For every tagged commit (e.g., `v1.0.0`)
|
||||||
|
- Tagged as: `{tag-name}`, `latest`
|
||||||
|
|
||||||
|
Features:
|
||||||
|
- Multi-platform builds (linux/amd64, linux/arm64)
|
||||||
|
- Build caching for faster subsequent builds
|
||||||
|
- Comprehensive metadata and labels
|
||||||
|
|
||||||
|
## Setup Requirements
|
||||||
|
|
||||||
|
### 1. Gitea Configuration
|
||||||
|
|
||||||
|
Update the `REGISTRY` environment variable in `docker-build.yml`:
|
||||||
|
```yaml
|
||||||
|
env:
|
||||||
|
REGISTRY: your-gitea-instance.com # Replace with your Gitea URL
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Required Secrets
|
||||||
|
|
||||||
|
Create the following secret in your Gitea repository settings:
|
||||||
|
|
||||||
|
- `GITEAX_TOKEN`: Personal Access Token with package write permissions
|
||||||
|
- Go to your Gitea instance → Settings → Applications → Generate New Token
|
||||||
|
- Select "write:packages" scope
|
||||||
|
- Add this token as a repository secret named `GITEAX_TOKEN`
|
||||||
|
|
||||||
|
> Gitea Actions currently do not support package repository authorization like GitHub Actions, so a PAT is necessary for publishing.
|
||||||
|
> See https://github.com/go-gitea/gitea/issues/23642#issuecomment-2119876692.
|
||||||
|
|
||||||
|
### 3. Container Registry
|
||||||
|
|
||||||
|
Enable the container registry in your Gitea instance if not already enabled. The published images will be available at:
|
||||||
|
```
|
||||||
|
{your-gitea-instance}/{owner}/components-elixir
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### For Developers
|
||||||
|
|
||||||
|
Before pushing code, always run:
|
||||||
|
```bash
|
||||||
|
mix precommit
|
||||||
|
```
|
||||||
|
|
||||||
|
This ensures your code will pass the CI quality checks.
|
||||||
|
|
||||||
|
### For Releases
|
||||||
|
|
||||||
|
To create a release:
|
||||||
|
1. Tag your commit: `git tag v1.0.0`
|
||||||
|
2. Push the tag: `git push origin v1.0.0`
|
||||||
|
3. The pipeline will automatically build and publish a release image
|
||||||
|
|
||||||
|
### For Snapshots
|
||||||
|
|
||||||
|
Snapshot builds are created automatically for every commit to the main branch.
|
||||||
|
|
||||||
|
## Docker Image Usage
|
||||||
|
|
||||||
|
Pull and run the latest snapshot:
|
||||||
|
```bash
|
||||||
|
docker pull {your-gitea-instance}/{owner}/components-elixir:latest
|
||||||
|
docker run -p 4000:4000 {your-gitea-instance}/{owner}/components-elixir:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Pull and run a specific release:
|
||||||
|
```bash
|
||||||
|
docker pull {your-gitea-instance}/{owner}/components-elixir:v1.0.0
|
||||||
|
docker run -p 4000:4000 {your-gitea-instance}/{owner}/components-elixir:v1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Gitea Actions Limitations
|
||||||
|
|
||||||
|
This pipeline is designed with Gitea Actions limitations in mind:
|
||||||
|
- No `concurrency`, `run-name`, `permissions`, or `timeout-minutes` support
|
||||||
|
- Limited expression support (only `always()` function)
|
||||||
|
- Simple `runs-on` syntax only
|
||||||
|
- No package repository authorization - uses Personal Access Token instead
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Authentication Issues
|
||||||
|
- Ensure `GITEAX_TOKEN` secret is properly set with package write permissions
|
||||||
|
- Verify the token hasn't expired
|
||||||
|
|
||||||
|
### Build Failures
|
||||||
|
- Check that `mix precommit` passes locally
|
||||||
|
- Ensure all tests pass with the test database configuration
|
||||||
|
- Verify Docker build works locally: `docker build -t test .`
|
||||||
|
|
||||||
|
### Registry Issues
|
||||||
|
- Confirm container registry is enabled in your Gitea instance
|
||||||
|
- Check that the registry URL in the workflow matches your Gitea instance
|
||||||
75
.gitea/workflows/code-quality.yml
Normal file
75
.gitea/workflows/code-quality.yml
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
name: Code Quality
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
pull_request:
|
||||||
|
branches: ["main"]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
code-quality:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Code Quality (Elixir ${{matrix.elixir}} OTP ${{matrix.otp}})
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
otp: ['26.0']
|
||||||
|
elixir: ['1.15']
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: postgres:15
|
||||||
|
ports: ['5432:5432']
|
||||||
|
env:
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
options: >-
|
||||||
|
--health-cmd pg_isready
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Elixir
|
||||||
|
uses: erlef/setup-beam@v1
|
||||||
|
with:
|
||||||
|
elixir-version: ${{matrix.elixir}}
|
||||||
|
otp-version: ${{matrix.otp}}
|
||||||
|
|
||||||
|
- name: Restore dependencies cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: deps
|
||||||
|
key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
|
||||||
|
restore-keys: ${{ runner.os }}-mix-
|
||||||
|
|
||||||
|
- name: Restore compiled code cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: _build
|
||||||
|
key: ${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles('**/mix.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: mix deps.get
|
||||||
|
|
||||||
|
- name: Check for unused dependencies
|
||||||
|
run: mix deps.unlock --check-unused
|
||||||
|
|
||||||
|
- name: Compile with warnings as errors
|
||||||
|
run: mix compile --warnings-as-errors
|
||||||
|
|
||||||
|
- name: Check code formatting
|
||||||
|
run: mix format --check-formatted
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: mix test
|
||||||
|
env:
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
|
||||||
|
- name: Run precommit (should pass if all above passed)
|
||||||
|
run: mix precommit
|
||||||
|
env:
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
69
.gitea/workflows/docker-build.yml
Normal file
69
.gitea/workflows/docker-build.yml
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
name: Docker Build and Publish
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
tags: ["v*"]
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: git.maxboeer.com
|
||||||
|
IMAGE_NAME: components-elixir
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker-build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Extract metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=ref,event=branch
|
||||||
|
type=ref,event=tag
|
||||||
|
type=raw,value=latest,enable={{is_default_branch}}
|
||||||
|
type=raw,value=snapshot-{{sha}},enable={{is_default_branch}}
|
||||||
|
|
||||||
|
- name: Log in to Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITEAX_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push Docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
build-args: |
|
||||||
|
ELIXIR_VERSION=1.15
|
||||||
|
OTP_VERSION=26
|
||||||
|
DEBIAN_VERSION=bookworm-slim
|
||||||
|
|
||||||
|
- name: Generate summary
|
||||||
|
run: |
|
||||||
|
echo "## Docker Build Summary" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Image**: \`${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}\`" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Tags**: " >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [[ "${{ github.ref_type }}" == "tag" ]]; then
|
||||||
|
echo "- **Build Type**: Release build for tag \`${{ github.ref_name }}\`" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "- **Build Type**: Snapshot build for branch \`${{ github.ref_name }}\`" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
echo "- **Commit**: \`${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY
|
||||||
@@ -7,7 +7,7 @@ import Config
|
|||||||
# Run `mix help test` for more information.
|
# Run `mix help test` for more information.
|
||||||
config :components_elixir, ComponentsElixir.Repo,
|
config :components_elixir, ComponentsElixir.Repo,
|
||||||
username: "postgres",
|
username: "postgres",
|
||||||
password: "fCnPB8VQdPkhJAD29hq6sZEY",
|
password: System.get_env("POSTGRES_PASSWORD") || "fCnPB8VQdPkhJAD29hq6sZEY",
|
||||||
hostname: "localhost",
|
hostname: "localhost",
|
||||||
database: "components_elixir_test#{System.get_env("MIX_TEST_PARTITION")}",
|
database: "components_elixir_test#{System.get_env("MIX_TEST_PARTITION")}",
|
||||||
pool: Ecto.Adapters.SQL.Sandbox,
|
pool: Ecto.Adapters.SQL.Sandbox,
|
||||||
|
|||||||
Reference in New Issue
Block a user