MAC搭建Docker compose+jenkins
Mac/Linux 使用 Docker Jenkins 自动部署 Spring Boot 后端本文以项目名称joy-admin-backend为例搭建一套可重复使用的 Jenkins 自动部署流程包含Docker 部署 JenkinsJenkins 通过 SSH 拉取阿里云 Codeup 代码JDK 21、Maven 3.9.9 构建Docker Compose 发布 Spring Boot 后端版本化 Docker 镜像健康检查发布失败自动回滚手动回滚历史版本后端仓库gitcodeup.aliyun.com:xxxxx/xxxxx.git一、整体架构Codeup ↓ SSH Docker Jenkins ↓ docker compose build joy-admin-backend:构建号-GitCommit ↓ docker compose up 后端容器 ↓ 健康检查失败 自动恢复上一个 Docker 镜像代码每次从 Codeup 拉取环境配置保存在 Jenkins Credentials不依赖本机已有项目。二、环境要求推荐配置Docker Desktop / Docker Engine Docker Compose 2.20 Jenkins LTS JDK 21 Maven 3.9.9 至少 4 核 CPU 至少 6 GB 内存 至少 50 GB 可用磁盘检查环境1. 检查机器环境 执行uname-msw_verssysctl-nhw.memsizedf-h/uname-m输出 arm64Apple Silicon 或 x86_64Intel2. 检查Docker 先启动Docker Desktop然后执行dockerversiondockercompose versiondockerinfo--formatOS{{.OSType}}, Arch{{.Architecture}}, CPUs{{.NCPU}}, Memory{{.MemTotal}}dockerrun--rmhello-world 要求dockerversion同时显示Client和Server。dockercompose version正常输出。 hello-world运行成功。 Docker运行Linux容器。3. 检查构建镜像dockerrun--rmeclipse-temurin:21-jdkjava-versiondockerrun--rm\maven:3.9.9-eclipse-temurin-21\mvn-versiondockerrun--rm\node:16.20.2-bullseye\sh-cnode -v npm -v预期输出 Java21Apache Maven3.9.9 Node v16.20.2npm8.x4. 检查Maven仓库挂载 先确认目录存在ls-ld/Users/mac/Documents/work/repo 测试容器读取dockerrun--rm\-v/Users/mac/Documents/work/repo:/maven-repo:ro\alpine:3.20\sh-ctest -d /maven-repo ls -la /maven-repo | head如果出现Mounts denied在Docker Desktop中打开 Settings → Resources → File Sharing 加入 /Users/mac/Documents/work 然后Apply并重启Docker Desktop。5. 检查端口lsof-nP-iTCP:8080-sTCP:LISTENlsof-nP-iTCP:1024-sTCP:LISTENlsof-nP-iTCP:9080-sTCP:LISTEN规划8080Jenkins1024Joy Admin前端9080后端仅在需要本机调试时映射 没有输出代表端口空闲。如果8080已占用后面改用18080。三、配置 Codeup SSH1. 生成 Jenkins 专用密钥ssh-keygen\-ted25519\-Cjenkins-codeup\-f~/.ssh/joy-admin-jenkins-codeup密钥位置~/.ssh/joy-admin-jenkins-codeup 私钥 ~/.ssh/joy-admin-jenkins-codeup.pub 公钥登陆Aliyun Codeup 的个人设置 》添加 SSH 公钥将.pub公钥内容添加进去。2. 验证 Codeup 主机指纹(机子能否链接到Codeup拉取代码)Codeup 返回的是 RSA 主机密钥ssh-keyscan-T10-trsa codeup.aliyun.com\/tmp/codeup_known_hosts ssh-keygen-lf/tmp/codeup_known_hosts返回下面官方 SHA256 指纹就说明是正常的SHA256:yEGmgQNVrc3QAvDvoBrTCF2s07KwmmQAbWi9vSt/fE验证访问codeupssh-T\-i~/.ssh/joy-admin-jenkins-codeup\-oIdentitiesOnlyyes\gitcodeup.aliyun.com出现Welcome to Codeup表示成功。验证访问自己的仓库GIT_SSH_COMMANDssh -i ~/.ssh/joy-admin-jenkins-codeup -o IdentitiesOnlyyes\gitls-remote\gitcodeup.aliyun.com:xxxxxx/xxxxxx.git\refs/heads/main出现类似 9e7f396c0226cfa7cfebefeeebcef341752cb58 refs/heads/main 表示成功。以上确认完成后加入本机信任列表mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/known_hosts chmod 600 ~/.ssh/known_hosts ssh-keygen -F codeup.aliyun.com /dev/null \ || cat /tmp/codeup_known_hosts ~/.ssh/known_hosts四、创建 Jenkins Docker 环境目录结构预览joy-admin-deploy/ ├── .env ├── compose.jenkins.yml └── jenkins/ ├── Dockerfile └── known_hosts创建上面的预览目录结构mkdir-p/Users/mac/Documents/work/joy-admin-deploy/jenkinscd/Users/mac/Documents/work/joy-admin-deploycp/tmp/codeup_known_hosts jenkins/known_hostschmod644jenkins/known_hosts1. 创建Jenkins镜像Jenkins Dockerfile可以使用命令创建nanojenkins/Dockerfile写入FROM maven:3.9.9-eclipse-temurin-21 AS maven_tool FROM node:16.20.2-bullseye AS node_tool FROM jenkins/jenkins:lts-jdk21 USER root RUN printf %s\n \ Acquire::Retries 5; \ Acquire::http::Timeout 60; \ Acquire::https::Timeout 60; \ /etc/apt/apt.conf.d/80-network-retries \ sed -i \ s|http://deb.debian.org|https://deb.debian.org|g \ /etc/apt/sources.list.d/debian.sources \ apt-get update \ apt-get install -y --no-install-recommends \ ca-certificates curl gnupg git openssh-client rsync \ install -m 0755 -d /etc/apt/keyrings \ curl --retry 5 --retry-delay 3 --retry-all-errors \ -fsSL https://download.docker.com/linux/debian/gpg \ -o /etc/apt/keyrings/docker.asc \ chmod ar /etc/apt/keyrings/docker.asc \ echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/debian \ $(. /etc/os-release echo $VERSION_CODENAME) stable \ /etc/apt/sources.list.d/docker.list \ apt-get update \ apt-get install -y --no-install-recommends \ docker-ce-cli \ docker-buildx-plugin \ docker-compose-plugin \ rm -rf /var/lib/apt/lists/* COPY --frommaven_tool /usr/share/maven /usr/share/maven COPY --fromnode_tool /usr/local /usr/local ENV MAVEN_HOME/usr/share/maven ENV PATH/usr/share/maven/bin:/usr/local/bin:${PATH} RUN mkdir -p /root/.ssh \ chmod 700 /root/.ssh \ java -version \ mvn -version \ node -v \ npm -v \ docker --version \ docker buildx version \ docker compose version RUN jenkins-plugin-cli --plugins \ workflow-aggregator \ pipeline-stage-view \ git \ ssh-credentials \ ssh-agent \ credentials-binding \ docker-workflow \ timestamper \ ws-cleanup USER rootdocker-buildx-plugin不能省略因为目前我的后端项目Dockerfile配置了RUN --mounttypecache,target/root/.m2该语法只能通过 BuildKit 执行。2. Jenkins Compose创建compose.jenkins.ymlservices:jenkins:build:context:./jenkinsdockerfile:Dockerfileimage:joy-jenkins:lts-jdk21container_name:joy-jenkinsuser:rootrestart:unless-stoppedports:-${JENKINS_BIND_ADDRESS}:${JENKINS_HTTP_PORT}:8080environment:TZ:UTCJAVA_OPTS:--Duser.timezoneUTC-Djenkins.install.runSetupWizardtruevolumes:-jenkins_home:/var/jenkins_home-jenkins_npm_cache:/root/.npm-${HOST_MAVEN_REPO}:/maven-repo-/var/run/docker.sock:/var/run/docker.sock-./jenkins/known_hosts:/root/.ssh/known_hosts:rovolumes:jenkins_home:name:joy_jenkins_homejenkins_npm_cache:name:joy_jenkins_npm_cache创建.envJENKINS_BIND_ADDRESS127.0.0.1 JENKINS_HTTP_PORT8080 HOST_MAVEN_REPO/Users/mac/Documents/work/repo在其他机器构建时只需要修改HOST_MAVEN_REPO。3. 构建并启动 Jenkinscd/Users/mac/Documents/work/joy-admin-deploy 构建(如果compose.jenkins.yml或者Dockfile有改动这个命令也可以重新构建)dockercompose\--env-file .env\-fcompose.jenkins.yml\build--pull启动dockercompose\--env-file .env\-fcompose.jenkins.yml\up-d检查状态dockercompose\--env-file .env\-fcompose.jenkins.yml\psdockerlogs--tail100joy-jenkins获取初始化密码dockerexecjoy-jenkins\cat/var/jenkins_home/secrets/initialAdminPassword打开http://127.0.0.1:8080完成管理员创建和推荐插件安装。验证工具dockerexecjoy-jenkinsbash-lc java -version mvn -version node -v npm -v git --version docker version docker buildx version docker compose version 验证Jenkins中的主机指纹:dockerexecjoy-jenkins\ssh-keygen-lf/root/.ssh/known_hosts输出必须包含类似SHA256:yEGmgQNVrc3QAvDvoBrTCF2s07KwmmQAbWi9vSt/fE五、配置 Jenkins 凭据http://127.0.0.1:8080先登陆Jenkins1. Codeup 私钥凭据进入Manage Jenkins → Credentials → System → Global credentials → Add Credentials填写KindSSH Username with private key Usernamegit #可以命令行 pbcopy ~/.ssh/joy-admin-jenkins-codeup 复制内容 Private Key粘贴不带 .pub 后缀的私钥 IDcodeup-ssh DescriptionCodeup只读拉取凭据注意joy-admin-jenkins-codeup 私钥可以填入Jenkins joy-admin-jenkins-codeup.pub 公钥不能填入Jenkins如果错误粘贴公钥会出现Load key: error in libcrypto Permission denied (publickey)2. 后端环境配置凭据根据实际生成.env关键配置示例以下内容是我的后端项目里面已有的内容我就直接使用了你们根据自己的配置来生成.env内容JOY_ADMIN_IMAGEjoy-admin-backend JOY_ADMIN_IMAGE_TAGlatest JOY_ADMIN_BIND_ADDRESS127.0.0.1 JOY_ADMIN_HOST_PORT9080 JOY_ADMIN_DATA_DIR/Users/mac/Documents/work/joy-admin-runtime/backend-data JAVA_TOOL_OPTIONS-XX:MaxRAMPercentage75.0 -XX:InitialRAMPercentage25.0 -XX:ExitOnOutOfMemoryError -Djava.io.tmpdir/app/tmp -Duser.timezoneUTC BUSINESS_TIME_ZONEAsia/Kolkata DB_URLjdbc:postgresql://数据库地址:5432/onevone?options-c%20TimeZoneUTCsslmodepreferconnectTimeout10socketTimeout60tcpKeepAlivetrue DB_USER数据库用户 DB_PASSWORD数据库密码 REDIS_HOSTRedis地址 REDIS_PORT6379 REDIS_DATABASE0 REDIS_USERNAME REDIS_PASSWORD REDIS_SSLfalse QUARTZ_INSTANCE_NAMEQuartzScheduler-admin-test QUARTZ_CLUSTEREDtrue TOKEN_SECRET随机安全密钥 UPSTREAM_SERVICE_URL实际服务地址 UPSTREAM_SERVICE_SIGNATURE实际签名 OSS_PREFIX_CDN OSS_PREFIX_OSS OSS_PREFIX_HTTP OSS_BUCKET_NAME OSS_ACCESS_KEY_ID OSS_ACCESS_KEY_SECRET OSS_ENDPOINT SWAGGER_ENABLEDfalse DRUID_CONSOLE_ENABLEDfalse如果数据库或 Redis 运行在 Docker 宿主机容器内地址使用host.docker.internal创建持久化目录mkdir-p/Users/mac/Documents/work/joy-admin-runtime/backend-data将.env上传到 JenkinsKindSecret file File选择准备好的.env IDjoy-admin-backend-env DescriptionJoy Admin后端运行配置.env本地文件路径只在上传时使用Jenkins 保存的是文件内容流水线不会依赖上传路径。六、创建后端 Pipeline创建任务New Item → joy-admin-backend → PipelinePipeline Scriptpipeline{agent any parameters{choice(name:ACTION,choices:[DEPLOY,ROLLBACK],description:发布新版本或回滚旧版本)string(name:GIT_BRANCH,defaultValue:main,description:构建分支)string(name:ROLLBACK_TAG,defaultValue:,description:回滚标签例如15-a8c37f21)}options{timestamps()timeout(time:60,unit:MINUTES)disableConcurrentBuilds()skipDefaultCheckout(true)buildDiscarder(logRotator(numToKeepStr:30))}environment{IMAGE_NAMEjoy-admin-backendDOCKER_BUILDKIT1TZUTC}stages{stage(拉取代码){steps{deleteDir()sshagent(credentials:[codeup-ssh]){sh set -eu export GIT_SSH_COMMANDssh \ -o StrictHostKeyCheckingyes \ -o UserKnownHostsFile/root/.ssh/known_hosts git clone \ --depth 1 \ --branch $GIT_BRANCH \ gitcodeup.aliyun.com:xxxxx/xxxxx.git \ backend }script{env.GIT_SHORTsh(script:git -C backend rev-parse --short8 HEAD,returnStdout:true).trim()env.NEW_TAG${env.BUILD_NUMBER}-${env.GIT_SHORT}}}}stage(准备环境配置){steps{withCredentials([file(credentialsId:joy-admin-backend-env,variable:BACKEND_ENV_FILE)]){sh set -eu install -m 600 $BACKEND_ENV_FILE backend/.env }}}stage(执行发布或回滚){steps{dir(backend){script{if(params.ACTIONROLLBACK){if(!params.ROLLBACK_TAG.trim()){error(回滚必须填写ROLLBACK_TAG)}env.TARGET_TAGparams.ROLLBACK_TAG.trim()sh set -eu export JOY_ADMIN_IMAGE$IMAGE_NAME export JOY_ADMIN_IMAGE_TAG$TARGET_TAG docker image inspect \ $IMAGE_NAME:$TARGET_TAG /dev/null docker compose up \ -d --no-build --force-recreate \ --wait --wait-timeout 300 \ joy-admin CONTAINER_ID$(docker compose ps -q joy-admin) docker exec $CONTAINER_ID \ curl --fail --silent \ http://127.0.0.1:9080/ /dev/null echo 回滚成功$IMAGE_NAME:$TARGET_TAG }else{env.TARGET_TAGenv.NEW_TAG sh set -u export JOY_ADMIN_IMAGE$IMAGE_NAME export JOY_ADMIN_IMAGE_TAG$TARGET_TAG CURRENT_ID$( docker compose ps -q joy-admin 2/dev/null || true ) PREVIOUS_IMAGE if [ -n $CURRENT_ID ]; then PREVIOUS_IMAGE$( docker inspect \ --format {{.Config.Image}} \ $CURRENT_ID ) fi docker compose config /dev/null || exit 1 docker compose build --pull joy-admin || exit 1 docker image inspect \ $IMAGE_NAME:$TARGET_TAG /dev/null || exit 1 DEPLOY_OKfalse if docker compose up \ -d --no-build \ --wait --wait-timeout 300 \ joy-admin then CONTAINER_ID$( docker compose ps -q joy-admin ) if docker exec $CONTAINER_ID \ curl --fail --silent \ http://127.0.0.1:9080/ /dev/null then DEPLOY_OKtrue fi fi if [ $DEPLOY_OK true ]; then echo 发布成功$IMAGE_NAME:$TARGET_TAG docker inspect \ --format镜像{{.Config.Image}} 健康{{.State.Health.Status}} \ $CONTAINER_ID exit 0 fi echo 新版本启动失败 docker compose logs --tail200 joy-admin || true if [ -z $PREVIOUS_IMAGE ]; then echo 首次发布没有旧版本可回滚 exit 1 fi if ! docker image inspect \ $PREVIOUS_IMAGE /dev/null 21 then echo 旧镜像不存在$PREVIOUS_IMAGE exit 1 fi PREVIOUS_TAG${PREVIOUS_IMAGE##*:} export JOY_ADMIN_IMAGE_TAG$PREVIOUS_TAG if docker compose up \ -d --no-build --force-recreate \ --wait --wait-timeout 300 \ joy-admin then echo 已自动回滚$PREVIOUS_IMAGE else echo 自动回滚失败需要人工处理 fi exit 1 }}}}}}post{always{shrm -f backend/.env 2/dev/null || truedeleteDir()}}}七、执行第一次发布选择Build with Parameters填写ACTIONDEPLOY GIT_BRANCHmain ROLLBACK_TAG留空每次发布生成唯一镜像joy-admin-backend:构建号-Git短Commit例如joy-admin-backend:7-9c0226cf joy-admin-backend:8-a321bc42八、验证发布dockerps--filternamejoy-admin-backenddockerimages joy-admin-backendcurlhttp://127.0.0.1:9080/查看当前运行镜像dockerinspect\--format{{.Config.Image}}\$(dockerps-q--filternamejoy-admin-backend)查看日志dockerlogs\--tail200\$(dockerps-q--filternamejoy-admin-backend)九、执行回滚查看历史镜像dockerimages joy-admin-backend 比如返回所有镜像 joy-admin-backend15-a8c37f21 joy-admin-backend16-d529bf10登陆Jenkins再次选择Build with Parameters参数界面填入ACTIONROLLBACK GIT_BRANCHmain ROLLBACK_TAG需要恢复的镜像标签如 15-a8c37f21回滚使用已有镜像不重新编译。发布新版本健康检查失败时流水线会自动恢复发布前正在运行的镜像。十、常见问题1. ssh-keyscan提示不是公钥文件错误(stdin) is not a public key file原因是 Codeup 没有提供 ED25519 主机密钥只提供 RSAssh-keyscan-T10-trsa codeup.aliyun.com2. Jenkins拉取代码报libcrypto错误错误Load key: error in libcrypto Permission denied (publickey)检查是否错误上传了.pub公钥。Jenkins需要不带.pub后缀的私钥。3. Debian下载返回502错误502 Bad Gateway Unable to fetch some archivesJenkins Dockerfile中配置APT重试和HTTPS源重新执行构建即可。4. BuildKit不可用错误Docker Compose requires buildx plugin the --mount option requires BuildKitJenkins镜像必须安装docker-buildx-plugin验证dockerexecjoy-jenkinsdockerbuildx version5. 容器无法连接宿主机数据库或Redis容器中的127.0.0.1表示容器自己。Mac和Docker Desktop使用host.docker.internalLinux通过现有Compose配置extra_hosts:-host.docker.internal:host-gateway6. 测试失败导致构建失败目前我的后端Dockerfile使用-Dmaven.test.skiptrue生产镜像构建不会运行测试。测试应作为独立质量阶段修复后再决定是否阻断发布。十一、迁移到另一台机器新机器需要安装Docker和Docker Compose。创建同样的joy-admin-deploy目录。构建并启动Jenkins。配置同样的known_hosts。配置凭据codeup-ssh。上传新机器对应环境的.env凭据ID仍为joy-admin-backend-env。创建同样的Pipeline任务。创建JOY_ADMIN_DATA_DIR目录。执行ACTIONDEPLOY。流水线不依赖本地项目目录所有代码均从Codeup获取。十二、安全和维护建议.env禁止提交Git。Jenkins不要直接暴露公网。Jenkins挂载Docker Socket后拥有宿主机Docker管理权限。定期备份joy_jenkins_home卷。至少保留最近5至10个后端镜像。不要随意执行docker system prune -a用于彻底清理 Docker 系统中未使用的资源包括未被任何容器引用的镜像、停止的容器。Docker镜像回滚不会回滚数据库。SQL变更应保持新旧应用版本兼容。跨机器保留历史镜像时需要增加Docker Registry。查看Docker磁盘占用dockersystemdf官方参考Jenkins Docker安装Jenkins PipelineDocker ComposeCodeup SSH密钥配置

