jenkins

avatar
作者
筋斗云
阅读量:0

jenkin

安装

Docker

  1. 由于国内有墙,可以提前下载好需要的镜像
# docker in docker镜像,可以在容器内构建和推送 Docker 镜像 docker pull docker:dind # jenkins镜像 docker pull jenkins/jenkins:2.452.3-jdk17 
  1. 定制化jenkins镜像
    主要做了以下增强:
  • 安装Blue Ocean插件:Blue Ocean插件提供了一个现代化、用户友好的Jenkins UI界面,使得构建、部署和流水线的管理更加直观和便捷。
  • 安装Docker Workflow插件:Docker Workflow插件允许Jenkins在流水线中使用Docker容器。这对于构建、测试和部署容器化应用非常有用。它提供了对Docker命令的支持,使得在流水线中可以轻松地构建和运行Docker容器。
  • 安装Docker CLI:这使得Jenkins能够直接在其运行环境中执行Docker命令,例如构建、运行和管理Docker容器。这对于CI/CD流水线非常重要,尤其是在需要构建和推送Docker镜像的场景中。
    你也可以安装一些自己需求的额外组件,如mysql客户端(apt-get install -y mysql-client)
cat <<EOF > Dockerfile FROM jenkins/jenkins:2.452.3-jdk17 USER root RUN apt-get update && apt-get install -y lsb-release RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \   https://download.docker.com/linux/debian/gpg RUN echo "deb [arch=$(dpkg --print-architecture) \   signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \   https://download.docker.com/linux/debian \   $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list RUN apt-get update && apt-get install -y docker-ce-cli RUN apt-get update && apt-get install -y default-mysql-client less vim telnet net-tools ENV LESSCHASRTSET=utf-8 USER jenkins RUN jenkins-plugin-cli --plugins "blueocean docker-workflow" EOF  docker build -t myjenkins-blueocean:2.452.3-1 .  # 可选:将制作好的镜像上传到阿里云下次备用 docker tag myjenkins-blueocean:2.452.3-1 registry.cn-shenzhen.aliyuncs.com/docker-mirror2/myjenkins-blueocean:2.452.3-1 docker push registry.cn-shenzhen.aliyuncs.com/docker-mirror2/myjenkins-blueocean:2.452.3-1 
  1. 启动
    修改jenkins-data卷的属于为jenkins用户
chown 1000:1000 ./volumes/jenkins-data  # 启动后可以通过这个命令,确认jenkin用户的uid是1000 docker compose exec jenkins-blueocean cat /etc/passwd 

方案一:使用docker命令启动

# 创建桥接网络 docker network create jenkins # 创建dockerInDocker镜像 docker run \   --name jenkins-docker \   --rm \   --detach \   --privileged \   --network jenkins \   --network-alias docker \   --env DOCKER_TLS_CERTDIR=/certs \   --volume ./volumes/jenkins-docker-certs:/certs/client \   --volume ./volumes/jenkins-data:/var/jenkins_home \   --publish 2376:2376 \   docker:dind \   --storage-driver overlay2    # 启动jenkins docker run \   --name jenkins-blueocean \   --restart=on-failure \   --detach \   --network jenkins \   --env DOCKER_HOST=tcp://docker:2376 \   --env DOCKER_CERT_PATH=/certs/client \   --env DOCKER_TLS_VERIFY=1 \   --publish 8080:8080 \   --publish 50000:50000 \   --volume ./volumes/jenkins-data:/var/jenkins_home \   --volume ./volumes/jenkins-docker-certs:/certs/client:ro \   myjenkins-blueocean:2.452.3-1 

方案二:使用docker-compose启动

cat <<EOF > docker-compose.yaml services:   jenkins-docker:     image: docker:dind     privileged: true     environment:       - DOCKER_TLS_CERTDIR=/certs     volumes:       - ./volumes/jenkins-docker-certs:/certs/client       - ./volumes/jenkins-data:/var/jenkins_home     networks:       jenkins:         aliases:           - docker     ports:       - 2376:2376     command: --storage-driver overlay2    jenkins-blueocean:     image: myjenkins-blueocean:2.452.3-1     restart: on-failure     environment:       - DOCKER_HOST=tcp://docker:2376       - DOCKER_CERT_PATH=/certs/client       - DOCKER_TLS_VERIFY=1     volumes:       - ./volumes/jenkins-data:/var/jenkins_home       - ./volumes/jenkins-docker-certs:/certs/client:ro     networks:       - jenkins     ports:       - 8080:8080       - 50000:50000   /var/jenkins_home/log/jenkins.log  networks:   jenkins:     driver: bridge EOF  docker compose up -d 

初始化

浏览器打开http://localhost:8080,看到以下页面后
在这里插入图片描述
进入jekins的目录查看密码:docker compose exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword

docker compose exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword 

使用jenkins

pipeline相关脚本可以利用UI生成:http://localhost:8080/job/execute-sql/pipeline-syntax/
在这里插入图片描述

设置凭证

jekins凭证管理用于存储一些敏感数据,主要有以下类型:

  • username with password:存储用户名密码数据
  • ssh username with private key: 存储ssh私钥,将公钥存到git仓库后,需要把对应的私钥配置到jenkins中。
  • secret text:任意的敏感文本

