CI Pipeline #71
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: CI Pipeline | |
| on: | |
| push: | |
| branches: [ dev ] | |
| pull_request: | |
| branches: [ dev ] | |
| workflow_dispatch: | |
| # Add explicit permissions for the workflow | |
| permissions: | |
| contents: write # For managing releases and pushing tags | |
| packages: write # For publishing to GitHub Container Registry | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v3 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Configure Git | |
| run: | | |
| git config user.name "GitHub Actions" | |
| git config user.email "actions@github.com" | |
| - name: Check if commit is from GitHub Actions | |
| id: check_actor | |
| run: | | |
| if [[ "${{ github.actor }}" == "github-actions" ]]; then | |
| echo "is_bot=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "is_bot=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Login to GitHub Container Registry | |
| uses: docker/login-action@v2 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Generate timestamp for build | |
| id: timestamp | |
| run: | | |
| TIMESTAMP=$(date -u +'%Y%m%d%H%M%S') | |
| echo "timestamp=${TIMESTAMP}" >> $GITHUB_OUTPUT | |
| - name: Extract version info | |
| id: version | |
| run: | | |
| VERSION=$(python -c "import version; print(version.__version__)") | |
| echo "version=${VERSION}" >> $GITHUB_OUTPUT | |
| echo "sha_short=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT | |
| - name: Set repository and image metadata | |
| id: meta | |
| run: | | |
| # Get lowercase repository owner | |
| REPO_OWNER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]') | |
| echo "repo_owner=${REPO_OWNER}" >> $GITHUB_OUTPUT | |
| # Get repository name | |
| REPO_NAME=$(echo "${{ github.repository }}" | cut -d '/' -f 2 | tr '[:upper:]' '[:lower:]') | |
| echo "repo_name=${REPO_NAME}" >> $GITHUB_OUTPUT | |
| # Determine branch name | |
| if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then | |
| echo "branch_tag=latest" >> $GITHUB_OUTPUT | |
| echo "is_main=true" >> $GITHUB_OUTPUT | |
| elif [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then | |
| echo "branch_tag=dev" >> $GITHUB_OUTPUT | |
| echo "is_main=false" >> $GITHUB_OUTPUT | |
| else | |
| # For other branches, use the branch name | |
| BRANCH=$(echo "${{ github.ref }}" | sed 's/refs\/heads\///' | sed 's/[^a-zA-Z0-9]/-/g') | |
| echo "branch_tag=${BRANCH}" >> $GITHUB_OUTPUT | |
| echo "is_main=false" >> $GITHUB_OUTPUT | |
| fi | |
| # Determine if this is from a fork | |
| if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then | |
| echo "is_fork=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "is_fork=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Build and push Docker image | |
| uses: docker/build-push-action@v4 | |
| with: | |
| context: . | |
| push: ${{ github.event_name != 'pull_request' }} | |
| platforms: linux/amd64 # Fast build - amd64 only | |
| tags: | | |
| ghcr.io/${{ steps.meta.outputs.repo_owner }}/${{ steps.meta.outputs.repo_name }}:${{ steps.meta.outputs.branch_tag }} | |
| ghcr.io/${{ steps.meta.outputs.repo_owner }}/${{ steps.meta.outputs.repo_name }}:${{ steps.version.outputs.version }}-${{ steps.timestamp.outputs.timestamp }} | |
| ghcr.io/${{ steps.meta.outputs.repo_owner }}/${{ steps.meta.outputs.repo_name }}:${{ steps.version.outputs.sha_short }} | |
| build-args: | | |
| REPO_OWNER=${{ steps.meta.outputs.repo_owner }} | |
| REPO_NAME=${{ steps.meta.outputs.repo_name }} | |
| BRANCH=${{ github.ref_name }} | |
| REPO_URL=https://github.com/${{ github.repository }} | |
| TIMESTAMP=${{ steps.timestamp.outputs.timestamp }} | |
| file: ./docker/Dockerfile |