jenkins

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信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值