jenkins的许多插件对credentials的支持比较好,例如git插件,提供credentialsId就行了,用户不需要关心不同类型的credentials的解析细节。

对于自己脚本逻辑中需要用到的一些敏感数据,则需要自己解析,通常我们会把credentials注入到环境变量中,详细的官方文档可以参考:https://www.jenkins.io/doc/book/pipeline/syntax/#supported-credentials-type。
使用语法如下:

pipeline {     agent any     environment {          CC = 'clang'     }     stages {         stage('Example') {             environment {                  VAR_NAME = credentials('credentials-id')              }             steps {                 sh 'printenv'             }         }     } } 

可以放在整个pipeline下,也可以放到某个stage下。

  • 用户名密码类型的credentials,VAR_NAME的值为<user>:<password>,同时会再注入两个环境变量:VAR_NAME_USRVAR_NAME_PSW
  • ssh username with private key类型的凭证,jenkins会将private key生成一个临时文件,将这个临时文件的路径赋值给VAR_NAME,并额外注入:VAR_NAME_USRVAR_NAME_PSW(private key的密码,通常我们不会设置)。
  • secret类型的凭证,则直接把内容赋值给VAR_NAME

敏感数据处理

执行shell时,如果直接在双引号内放入变量,会直接将对应的内容替换进去,导致密码有泄露的风险。需要将涉及敏感字段的部分放在单引号内、非敏感字段继续放在双引号,这样jenkins执行脚本的时候,会用变量注入敏感值。

pipeline {   agent {     label 'mysql-client'   }      parameters {     string(name: 'branch', defaultValue: 'main', description: 'Branch to build')   }    stages {         stage('Execute SQL') {       environment {         MYSQL = credentials('mysql-dev')       }       steps {         script {           def sqlFiles = findFiles(glob: "sql/*.sql")           for (file in sqlFiles) {             if (file.name.startsWith('deprecated_')) {               continue             }             sh('mysql -h 192.168.137.101 -P 3306 -u ${MYSQL_USR} -p${MYSQL_PSW}' + " demo_db_${params.environment} < ${file.path}")           }         }       }     }   } }  

应用示例:执行指定分支某个目录的sql

如果你的jenkins机器都安装了default-mysql-client,可以用这个pipeline。

pipeline {     agent any      parameters {         string(name: 'branch', defaultValue: 'main', description: 'Branch to build')     }      environment {         GIT_CREDENTIALS_ID = 'github-ssh-key'         MYSQL_CREDENTIALS_ID = 'mysql-test'     }      stages {         stage('Checkout') {             steps {                 script {                     // 拉取指定分支的代码                     checkout scmGit(branches: [[name: "*/${params.branch}"]], extensions: [localBranch("${params.branch}")], userRemoteConfigs: [[credentialsId: 'github-ssh-key', url: 'git@github.com:liuzhenghua/jenkins-test.git']])                 }             }         }          stage('ExecuteSql') {                          steps {                 script {                     withCredentials([usernamePassword(credentialsId: env.MYSQL_CREDENTIALS_ID, usernameVariable: 'MYSQL_USERNAME', passwordVariable: 'MYSQL_PASSWORD')]) {                         sh '''                         set -e                         if ls sql/*.sql 1> /dev/null 2>&1; then                             for sql_file in sql/*.sql; do                                 echo "Executing $sql_file ..."                                 mysql -h 192.168.137.101 -u "$MYSQL_USERNAME" -p"$MYSQL_PASSWORD" demo_db < "$sql_file"                                 if [ $? -eq 0 ]; then                                     echo "Successfully executed $sql_file"                                 else                                     echo "Error executing $sql_file"                                     exit 1                                 fi                             done                         else                             echo "No SQL files found in sql/ directory"                             exit 1                         fi                         '''                     }                 }             }         }     } } 

如果你的jenkins机器没有安装mysql-client,则需要使用docker的方式执行:

cat <<EOF > Dockerfile FROM alpine:3.20.1 RUN apk update && \     apk add --no-cache mysql-client mariadb-connector-c-dev EOF  docker build . -t mysql-client:1.0.0 

接着修改pipeline中agent的部分

pipeline {     agent {       docker {         image 'liuzhenghua66/mysql-client:latest'       }     }     // ... }  # 如果是需要登录的私有仓库,使用下面的代码,并把用户名密码配置到credentials中 pipeline {     agent {       docker {         image 'registry.cn-shenzhen.aliyuncs.com/docker-mirror2/mysql-client:latest'         registryCredentialsId 'aliyun-docker'       }     }     // ... } 

运维

常用操作

# 查看初始密码 cat /var/jenkins_home/secrets/initialAdminPassword # root身份进入容器 docker exec -u 0 -it <container_id_or_name> /bin/bash 

初始化白屏

可能由于代理的原因导致导致证书认证失败,可以进入插件设置页面:
http://localhost:8080/manage/pluginManager/advanced,将update site由https改成http
在这里插入图片描述

jenkins日志打印到文件

https://wiki.jenkins.io/display/JENKINS/Logging.html#Logging-Docker

配置git ssh key

  1. 随便找台机器生成秘钥对:ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
  2. 将私钥配置到jenkins中
    在这里插入图片描述
  3. 将公钥添加到git仓库。
  4. 登录jenkin手动ssh一次git仓库,输入yes信任。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!