name: Gitea CI/CD on: workflow_dispatch: push: branches: [ "development", "main", "staging" ] tags: [ "v*.*.*" ] env: DOTNET_VERSION: '8.0.x' DOCKER_IMAGE_NAME: watcher REGISTRY_URL: git.triggermeelmo.com DOCKER_PLATFORMS: 'linux/amd64,linux/arm64' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build-and-test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup .NET SDK uses: actions/setup-dotnet@v3 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - name: Test run: dotnet test --no-build --verbosity normal continue-on-error: true - name: Publish run: dotnet publish -c Release -o out set-tag: name: Set Tag Name needs: [build-and-test] #if: ${{ !failure() && !cancelled() && github.event_name != 'pull_request' }} runs-on: ubuntu-latest outputs: tag_name: ${{ steps.set_tag.outputs.tag_name }} should_tag: ${{ steps.set_tag.outputs.should_tag }} steps: - uses: actions/checkout@v4 - name: Determine next semantic version tag id: set_tag run: | git fetch --tags # Find latest tag matching vX.Y.Z latest_tag=$(git tag --list 'v*.*.*' --sort=-v:refname | head -n 1) if [[ -z "$latest_tag" ]]; then major=0 minor=0 patch=0 else version="${latest_tag#v}" IFS='.' read -r major minor patch <<< "$version" fi if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then major=$((major + 1)) minor=0 patch=0 new_tag="v${major}.${minor}.${patch}" echo "tag_name=${new_tag}" >> $GITHUB_OUTPUT echo "should_tag=true" >> $GITHUB_OUTPUT echo "Creating new major version tag: ${new_tag}" elif [[ "${GITHUB_REF}" == "refs/heads/development" ]]; then minor=$((minor + 1)) patch=0 new_tag="v${major}.${minor}.${patch}" echo "tag_name=${new_tag}" >> $GITHUB_OUTPUT echo "should_tag=true" >> $GITHUB_OUTPUT echo "Creating new minor version tag: ${new_tag}" elif [[ "${GITHUB_REF}" == "refs/heads/staging" ]]; then patch=$((patch + 1)) new_tag="v${major}.${minor}.${patch}" echo "tag_name=${new_tag}" >> $GITHUB_OUTPUT echo "should_tag=true" >> $GITHUB_OUTPUT echo "Creating new patch version tag: ${new_tag}" fi docker-build-and-push: runs-on: ubuntu-latest needs: [build-and-test, set-tag] if: | needs.set-tag.outputs.should_tag == 'true' && github.event_name != 'pull_request' steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to Gitea Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY_URL}} username: ${{ secrets.AUTOMATION_USERNAME }} password: ${{ secrets.AUTOMATION_PASSWORD }} - name: Build and Push Multi-Arch Docker Image run: | docker buildx build \ --platform ${{ env.DOCKER_PLATFORMS }} \ -t ${{ env.REGISTRY_URL }}/watcher/${{ env.DOCKER_IMAGE_NAME }}:${{ needs.set-tag.outputs.tag_name }} \ --push . tag: name: Create Tag needs: [docker-build-and-push, set-tag] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Git user run: | git config user.name "GitHub Actions" git config user.email "actions@github.com" - name: Create and push tag env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | echo "Creating new tag: ${{ needs.set-tag.outputs.tag_name }}" git tag ${{ needs.set-tag.outputs.tag_name }} git push origin ${{ needs.set-tag.outputs.tag_name }}