name: CI Pipeline for the Go API on: push: branches: - master jobs: docker-test: name: Docker Image Build Test runs-on: docker-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Build Docker image run: | docker build -t go-api-test . go-test: name: Go Vet (basic static check) runs-on: docker-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Check Go version run: go version - name: Go Vet (basic static check) run: go vet ./... go-build: name: Go Build & Cross-Compile runs-on: docker-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Check Go version run: go version - name: Build Linux binary run: | mkdir -p build go build -o build/go-api-linux main.go - name: Build Windows binary run: | GOOS=windows GOARCH=amd64 go build -o build/go-api.exe main.go - name: Show build output run: ls -lh build - name: Upload build artifacts uses: actions/upload-artifact@v3 with: name: go-api-binaries path: build/ docker-push: name: Push Image to Gitea Registry runs-on: docker-latest needs: [docker-test, go-build] steps: - uses: actions/checkout@v3 - name: Docker login env: REGISTRY_HOST: git.petyaserver.uk REGISTRY_USER: ${{ secrets.REGISTRY_USER }} REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} run: | : "${REGISTRY_HOST:=git.petyaserver.uk}" echo "$REGISTRY_PASSWORD" | docker login "$REGISTRY_HOST" -u "$REGISTRY_USER" --password-stdin - name: Build & push env: REGISTRY_HOST: git.petyaserver.uk REGISTRY_USER: ${{ secrets.REGISTRY_USER }} run: | : "${REGISTRY_HOST:=git.petyaserver.uk}" IMAGE="$REGISTRY_HOST/$REGISTRY_USER/go-api:latest" docker build -t "$IMAGE" . docker push "$IMAGE" k8s-some-test: name: Kubernetes Smoke Test runs-on: docker-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Configure kubeconfig run: | mkdir -p ~/.kube echo "$KUBECONFIG_GITEA" > ~/.kube/config chmod 600 ~/.kube/config env: KUBECONFIG_GITEA: ${{ secrets.KUBECONFIG_GITEA }} - name: Kubectl test run: kubectl version --client - name: K3S Cluster Connection Test run: kubectl get nodes -o wide k8s-deploy: name: Kubernetes Deployment runs-on: docker-latest needs: [go-build, k8s-some-test, docker-push] steps: - name: Checkout repository uses: actions/checkout@v3 - name: Configure kubeconfig run: | mkdir -p ~/.kube echo "$KUBECONFIG_GITEA" > ~/.kube/config chmod 600 ~/.kube/config env: KUBECONFIG_GITEA: ${{ secrets.KUBECONFIG_GITEA }} - name: Verify connection run: kubectl get nodes -o wide - name: Apply Deployment to Cluster run: kubectl apply -f k8s/service.yaml - name: Apply Service to Cluster run: kubectl apply -f k8s/deployment.yaml - name: Verify rollout run: kubectl rollout status deployment/go-api