相关新闻

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的电脑效率提升50%

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的电脑效率提升50%

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的电脑效率提升50% 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否每天都要在杂乱无章的…

2026/9/20 13:26:10 阅读更多 →
商品数据向量化:自定义向量函数适配向量数据库检索需求

商品数据向量化:自定义向量函数适配向量数据库检索需求

在电商行业的数字化转型进程中,商品检索效率与精准度直接影响用户体验和转化效率。传统基于关键词匹配的检索模式,难以满足用户对“语义相似、场景适配”的检索需求,例如用户搜索“夏季透气连衣裙”,传统检索可能遗漏“夏季薄款透…

2026/9/22 15:59:27 阅读更多 →
【会议征稿通知 | 西南石油大学支持 | Springer出版 | EI 、Scopus稳定检索】第二届地质、能源与油气勘探国际学术会议(GEOGE 2026)

【会议征稿通知 | 西南石油大学支持 | Springer出版 | EI 、Scopus稳定检索】第二届地质、能源与油气勘探国际学术会议(GEOGE 2026)

第二届地质、能源与油气勘探国际学术会议(GEOGE 2026) 2026 2nd International Conference on Geology, Energy and Oil and Gas Exploration 2026年9月18-20日 | 中国成都 大会官网:www.geoge.net 截稿时间:见官网&#xff08…

