使用Docker方式安裝Jenkins

Awbeci發表於2022-03-05

前言

之前自己在阿里雲ECS上面安裝了Jekins(安裝jenkins的文章),最近因為伺服器中了挖礦木馬於是準備重新安裝一下,但是想到每次安裝jenkins都要手動安裝jdk、maven、docker、kubectl,感覺好麻煩,於是使用官方推薦的blue ocean docker映象來安裝並使用,在安裝和使用的過程中遇到一些問題記錄下來分享給大家。

使用blue ocean映象來安裝jkenkins

首先我們開啟jenkins官方安裝文章看看如何安裝的。

1、在Docker中下載並執行Jenkins

docker run \
  -u root \
  --rm \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

2、訪問Jenkins / Blue Ocean Docker容器

docker exec -it jenkins-blueocean bash

3、安裝後設定嚮導-解鎖 Jenkins

image.png

要想檢視jenkins金鑰,必須使用下面命令獲取並填入。

docker exec -it jenkins-blueocean bash

docker logs <docker-container-name>

image.png
這樣就完成了Jenkins的安裝,下面我們通過兩個示例來使用jenkins釋出next.js和spring專案。

構建nodejs專案

這是官網提供的安裝方式

操作過程

  • 0、新建git服務商(gitlab、github等等)ssh憑證和k8s conifg ~/.kube/config憑證(沒有這個kubectl認證會失敗)
  • 1、首先新建一個流水線任務
  • 2、流水線選擇Pipline Script或者Pipline Script from SCM
  • 3、將Jenkins指令碼放入其中
  • 4、點選立即構建
    image.png
    image.png
    image.png
    下面是完整的Jenkinsfile檔案
pipeline {
    agent any
    environment {
      GIT_REPOSITORY="xxx"
      K8S_YAML="k8s/test-xxx-webapp.yaml"
      POD_NAME="test-xxx-webapp"
      DOCKER_USERNAME="xxx"
      DOCKER_PWD="xxx
      ALIYUN_DOCKER_HOST = 'xxx'
      ALIYUN_DOCKER_NAMESPACE="com-xxx"
      ALIYUN_DOCKER_REPOSITORY_NAME="webapp-test"
      K8S_CONFIG = credentials('test-xxx-k8s-config-text')
    }
    stages {
        stage("Clone") {
            agent any
            steps {
                echo "1.Clone Stage"
                 // 刪除資料夾
                deleteDir()
                git branch: 'test', credentialsId: 'xxx', url: "${GIT_REPOSITORY}"
                script {
                    // 獲取git程式碼tag為docker倉庫tag
                    // GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
                    // 獲取git提交hash做為docker倉庫tag
                    GIT_TAG = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                    DOCKER_REPOSITORY = "${ALIYUN_DOCKER_HOST}/${ALIYUN_DOCKER_NAMESPACE}/${ALIYUN_DOCKER_REPOSITORY_NAME}"
                    // docker 阿里映象倉庫
                    DOCKER_REPOSITORY_TAG = "${DOCKER_REPOSITORY}:${GIT_TAG}"
                }
            }
        }
        stage("Test") {
            agent any
            steps {
                echo "2.Test Stage"
            }
        }
        stage("Build") {
            agent any
            steps {
                echo "3.Build Docker Image Stage"
                sh "docker build -t ${DOCKER_REPOSITORY_TAG} -f docker/Dockerfile ."
            }
        }
        stage("Push") {
            agent any
            steps {
                echo "4.Push Docker Image Stage"
                //推送Docker映象,username 跟 password 為 阿里雲容器映象服務的賬號密碼
                sh "docker login --username=${DOCKER_USERNAME} --password=${DOCKER_PWD} ${ALIYUN_DOCKER_HOST}"

                // 開始推送映象
                sh "docker push ${DOCKER_REPOSITORY_TAG}"
                // 刪除生成的image
                //sh "docker rmi ${DOCKER_IMG_HOST}/${DOCKER_IMG_PATH}:${GIT_TAG}"
                // 刪除jenkins生成的image
                sh '''
                    docker images | grep seaurl | awk '{print $3}' | xargs docker rmi -f
                '''
            }
        }
        stage("Deploy") {
            agent {
                docker {
                    image 'lwolf/helm-kubectl-docker'
                }
            }
            steps {
                echo "5.釋出映象"
                sh "mkdir -p ~/.kube"
                sh "echo ${K8S_CONFIG} | base64 -d  > ~/.kube/config"
                sh "sed -i 's#<imagename>#${DOCKER_REPOSITORY_TAG}#g;s#<podname>#${POD_NAME}#g' ${K8S_YAML}"
                sh "kubectl apply -f ${K8S_YAML} -n xxx"
            }
        }
    }
}

構建java專案

這是官網提供的安裝方式

操作過程:
0、新建git服務商(gitlab、github等等)ssh憑證和k8s conifg ~/.kube/config憑證(沒有這個kubectl認證會失敗)
1、首先新建一個流水線任務
2、流水線選擇Pipline Script或者Pipline Script from SCM
3、將Jenkins指令碼放入其中
4、點選立即構建

下面是完整的Jenkinsfile檔案

