name: Publish Docker Image on: push: branches: - master jobs: tests: name: Run Tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '9.0.x' - name: Restore dependencies run: dotnet restore --verbosity normal - name: Build run: dotnet build --configuration Release --no-restore --verbosity normal - name: Run tests run: dotnet test --configuration Release --no-build --verbosity normal --logger "trx;LogFileName=test-results.trx" sonarqube: name: SonarQube Analysis runs-on: ubuntu-latest steps: - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: 17 distribution: 'zulu' - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '9.0.x' - name: Install SonarQube scanner run: | mkdir -p ~/.sonar/scanner dotnet tool install dotnet-sonarscanner --tool-path ~/.sonar/scanner - name: Restore dependencies run: dotnet restore --verbosity normal - name: Build and analyze env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | ~/.sonar/scanner/dotnet-sonarscanner begin \ /k:"ChatBot" \ /d:sonar.token="${{ secrets.SONAR_TOKEN }}" \ /d:sonar.host.url="${{ secrets.SONAR_HOST_URL }}" \ /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" \ /d:sonar.coverage.exclusions="**/Migrations/**/*.cs,**/*ModelSnapshot.cs,**/Migrations/*.cs,**/Program.cs" \ /d:sonar.exclusions="**/Migrations/**/*.cs,**/obj/**,**/bin/**,**/TestResults/**" \ /d:sonar.cpd.exclusions="**/Migrations/**/*.cs" \ /d:sonar.test.inclusions="**/*Tests.cs,**/ChatBot.Tests/**/*.cs" dotnet build --verbosity normal --no-incremental dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=./coverage/ /p:Exclude="[*]*.Migrations.*" /p:ExcludeByFile="**/Migrations/*.cs" ~/.sonar/scanner/dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" - name: Wait for Quality Gate run: | sleep 10 if ! command -v jq &> /dev/null; then sudo apt-get update && sudo apt-get install -y jq fi RESPONSE=$(curl -s -u "${{ secrets.SONAR_TOKEN }}:" \ "${{ secrets.SONAR_HOST_URL }}/api/qualitygates/project_status?projectKey=ChatBot") QUALITY_GATE_STATUS=$(echo "$RESPONSE" | jq -r '.projectStatus.status') if [ "$QUALITY_GATE_STATUS" != "OK" ]; then echo "❌ Quality Gate failed! Status: $QUALITY_GATE_STATUS" exit 1 else echo "✅ Quality Gate passed!" fi publish: name: Build and Publish to Harbor runs-on: ubuntu-latest needs: [tests, sonarqube] steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Harbor uses: docker/login-action@v3 with: registry: harbor.home username: robot$chatbot password: ${{ secrets.HARBOR_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: harbor.home/chatbot/chatbot tags: | type=ref,event=branch type=sha,prefix={{branch}}- type=raw,value=latest,enable={{is_default_branch}} - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: ./ChatBot file: ./ChatBot/Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=registry,ref=harbor.home/chatbot/chatbot:buildcache cache-to: type=registry,ref=harbor.home/chatbot/chatbot:buildcache,mode=max - name: Image digest run: echo "Image published with digest ${{ steps.build.outputs.digest }}"