name: CI/CD Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main ] env: GO_VERSION: 1.19 REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: test: name: Run Tests runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up Go uses: actions/setup-go@v3 with: go-version: ${{ env.GO_VERSION }} cache: true - name: Download dependencies run: make deps - name: Run linter uses: golangci/golangci-lint-action@v3 with: version: latest args: --timeout=5m - name: Run tests run: make test - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: file: ./coverage.out flags: unittests name: codecov-umbrella fail_ci_if_error: false build: name: Build Application runs-on: ubuntu-latest needs: test steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up Go uses: actions/setup-go@v3 with: go-version: ${{ env.GO_VERSION }} cache: true - name: Download dependencies run: make deps - name: Build application run: make build - name: Upload build artifacts uses: actions/upload-artifact@v3 with: name: gorz-binary path: gorz docker-build: name: Build Docker Image runs-on: ubuntu-latest needs: build if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop' permissions: contents: read packages: write steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Log in to the Container registry uses: docker/login-action@v2 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v4 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=branch type=ref,event=pr type=sha,prefix={{branch}}- type=raw,value=latest,enable={{is_default_branch}} - name: Build and push Docker image uses: docker/build-push-action@v4 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 security-scan: name: Security Scan runs-on: ubuntu-latest needs: build steps: - name: Checkout code uses: actions/checkout@v3 - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: scan-type: 'fs' scan-ref: '.' format: 'sarif' output: 'trivy-results.sarif' - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v2 with: sarif_file: 'trivy-results.sarif' release: name: Create Release runs-on: ubuntu-latest needs: [test, build, docker-build, security-scan] if: github.ref == 'refs/heads/main' && startsWith(github.ref, 'refs/tags/v') permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 - name: Download build artifacts uses: actions/download-artifact@v3 with: name: gorz-binary - name: Create Release uses: softprops/action-gh-release@v1 with: files: gorz generate_release_notes: true draft: false prerelease: false