2

前言

之前自己在阿里云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'
        }
    }

------- 2022-6-1 更新---------

修改jenkins 的admin账号默认的123456密码
image.png
image.png

------- 2023-7-5 更新---------

升级包含jdk17的jenkins镜像

安装准备:
在安装之前要停用jenkins

docker stop xxxxx

安装命令:

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 jenkins/jenkins:jdk17-preview

注意:

此时的jenkins没有安装docker,执行下面命令安装:

docker exec -it <container_id> bash
sed -i 's#http://deb.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list

sed -i 's#https://mirrors.163.com#http://mirrors.aliyun.com#g' /etc/apt/sources.list
apt-get update
apt-get install docker.io -y
exit

然后,重启下jenkins容器:

docker restart <container_id>
docker exec -it <container_id> docker --version

包含java17的jenkins官网文档
debian安装国内镜像

注意:
如果你想配置自己的私有仓库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集群


Awbeci
3.1k 声望213 粉丝

Awbeci