name: CI Pipeline for the Go API on: push: branches: - master jobs: docker-test: name: CI - 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: CI - 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: CI - 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: CD - Push Image to Gitea Registry runs-on: docker-latest needs: [docker-test, go-build] steps: - uses: actions/checkout@v3 - name: Compute image tag run: | TAG="${GITHUB_SHA:-${{ github.sha }}}" echo "TAG=$TAG" >> $GITHUB_ENV echo "TAG_SHORT=${TAG:0:12}" >> $GITHUB_ENV echo "BASE_IMAGE=git.petyaserver.uk/${{ secrets.REGISTRY_USER }}/go-api" >> $GITHUB_ENV - name: Docker login env: REGISTRY_USER: ${{ secrets.REGISTRY_USER }} REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} run: | echo "$REGISTRY_PASSWORD" | docker login git.petyaserver.uk -u "$REGISTRY_USER" --password-stdin - name: Build (latest + sha) run: | docker build -t "$BASE_IMAGE:$TAG" -t "$BASE_IMAGE:latest" . - name: Push (latest + sha) run: | docker push "$BASE_IMAGE:$TAG" docker push "$BASE_IMAGE:latest" k8s-some-test: name: CD - 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: CD - Kubernetes Deployment runs-on: docker-latest needs: [go-build, k8s-some-test, docker-push] steps: - 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: Compute image tag (again for this job) run: | TAG="${GITHUB_SHA:-${{ github.sha }}}" echo "TAG=$TAG" >> $GITHUB_ENV echo "BASE_IMAGE=git.petyaserver.uk/${{ secrets.REGISTRY_USER }}/go-api" >> $GITHUB_ENV echo "Will deploy image: ${BASE_IMAGE}:${TAG}" - name: Verify connection run: kubectl get nodes -o wide - name: Apply Deployment to Cluster run: kubectl apply -f k8s/deployment.yaml - name: Apply Service to Cluster run: kubectl apply -f k8s/service.yaml - name: Tag Image run: | kubectl set image deployment/go-api go-api="$BASE_IMAGE:$TAG" --record - name: Verify Rollout run: kubectl rollout status deployment/go-api --timeout=240s