docker安装jenkins与docker 容器时区和时间同步问题

244 阅读3分钟

国内不同版本的nodejs下载

CNPM Binaries Mirror

国内不同版本的open jdk下载

新版本jdk:

Index of /Adoptium/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

Index of openjdk-local

老版本jdk:

Index of java-local/jdk

国内不同版本的gradle下载

Index of /gradle/

不同版本的maven下载

Index of /maven/maven-3

使用docker compose安装

services:
  jenkins:
    image: jenkins/jenkins:lts-jdk11 # 使用 LTS 长期支持版
    container_name: jenkins
    restart: unless-stopped
    ports:
      - "7000:8080" # Web 访问端口
      - "7001:50000" # Agent 通信端口
    volumes:
      # 使用宿主机的localtime和timezone,后面的localtime:ro和timezone:ro表示只读模式
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./jenkins_data:/var/jenkins_home # 持久化数据卷
      - /var/run/docker.sock:/var/run/docker.sock # 允许容器内使用宿主机 Docker
      - /usr/bin/docker:/usr/bin/docker
      - ./java:/opt/java
      - ./node:/opt/node

    environment:
      - TZ=Asia/Shanghai # 设置时区
      - JAVA_OPTS=-Dhudson.model.UpdateCenter.updateCenterUrl=https://mirrors.huaweicloud.com/jenkins/updates/dynamic-stable-2.462.3/ -Duser.timezone=Asia/Shanghai -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai -Dhudson.model.DownloadService.noSignatureCheck=true

容器启动之后,容器内部的/etc/localtimedate -R可能不一致,此时应该以date -R的为准

docker容器时区问题

查看所有容器的时区

docker ps --format '{{.Names}}' | xargs -I {} sh -c 'echo -n "{}: " && docker exec {} date'

查看单个容器时区(如果与宿主机: date -R的结果不一致,就说明要调整)

docker exec jenkins date -R

查看容器中运行中的java时区

docker exec jenkins bash -c "java -XshowSettings:properties -version"

进入容器中查看java运行状态

docker docker exec -it jenkins /bin/bash
ps -ef | grep java
jps -lv

jenkins pipeline 示例

pipeline {
    agent any

    stages {
        stage('清理工作空间') {
            steps {
                deleteDir()  // 删除当前目录(通常是工作空间根目录)
            }
        }
        stage('代码拉取') {
            steps {
                git branch:'master', credentialsId: 'pan-gitee-account-pwd', url: 'https://gitee.com/free_pan/ms-skeleton-vue3.git'
                sh '''
                    git branch --show-current
                '''
                echo '代码拉取成功'
            }
        }
        stage('设置环境变量') {
            steps {
                script {
                    // 动态获取当前分支名, 并设置环境变量, 避免semantic-release 在jenkins中,无法获取到git当前的分支名, 导致的无法升级版本号的问题
                    // 详见: https://github.com/semantic-release/semantic-release/issues/1090
                    env.GIT_BRANCH = sh(
                        script: 'git branch --show-current',
                        returnStdout: true
                    ).trim()
                    
                    echo "当前分支: ${env.GIT_BRANCH}"   
                }
            }
        }
        stage('执行pnpm install') {
            steps {
                 nodejs(cacheLocationStrategy: workspace(), nodeJSInstallationName: '20.19.0') {
                    echo "当前分支: ${env.GIT_BRANCH}"
                    sh '''
                        node --version
                        npm config set registry https://registry.npmmirror.com/
                        corepack enable
                        corepack prepare pnpm@8.15.9 --activate
                        pnpm config set registry https://registry.npmmirror.com/
                        // 设置pnpm下载的包, 存放目录(该目录是通过挂载卷实现的),避免单个容器磁盘空间不断变大的问题, 也能减少重复下载
                        // --frozen-lockfile: 严格根据lock文件下载包, 加快下载速度, 以及避免包版本冲突问题
                        // --shamefully-hoist: 避免软链接的开销
                        export PNPM_STORE_PATH=/var/jenkins_home/.pnpm-store
                        pnpm install --frozen-lockfile --shamefully-hoist --store-dir $PNPM_STORE_PATH
                    '''
                    echo 'pnpm install执行成功'
                }   
            }
        }
        stage('执行前端打包') {
            steps {
                 nodejs(cacheLocationStrategy: workspace(), nodeJSInstallationName: '20.19.0') {
                    sh '''
                        node --version
                        npm config set registry https://registry.npmmirror.com/
                        corepack enable
                        corepack prepare pnpm@8.15.9 --activate
                        pnpm config set registry https://registry.npmmirror.com/
                        export PNPM_STORE_PATH=/var/jenkins_home/.pnpm-store
                        pnpm run build-only
                        pnpm run semantic-release-local
                    '''
                    echo 'pnpm install执行成功'
                }   
            }
        }
        stage('变更推送git仓库') {
            steps {
                withCredentials([
                    gitUsernamePassword(credentialsId: 'pan-gitee-account-pwd', gitToolName: 'Default')
                ]){
                    sh """
                    git rev-parse --abbrev-ref HEAD
                    git log -n 10 --oneline
                    git push origin master:master
                    """
                    echo 'git push执行成功'
                }   
            }
        }
    }
}

jenkins的环境变量

持续集成:Jenkins pipeline全局变量 - 测试开发小记 - 博客园

Jenkins可用环境变量以及使用方法_jenkins env-CSDN博客