name: CI/CD Pipeline on: push: branches: - develop tags: - 'v*' pull_request: types: [opened, synchronize, reopened] env: REGISTRY: labs.phundrak.com IMAGE_NAME: phundrak/roll-one-ring jobs: build-and-publish: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v5 - name: Install Nix uses: cachix/install-nix-action@v31.6.0 - name: Setup Cachix uses: cachix/cachix-action@v16 with: name: roll-one-ring authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' skipPush: ${{ github.event_name == 'pull_request' }} - name: Log in to Docker Hub uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Get version from Cargo.toml id: get-version run: | VERSION=$(nix run .#version 2>/dev/null || echo "unknown") echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Determine tags id: determine-tags run: | TAGS="" if [[ "${{ github.event_name }}" == "push" ]]; then if [[ "${{ github.ref }}" == "refs/heads/develop" ]]; then # Push to develop branch TAGS="${{ env.IMAGE_NAME }}:develop" elif [[ "${{ github.ref }}" == refs/tags/* ]]; then # Tag push VERSION_TAG=${GITHUB_REF#refs/tags/} # Remove 'v' prefix if present VERSION_TAG=${VERSION_TAG#v} TAGS="${{ env.IMAGE_NAME }}:latest,${{ env.IMAGE_NAME }}:${VERSION_TAG}" fi elif [[ "${{ github.event_name }}" == "pull_request" ]]; then # Pull request PR_NUMBER=${{ github.event.number }} TAGS="${{ env.IMAGE_NAME }}:pr${PR_NUMBER}" fi echo "tags=$TAGS" >> $GITHUB_OUTPUT echo "Tags to build: $TAGS" - name: Build Docker image with Nix run: | echo "Building Docker image..." nix build .#docker # Load the image into Docker docker load < result # Get the image ID that was just loaded IMAGE_ID=$(docker images --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}" | grep "${{ env.IMAGE_NAME }}:latest" | awk '{print $2}' | head -1) echo "Loaded image ID: $IMAGE_ID" echo "image_id=$IMAGE_ID" >> $GITHUB_ENV - name: Tag and push Docker image run: | TAGS="${{ steps.determine-tags.outputs.tags }}" if [ -n "$TAGS" ]; then IFS=',' read -ra TAG_ARRAY <<< "$TAGS" for tag in "${TAG_ARRAY[@]}"; do echo "Tagging and pushing: $tag" docker tag ${{ env.image_id }} "$tag" docker push "$tag" done fi - name: Output image tags run: | echo "Built and pushed the following tags:" echo "${{ steps.determine-tags.outputs.tags }}"