关于docker:使用Docker方式安装Jenkins

3次阅读

共计 5199 个字符,预计需要花费 13 分钟才能阅读完成。

前言

之前本人在阿里云 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

要想查看 jenkins 密钥,必须应用上面命令获取并填入。

docker exec -it jenkins-blueocean bash

docker logs <docker-container-name>


这样就实现了 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、点击立刻构建



    上面是残缺的 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 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"
            }
        }
    }
}

总结

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'
        }
    }

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 的 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 集群

正文完
 0