2026/9/20 5:45:28 阅读更多 →

最新新闻

3步搞懂什么叫erp:源码解析帮你避开版本坑

3步搞懂什么叫erp:源码解析帮你避开版本坑

3步搞懂什么叫erp:源码解析帮你避开版本坑 版本升级后 API 全变了?别慌,很多开发者一遇到这种“推倒重来”的感觉就想放弃,其实只要深入理解底层逻辑,问题就解决了一半。很多新手查资料只看到表面功能,却忽略了 源码解析…

2026/9/22 17:50:12 阅读更多 →
EE58V完整示例:公路工程人源码级避坑指南

EE58V完整示例:公路工程人源码级避坑指南

EE58V完整示例:公路工程人源码级避坑指南 看了一堆教程还是不会写项目?这是很多转行或深耕公路工程领域的开发者最大的痛点。市面上关于 EE58V 的资料大多停留在概念堆砌,缺乏可直接落地的 完整示例…

2026/9/22 17:50:12 阅读更多 →
手写实现认证助手核心逻辑,面试不再慌

手写实现认证助手核心逻辑,面试不再慌

手写实现认证助手核心逻辑,面试不再慌 刚入职第一周,线上服务突然报警,日志里全是 java.lang.NullPointerException 和 javax.crypto.BadPaddingException 。盯着那串红底黑字的…

