
接續先前的文件用Google Cloud SDK 腳本指令部署 GKE,這次打算透過 Jenkins 實現自動化部署GKE。
在開始之前,請確保以下環境及資源已準備就緒:
依據官方教學安裝 Google Cloud CLI:參考 Google 官方文件 進行安裝。
登入 Google Cloud: 執行以下指令:
gcloud auth login --no-launch-browser
系統將生成一個驗證 URL(如下圖所示),可在其他可用瀏覽器的設備上完成登入操作。
 
    
    
進入 GCP 後台:
 
    
    
設定角色:
 
    
    
下載服務帳戶金鑰:
 
    
    
新增憑證:
 
    
    
注意:此處需要上傳兩份金鑰,分別用於:
withCredentials 使用。建立新 Pipeline:
GCP - Deploy to GKE。撰寫 Pipeline 腳本: 以下為範例腳本:
properties([
    pipelineTriggers([githubPush()])
])
pipeline {
    agent any
    environment {
        TAG = ':latest'
        IMAGE_SHORT_NAME = 'k8s-next-ec'
        IMAGE_NAME = "${IMAGE_SHORT_NAME}${TAG}"
        CONTAINER_NAME = "${IMAGE_SHORT_NAME}-1"
        DOCKERFILE_PATH = './Dockerfile'
        REGISTRY_URL = 'asia-east1-docker.pkg.dev/careful-span-384313/my-registry'
        REGISTRY = "${REGISTRY_URL}/${IMAGE_SHORT_NAME}"
        GCP_PROJECT_ID = 'careful-span-384313'
        GIT_REPO_URL = '[email protected]:markku636/ec.git'
        GIT_BRANCH = 'main'
        GKE_CLUSTER_NAME = 'blog-autopilot-cluster'
        GKE_LOCATION = 'asia-east1'
        DEPLOYMENT_MANIFEST = './gc-next-js-deployment.yaml'
    }
    stages {
        stage('Authenticate with GCP') {
            steps {
                withCredentials([file(credentialsId: 'gke-ssh', variable: 'GCLOUD_CREDS')]) {
                    sh '''
                        gcloud version
                        gcloud auth activate-service-account --key-file="$GCLOUD_CREDS"
                        gcloud config set project $GCP_PROJECT_ID
                        gcloud auth configure-docker asia-east1-docker.pkg.dev
                    '''
                }
            }
        }
        stage("GitHub Pull") {
            steps {
                git branch: "${GIT_BRANCH}", 
                credentialsId: 'e85233ad-a3c5-448b-a6ea-9f53e4f9b3f1', 
                url: "${GIT_REPO_URL}"
            }
        }
        stage('Build Docker Image') {
            steps {
                sh "docker build -t ${IMAGE_NAME} -f ${DOCKERFILE_PATH} ."
            }
        }
        stage('Push to GCR') {
            steps {
                sh "docker tag ${IMAGE_NAME} ${REGISTRY}${TAG}"
                sh "docker push ${REGISTRY}${TAG}"
            }
        }
        stage("Cleaning Up") {
            steps {
                sh "docker rmi --force ${REGISTRY}${TAG}"
            }
        }
        stage('Deploy via GKE Plugin') {
            steps {
                step([
                    $class: 'KubernetesEngineBuilder',
                    projectId: "${GCP_PROJECT_ID}",
                    clusterName: "${GKE_CLUSTER_NAME}",
                    location: "${GKE_LOCATION}",
                    manifestPattern: "${DEPLOYMENT_MANIFEST}",
                    credentialsId: 'gke-gsa',
                    verifyDeployments: true
                ])
                echo "Deployment Finished ..."
            }
        }
    }
}
以下為 ./gc-next-js-deployment.yaml 範例內容:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-next-ec
  labels:
    app: k8s-next-ec
spec:
  selector:
    matchLabels:
      app: k8s-next-ec
      tier: web
  template:
    metadata:
      labels:
        app: k8s-next-ec
        tier: web
    spec:
      containers:
      - name: k8s-next-ec-app
        image: asia-east1-docker.pkg.dev/careful-span-384313/my-registry/k8s-next-ec:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 3000            
---
apiVersion: v1
kind: Service
metadata:
  name: k8s-next-ec
  labels:
    app: k8s-next-ec
spec:
  selector:
    app: k8s-next-ec
  type: LoadBalancer
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 3000  
 
    
    