diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..ac1335b9f --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,99 @@ +name: CI Pipeline + +on: + pull_request: + branches: + - main + push: + branches: + - main +env: + docker_username: ${{ github.actor }} + docker_password: ${{ secrets.GITHUB_TOKEN }} + GIT_COMMIT: ${{ github.sha }} +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: 1.16 + + - name: Build the frontend application + run: bash CI/build-frontend.sh + + - name: Run frontend test + run: bash CI/test-frontend.sh + + - name: Run backend test + run: bash CI/test-backend.sh + + - name: Upload repo + uses: actions/upload-artifact@v4 + with: + name: code + path: . + Linting: + runs-on: ubuntu-latest + needs: [build] + steps: + - name: Download code + uses: actions/download-artifact@v4 + with: + name: code + path: . + - name: run linting + uses: super-linter/super-linter/slim@v5 + env: + DEFAULT_BRANCH: main + # To report GitHub Actions status checks + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DISABLE_ERRORS: true + Docker-image: + runs-on: ubuntu-latest + needs: [build] + permissions: + packages: write + steps: + - name: Download code + uses: actions/download-artifact@v4 + with: + name: code + path: . + - name: ls + run: ls -la CI + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push frontend Docker image + uses: docker/build-push-action@v4 + with: + context: ./frontend + push: true + tags: ghcr.io/${{ github.repository_owner }}/frontend:${{ github.sha }} + + - name: Build and push backend Docker image + uses: docker/build-push-action@v4 + with: + context: ./backend + push: true + tags: ghcr.io/${{ github.repository_owner }}/backend:${{ github.sha }} + deploy: + runs-on: ubuntu-latest + needs: [docker-backend, docker-frontend] + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Create kubeconfig + run: echo "YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VSQ1ZFTkRRV1V5WjBGM1NVSkJaMGxKVjJVdkwyWk1jQ3N5YmsxM1JGRlpTa3R2V2tsb2RtTk9RVkZGVEVKUlFYZEdWRVZVVFVKRlIwRXhWVVVLUVhoTlMyRXpWbWxhV0VwMVdsaFNiR042UVdWR2R6QjVUa1JCTkUxRVZYZFBSRkV5VGtSc1lVWjNNSHBPUkVFMFRVUk5kMDlFVlhoT1JHeGhUVUpWZUFwRmVrRlNRbWRPVmtKQlRWUkRiWFF4V1cxV2VXSnRWakJhV0UxM1oyZEZhVTFCTUVkRFUzRkhVMGxpTTBSUlJVSkJVVlZCUVRSSlFrUjNRWGRuWjBWTENrRnZTVUpCVVVOcFdXZE9hVWswWkdwbVprVkZTRWRHVEdKRlQxWnFSR2x1TDJoMlFtTjRTbmxZZFdobFpFOHdWSEJaY1hWcVNHUkdjVUpYVlhGVU56QUtZMmx6Y2xwblVtd3pVMlZPUmpkTVVtOXNRa0ZxUjBKT05VdFhPRzFXY1ZKak16WkRlSGx2YW5GSEszWmtkbmhCT1cxVGVWbEdUR2hxYzNsT09YQlVNZ3BoTDB0MWFEbFhWV0Z5TjNWUWFrUktWMk54V2tFMWFETnJibEJvTHpBdlVrdFZiRTlpU0doeGMwdDRRbEJLUWl0V09IbGFjM28zYnpkdU5tUldVVEVyQ2xSUFZ6TjVTREJsYVZJd1IzRjNUbEJ6S3pSa1l6RlFXVk5HWVRCaE1VTjNXRXB5T0hkek1tYzVSa3Q0YlRGRFRXbEVXSFJOWlVkNVpEaDFiRWRVV0hJS1VWRldOR1pIZDBwTlZEQk5iVXhTVDBkdFIyRkhZMnRsYWpKcFQyTXpLekpFWTFGRGMwY3lXRkI2ZEM5YWIydEVZMk50VG1KMWNYazNTM0ZRUjJoeGR3cFBNbTFFZGpFMmVVSkVVRGxrVjJZd0syaFVZMDR6YzJOQ1puaG9RV2ROUWtGQlIycFhWRUpZVFVFMFIwRXhWV1JFZDBWQ0wzZFJSVUYzU1VOd1JFRlFDa0puVGxaSVVrMUNRV1k0UlVKVVFVUkJVVWd2VFVJd1IwRXhWV1JFWjFGWFFrSlRhVUpuTWpCUE4zTkdTbU5qVWlzNFIzaHVRVFIxZEZVcmIxZHFRVllLUW1kT1ZraFNSVVZFYWtGTloyZHdjbVJYU214amJUVnNaRWRXZWsxQk1FZERVM0ZIVTBsaU0wUlJSVUpEZDFWQlFUUkpRa0ZSUVVGaWJqUTNOeXRJWWdwRFpFbHNaR1JIYjFoTVdtUkhUVzVhWXpCaWRuQkhNVVYwT1VoaFJpc3dSa1ZSZEdsQ2FIVmliMWhDT0ZoaVVUWkZSVXcxV1RFcmNHOXNVRTFYWmxWVkNrOTJabGRxZEdWbE0zbDNSRXB1UTB0UlluUTVURzFLUWpkbWVGUTRPWEZ4T0hwd1EyMUdXV2xHZDBkcWFIVXZZMGRIT0ZwSU9GSk9TVWh5ZUZkeVRHVUtiR3BUZVZKWFdURnBaV0p0UXpRMFRrUnFjSGRSTWtad2JFVkdjRTV5VmxKNmF5OUhPVlpsYTFNNFpYVjNOMjEyWVZOWFFUbEZLMlJOVGpNeVlXWllOd3BQVkhJdlJFMVlWR3c0TUROSVExZFFPV0pqU1RKd1EwTXpMMGxRVjFaTE0zcFlRV1YwV1doNVlUaG9ha2RFYVdWUVdrMXFNVXBWWmt0aloxVlNXV0ZtQ2paNWNtNHpWMmxWV25SSU1GWk5kRGtyWkRSelducHJjRWxvWWxWTGJYcEdRVEo1VUZkaldIaG5kMFJEYUVaS1JtODRXRVI0U2xKRU1XczJhVkpyZERnS1VEVndWVTA0WW0xMVlWbE1DaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsKICAgIHNlcnZlcjogaHR0cHM6Ly83NkRFNkJCRkQyMDNDNUFEMjRGMEIwRjY5RkRBOEFDQS5ncjcuZXUtbm9ydGgtMS5la3MuYW1hem9uYXdzLmNvbQogIG5hbWU6IHNkdS1jbHVzdGVyCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBzZHUtY2x1c3RlcgogICAgbmFtZXNwYWNlOiBzdHVkZW50LTc1CiAgICB1c2VyOiB3b3Jrc3RhdGlvbi03NQogIG5hbWU6IHdvcmtzdGF0aW9uLTc1CmN1cnJlbnQtY29udGV4dDogd29ya3N0YXRpb24tNzUKa2luZDogQ29uZmlnCnByZWZlcmVuY2VzOiB7fQp1c2VyczoKLSBuYW1lOiB3b3Jrc3RhdGlvbi03NQogIHVzZXI6CiAgICB0b2tlbjogZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklrbHNSVGN4TlVGVFVFWlZRVTlPT0ZWNVdEVlNRWGRYYjBGTFIxWnZlVVZZVFVsTk1tMURNa1pTY21zaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpqYjJSbExYTmxjblpsY2kxM2IzSnJjM1JoZEdsdmJuTWlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObFkzSmxkQzV1WVcxbElqb2lkMjl5YTNOMFlYUnBiMjR0TnpVdFlXTmpiM1Z1ZEMxelpXTnlaWFFpTENKcmRXSmxjbTVsZEdWekxtbHZMM05sY25acFkyVmhZMk52ZFc1MEwzTmxjblpwWTJVdFlXTmpiM1Z1ZEM1dVlXMWxJam9pZDI5eWEzTjBZWFJwYjI0dE56VXRZV05qYjNWdWRDSXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNkltVmtORE0xT0RRd0xUTTVNR1l0TkRJM1ppMDVOek5oTFRNeFpEQXhZVEkyTmpNeU1TSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBqYjJSbExYTmxjblpsY2kxM2IzSnJjM1JoZEdsdmJuTTZkMjl5YTNOMFlYUnBiMjR0TnpVdFlXTmpiM1Z1ZENKOS5Xd0xfSkg2ZG41Tl9vRWhnVGllT1VGbV9BWnFKVllSMC1mMFZpTVAyV3Q2Y3pocG1BcWFHb1FIVmpvYjYyUmQxd3hvYTZIdU9GZUhNai1DVW5jLW9ZTW5ZNFJrZGthNXZxaWVFMURDWFdQY0VJTFVTTE9xY0RLc3NvRHhNQkpiTGMtRm0wTFVRc1cxbWV2U1p3Q3QyTm5IZzI1U1dwalJPRjhrNEttWkNGYVFUbEd0U0d1SkJ6eVI3c0NMd1NZczRBTXhNLS00Sl9XbEMxX0ljSkFSNlpFbFhLWXBoWDdfS0p0cGNWWTE5SkQwdHVGRkRxUlVzN2JILVk2TnZpM2tkQlpxVnFZcl91V0MwY0Q3dnNfOWFnaW1yZmllaWZTWndLMlNfUkI4ek5Jd3ZVY3QtdzZGNXVpLV83c2l1RkEwQ1NaTEttLVFqSEpKY1ZONmtETHMtX0EK" | base64 -d > kubeconfig + - name: Deploy to Kubernetes + run: | + kubectl apply -f k8s/ \ No newline at end of file diff --git a/CI/build-docker.sh b/CI/build-docker.sh new file mode 100644 index 000000000..6b4d3d09c --- /dev/null +++ b/CI/build-docker.sh @@ -0,0 +1,5 @@ +#!/bin/bash +[[ -z "${GIT_COMMIT}" ]] && Tag='local' || Tag="${GIT_COMMIT::8}" +REPO="ghcr.io/$docker_username/" +echo "${REPO}" +docker build -t "${REPO}micronaut-app:latest" -t "${REPO}micronaut-app:1.0-$Tag" simple-fortune-cookie/ \ No newline at end of file diff --git a/CI/build-frontend.sh b/CI/build-frontend.sh new file mode 100644 index 000000000..135dced07 --- /dev/null +++ b/CI/build-frontend.sh @@ -0,0 +1,2 @@ +cd frontend +go build \ No newline at end of file diff --git a/CI/test-backend.sh b/CI/test-backend.sh new file mode 100644 index 000000000..824dfb981 --- /dev/null +++ b/CI/test-backend.sh @@ -0,0 +1,2 @@ +cd backend +go test \ No newline at end of file diff --git a/CI/test-frontend.sh b/CI/test-frontend.sh new file mode 100644 index 000000000..c2d49e82c --- /dev/null +++ b/CI/test-frontend.sh @@ -0,0 +1,2 @@ +cd frontend +go test \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 000000000..f21830e60 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,14 @@ +FROM golang:1.16-alpine + +WORKDIR /app + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . + +RUN go build -o backend-app + +EXPOSE 8080 + +CMD ["./backend-app"] diff --git a/backend/backend-deployment.yaml b/backend/backend-deployment.yaml new file mode 100644 index 000000000..342213db9 --- /dev/null +++ b/backend/backend-deployment.yaml @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + run: backend-deployment + name: backend-deployment +spec: + replicas: 1 + selector: + matchLabels: + run: backend-deployment + template: + metadata: + labels: + run: backend-deployment + spec: + containers: + - name: backend-deployment + image: ghcr.io/eficode-academy/simple-fortune-cookie/backend:latest + ports: + - containerPort: 9000 + diff --git a/backend/backend-service.yaml b/backend/backend-service.yaml new file mode 100644 index 000000000..3c7b3f59c --- /dev/null +++ b/backend/backend-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: backend-service + labels: + app: backend-deployment +spec: + type: NodePort + selector: + app: backend-deployment + ports: + - port: 5000 + targetPort: 5000 + protocol: TCP + diff --git a/backend/main.go b/backend/main.go index 650ef3963..2d0edeb75 100644 --- a/backend/main.go +++ b/backend/main.go @@ -178,5 +178,5 @@ func main() { mux.Handle("/fortunes/", fortuneH) err := http.ListenAndServe(":9000", mux) - fmt.Println("%v", err) + fmt.Printf("%v", err) } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..fcdee4b94 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.8' + +services: + frontend: + build: ./frontend + ports: + - "9000:9000" + depends_on: + - backend + + backend: + build: ./backend + ports: + - "8080:8080" diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 000000000..aa7bf8b53 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,14 @@ +FROM golang:1.16-alpine + +WORKDIR /app + +COPY go.mod ./ +RUN go mod download + +COPY . . + +RUN go build -o frontend-app + +EXPOSE 9000 + +CMD ["./frontend-app"] diff --git a/frontend/frontend-deployment.yaml b/frontend/frontend-deployment.yaml new file mode 100644 index 000000000..195e512b3 --- /dev/null +++ b/frontend/frontend-deployment.yaml @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + run: frontend-deployment + name: frontend-deployment +spec: + replicas: 1 + selector: + matchLabels: + run: frontend-deployment + template: + metadata: + labels: + run: frontend-deployment + spec: + containers: + - name: frontend-deployment + image: ghcr.io/eficode-academy/simple-fortune-cookie/frontend:latest + ports: + - containerPort: 8080 + diff --git a/frontend/frontend-service.yaml b/frontend/frontend-service.yaml new file mode 100644 index 000000000..6da1f77ab --- /dev/null +++ b/frontend/frontend-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: frontend-service + labels: + app: frontend-deployment +spec: + type: NodePort + selector: + app: frontend-deployment + ports: + - port: 5000 + targetPort: 5000 + protocol: TCP + diff --git a/frontend/main.go b/frontend/main.go index bede472b4..27f4da2a4 100644 --- a/frontend/main.go +++ b/frontend/main.go @@ -101,5 +101,5 @@ func main() { http.Handle("/", http.FileServer(http.Dir("./static"))) err := http.ListenAndServe(":8080", nil) - fmt.Println("%v", err) + fmt.Printf("%v", err) }