pipeline {
    agent any
    environment {
      GIT_REPOSITORY="xxx"
      K8S_YAML="k8s/test-xxx-webapp.yaml"
      POD_NAME="test-xxx-webapp"
      DOCKER_USERNAME="xxx"
      DOCKER_PWD="xxx
      ALIYUN_DOCKER_HOST = 'xxx'
      ALIYUN_DOCKER_NAMESPACE="com-xxx"
      ALIYUN_DOCKER_REPOSITORY_NAME="webapp-test"
      K8S_CONFIG = credentials('test-xxx-k8s-config-text')
    }
    stages {
        stage("Clone") {
            agent any
            steps {
                echo "1.Clone Stage"
                 // 刪除資料夾
                deleteDir()
                git branch: 'test', credentialsId: 'xxx', url: "${GIT_REPOSITORY}"
                script {
                    // 獲取git程式碼tag為docker倉庫tag
                    // GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
                    // 獲取git提交hash做為docker倉庫tag
                    GIT_TAG = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                    DOCKER_REPOSITORY = "${ALIYUN_DOCKER_HOST}/${ALIYUN_DOCKER_NAMESPACE}/${ALIYUN_DOCKER_REPOSITORY_NAME}"
                    // docker 阿里映象倉庫
                    DOCKER_REPOSITORY_TAG = "${DOCKER_REPOSITORY}:${GIT_TAG}"
                }
            }
        }
        stage("Test") {
            agent any
            steps {
                echo "2.Test Stage"
            }
        }
        stage("Build") {
            agent {
                docker {
                    image 'maven:3-alpine'
                    args '-v /root/.m2:/root/.m2'
                }
            }
            steps {
                echo "3.Build Server"
                sh "mvn -e -U -pl ${MODULE_NAME} -am clean package -Dmaven.test.skip=true dockerfile:build -Ddockerfile.tag=${GIT_TAG} -Ddockerfile.repository=${DOCKER_REPOSITORY}"
            }
        }
        stage("Push") {
            agent any
            steps {
                echo "4.Push Docker Image Stage"
                //推送Docker映象,username 跟 password 為 阿里雲容器映象服務的賬號密碼
                sh "docker login --username=${DOCKER_USERNAME} --password=${DOCKER_PWD} ${ALIYUN_DOCKER_HOST}"

                // 開始推送映象
                sh "docker push ${DOCKER_REPOSITORY_TAG}"
                // 刪除生成的image
                //sh "docker rmi ${DOCKER_IMG_HOST}/${DOCKER_IMG_PATH}:${GIT_TAG}"
                // 刪除jenkins生成的image
                sh '''
                    docker images | grep seaurl | awk '{print $3}' | xargs docker rmi -f
                '''
            }
        }
        stage("Deploy") {
            agent {
                docker {
                    image 'lwolf/helm-kubectl-docker'
                }
            }
            steps {
                echo "5.釋出映象"
                sh "mkdir -p ~/.kube"
                sh "echo ${K8S_CONFIG} | base64 -d  > ~/.kube/config"
                sh "sed -i 's#<imagename>#${DOCKER_REPOSITORY_TAG}#g;s#<podname>#${POD_NAME}#g' ${K8S_YAML}"
                sh "kubectl apply -f ${K8S_YAML} -n xxx"
            }
        }
    }
}

image.png

總結

1、因為使用了docker安裝的jenkins,所以在外掛上面nodejs專案和java專案分別可以使用下面這樣的agent,不用再去安裝jdk或者nodejs、maven再去配置了,非常方便。

kubectl agent

agent {
        docker {
            image 'lwolf/helm-kubectl-docker'
        }
    }

maven agent

agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }

注意:
如果你想配置自己的私有倉庫maven地址(如:阿里雲效maven倉庫),首先進入宿主機目錄(不是docker容器裡面)/root/.m2,然後建立 setting.xml檔案(setting.xml檔案就是你自己的私有maven setting.xml檔案)
image.png

2、k8s 配置檔案~/.kube/config檔案做為jenkins憑證的時候一定要用base64轉碼,否則構建失敗。

base64轉換~/.kube/config檔案命令

base64 ~/.kube/config > kube-config.txt

Jenkinsfile中執行命令

sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"

3、每個stage底下都加個否則構建失敗

agent any

4、新建流水線任務的時候如果是選擇的是Pipline Script from SCM,那麼選用的就是專案中存在的Jenkinsfile檔案。
5、最後非常感謝簡書的 @tinylk 大佬寫的文章幫助了我很多,下面第一和第二的引用就是他的文章和示例程式碼。

引用

採用jenkins pipeline實現自動構建並部署至k8s
pipeline-demo gitee
在 Linux 系統中安裝並設定 kubectl
jenkins-to-docker-image issue
基於 Jenkins 的 CI/CD (二)
K8S+Jenkins實現SpringBoot專案的CI/CD
CICD Pipeline To Deploy To Kubernetes Cluster Using Jenkins | Jenkins Kubernetes Integration
Jenkins在Pod中實現Docker in Docker並用kubectl進行部署
Jenkins+k8s實現自動化部署
Jenkins連線k8s的多種姿勢
Jenkins master位於k8s叢集外,實現jenkins slave的動態構建
jenkins連線K8S叢集

相關文章