2026/9/22 17:50:11 阅读更多 →
社保增减员操作流程避坑指南:5个高频报错实战拆解

社保增减员操作流程避坑指南:5个高频报错实战拆解

社保增减员操作流程避坑指南:5个高频报错实战拆解 是不是刚接手社保增减员操作流程,复制网上的代码一跑,直接报错?或者系统提示“数据校验失败”,对着屏幕干瞪眼,不知道哪一步卡住了?别急,这种“代码能复制,逻辑跑不通”的坑,我踩了不下十次。今天…

2026/9/22 17:50:11 阅读更多 →
dota6.78ai中文版下载一文搞懂版本升级API变更实战

dota6.78ai中文版下载一文搞懂版本升级API变更实战

dota6.78ai中文版下载一文搞懂版本升级API变更实战 版本升级后 API 全变了,导致你写的脚本全报错?别慌,这不仅是你的问题,也是很多开发者的痛点。今天这篇文章,咱们不整虚的,直接针对 dota6.78ai中文版下载…

2026/9/22 17:49:11 阅读更多 →
网易考拉数据同步避坑指南:3个细节搞定项目搭建

网易考拉数据同步避坑指南:3个细节搞定项目搭建

网易考拉数据同步避坑指南:3个细节搞定项目搭建 刚学完 Python 语法,对着教程敲完 print("Hello World")…

2026/9/22 17:49:11 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →