GitHub Actions 自動(dòng)化運(yùn)維實(shí)戰(zhàn)指南
1. 引言在現(xiàn)代 DevOps 實(shí)踐中GitHub Actions 已成為最流行的 CI/CD 平臺(tái)之一。它不僅能夠自動(dòng)化構(gòu)建、測(cè)試和部署流程還能承擔(dān)大量運(yùn)維任務(wù)如自動(dòng)清理資源、監(jiān)控倉(cāng)庫(kù)狀態(tài)、定時(shí)執(zhí)行腳本、自動(dòng)發(fā)布版本等。本文將從實(shí)戰(zhàn)角度出發(fā)通過(guò)完整的代碼示例帶你掌握 GitHub Actions 在自動(dòng)化運(yùn)維中的核心用法。2. 基礎(chǔ)概念與準(zhǔn)備工作2.1 什么是 GitHub ActionsGitHub Actions 是 GitHub 提供的持續(xù)集成與持續(xù)交付CI/CD平臺(tái)允許你在倉(cāng)庫(kù)中定義工作流Workflow自動(dòng)響應(yīng)代碼推送、Issue 創(chuàng)建、PR 合并等事件或按計(jì)劃定時(shí)執(zhí)行任務(wù)。2.2 核心概念Workflow工作流一個(gè)可配置的自動(dòng)化流程定義在.github/workflows/目錄下的 YAML 文件中。Job作業(yè)工作流中的一個(gè)任務(wù)單元多個(gè) Job 可以并行或串行執(zhí)行。Step步驟Job 中的單個(gè)操作可以是運(yùn)行命令、執(zhí)行腳本或調(diào)用 Action。Action動(dòng)作可復(fù)用的自定義應(yīng)用可以從 GitHub Marketplace 獲取或自己編寫(xiě)。Runner運(yùn)行器執(zhí)行工作流的服務(wù)器可以是 GitHub 托管的Ubuntu/Windows/macOS或自托管的。2.3 準(zhǔn)備工作開(kāi)始之前請(qǐng)確保擁有一個(gè) GitHub 賬號(hào)并創(chuàng)建了目標(biāo)倉(cāng)庫(kù)。倉(cāng)庫(kù)中已包含需要運(yùn)維的項(xiàng)目代碼。了解基本的 YAML 語(yǔ)法??蛇x準(zhǔn)備好云服務(wù)商的 API Token 或 SSH 密鑰用于遠(yuǎn)程操作。3. 第一個(gè)自動(dòng)化運(yùn)維工作流3.1 創(chuàng)建基礎(chǔ)工作流文件在倉(cāng)庫(kù)根目錄創(chuàng)建.github/workflows/ops-demo.yml文件name: 自動(dòng)化運(yùn)維演示 on: push: branches: [ main ] schedule: - cron: 0 2 * * * # 每天 UTC 2:00 執(zhí)行 workflow_dispatch: # 支持手動(dòng)觸發(fā) jobs: health-check: runs-on: ubuntu-latest steps: - name: 檢出代碼 uses: actions/checkoutv4 - name: 檢查系統(tǒng)狀態(tài) run: | echo 磁盤(pán)使用情況 df -h echo 內(nèi)存使用情況 free -h echo 運(yùn)行中的進(jìn)程 ps aux --sort-%mem | head -10 name: 檢查網(wǎng)絡(luò)連通性 run: | echo 檢查 GitHub 連通性... curl -s -o /dev/null -w %{http_code} https://api.github.com echo echo 檢查外部服務(wù)... curl -s -o /dev/null -w %{http_code} https://example.com3.2 觸發(fā)與查看結(jié)果將文件推送到main分支后進(jìn)入倉(cāng)庫(kù)的Actions標(biāo)簽頁(yè)即可看到工作流運(yùn)行。每次推送會(huì)自動(dòng)觸發(fā)同時(shí)每天凌晨 2 點(diǎn)也會(huì)自動(dòng)執(zhí)行一次健康檢查。4. 定時(shí)任務(wù)自動(dòng)清理與備份4.1 自動(dòng)清理過(guò)期 ArtifactsGitHub Actions 生成的 Artifacts 會(huì)占用存儲(chǔ)空間以下工作流定期清理 7 天前的產(chǎn)物name: 清理過(guò)期 Artifacts on: schedule: - cron: 0 6 * * 0 # 每周日 UTC 6:00 workflow_dispatch: jobs: cleanup: runs-on: ubuntu-latest steps: - name: 獲取并刪除過(guò)期 Artifacts env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO: ${{ github.repository }} run: | # 獲取所有 Artifacts artifacts$(gh api /repos/$REPO/actions/artifacts --jq .artifacts[]) # 計(jì)算 7 天前的時(shí)間戳 cutoff$(date -d 7 days ago %s) echo 開(kāi)始清理 7 天前的 Artifacts... echo $artifacts | while read -r artifact; do created_at$(echo $artifact | jq -r .created_at) created_ts$(date -d $created_at %s) name$(echo $artifact | jq -r .name) id$(echo $artifact | jq -r .id) if [ $created_ts -lt $cutoff ]; then echo 刪除過(guò)期 Artifact: $name (ID: $id) gh api -X DELETE /repos/$REPO/actions/artifacts/$id fi done echo 清理完成/code/pre 4.2 自動(dòng)備份倉(cāng)庫(kù)到外部存儲(chǔ) 將倉(cāng)庫(kù)完整備份到 AWS S3 或阿里云 OSS name: 倉(cāng)庫(kù)自動(dòng)備份 on: schedule: cron: 0 4 * * * # 每天 UTC 4:00 workflow_dispatch: jobs: backup-to-s3: runs-on: ubuntu-latest steps: name: 檢出完整倉(cāng)庫(kù)含所有分支和標(biāo)簽 uses: actions/checkoutv4 with: fetch-depth: 0 # 拉取完整歷史 name: 打包倉(cāng)庫(kù) run: | TIMESTAMP$(date %Y%m%d_%H%M%S) REPO_NAME$(echo ${{ github.repository }} | tr / ) ARCHIVE_NAME${REPO_NAME}${TIMESTAMP}.tar.gz tar -czf $ARCHIVE_NAME --exclude.git . echo ARCHIVE_NAME$ARCHIVE_NAME $GITHUB_ENV echo 備份包大小: $(du -h $ARCHIVE_NAME | cut -f1) name: 上傳到 S3 env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_REGION: us-east-1 S3_BUCKET: ${{ secrets.S3_BACKUP_BUCKET }} run: | aws s3 cp ${{ env.ARCHIVE_NAME }} s3://$S3_BUCKET/backups/${{ env.ARCHIVE_NAME }} echo 備份已上傳到 S3: s3://$S3_BUCKET/backups/${{ env.ARCHIVE_NAME }} name: 清理本地備份文件 run: rm -f ${{ env.ARCHIVE_NAME }} 自動(dòng)發(fā)布版本與生成 Release Notes 5.1 語(yǔ)義化版本自動(dòng)發(fā)布 當(dāng)推送符合語(yǔ)義化版本規(guī)范的標(biāo)簽時(shí)自動(dòng)創(chuàng)建 Release 并生成變更日志 name: 自動(dòng)發(fā)布版本 on: push: tags: v* # 匹配 v1.0.0、v2.1.3 等標(biāo)簽 jobs: release: runs-on: ubuntu-latest permissions: contents: write steps: name: 檢出代碼 uses: actions/checkoutv4 with: fetch-depth: 0 name: 生成變更日志 id: changelog run: | 獲取上一個(gè)標(biāo)簽 PREV_TAG$(git tag --sort-creatordate | sed -n 2p) if [ -z $PREV_TAG ]; then echo 這是第一個(gè)版本無(wú)歷史對(duì)比 CHANGELOG## 初始版本\n\n- 首次發(fā)布 else echo 對(duì)比范圍: $PREV_TAG - ${{ github.ref_name }} CHANGELOG$(git log $PREV_TAG..${{ github.ref_name }} --prettyformat:- %s (%h) --no-merges) fi 將多行內(nèi)容寫(xiě)入環(huán)境變量 echo CHANGELOGlt;lt;EOF gt;gt; $GITHUB_ENV echo -e $CHANGELOG gt;gt; $GITHUB_ENV echo EOF gt;gt; $GITHUB_ENV name: 創(chuàng)建 Release uses: softprops/action-gh-releasev2 with: name: Release ${{ github.ref_name }} body: | 版本 ${{ github.ref_name }} 變更內(nèi)容 ${{ env.CHANGELOG }} 安裝說(shuō)明 請(qǐng)參考項(xiàng)目文檔獲取最新版本。 draft: false prerelease: false generate_release_notes: false 6. 自動(dòng) Issue 與 PR 管理 6.1 自動(dòng)標(biāo)記和分類(lèi) Issue name: Issue 自動(dòng)分類(lèi) on: issues: types: [opened] jobs: triage: runs-on: ubuntu-latest permissions: issues: write steps: name: 根據(jù)標(biāo)題添加標(biāo)簽 uses: actions/github-scriptv7 with: script: | const title context.payload.issue.title.toLowerCase(); const labels []; if (title.includes(bug) || title.includes(錯(cuò)誤) || title.includes(故障)) { labels.push(bug); } if (title.includes(feature) || title.includes(功能) || title.includes(需求)) { labels.push(enhancement); } if (title.includes(doc) || title.includes(文檔)) { labels.push(documentation); } if (title.includes(urgent) || title.includes(緊急) || title.includes(critical)) { labels.push(urgent); } if (labels.length gt; 0) { await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.issue.number, labels: labels }); } name: 自動(dòng)回復(fù)新 Issue uses: actions/github-scriptv7 with: script: | const body 感謝你提交 Issue 自動(dòng)回復(fù) 你的問(wèn)題已收到維護(hù)團(tuán)隊(duì)會(huì)盡快處理。 請(qǐng)確認(rèn)以下信息 是否已搜索過(guò)類(lèi)似 Issue 是否提供了復(fù)現(xiàn)步驟 是否附帶了相關(guān)日志或截圖 amp;gt; 這是一個(gè)自動(dòng)回復(fù)請(qǐng)勿回復(fù)此消息。; await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.issue.number, body: body });/code/pre 6.2 自動(dòng)關(guān)閉過(guò)期 Issue name: 關(guān)閉過(guò)期 Issue on: schedule: cron: 0 0 * * # 每天 UTC 0:00 workflow_dispatch: jobs: stale: runs-on: ubuntu-latest permissions: issues: write pull-requests: write steps: uses: actions/stalev9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 此 Issue 已超過(guò) 30 天無(wú)活動(dòng)將被標(biāo)記為過(guò)期。如果仍需處理請(qǐng)回復(fù)。 stale-pr-message: 此 PR 已超過(guò) 30 天無(wú)活動(dòng)將被標(biāo)記為過(guò)期。 close-issue-message: 由于長(zhǎng)期無(wú)活動(dòng)此 Issue 已被自動(dòng)關(guān)閉。 close-pr-message: 由于長(zhǎng)期無(wú)活動(dòng)此 PR 已被自動(dòng)關(guān)閉。 days-before-stale: 30 days-before-close: 7 stale-issue-label: stale stale-pr-label: stale exempt-issue-labels: pinned,security exempt-pr-labels: pinned,security 安全掃描與合規(guī)檢查 7.1 依賴(lài)安全掃描 name: 安全掃描 on: push: branches: [ main, develop ] pull_request: branches: [ main ] schedule: cron: 0 8 * * 1 # 每周一 UTC 8:00 jobs: security-scan: runs-on: ubuntu-latest steps: uses: actions/checkoutv4 name: 運(yùn)行 Trivy 漏洞掃描 uses: aquasecurity/trivy-actionmaster with: scan-type: fs scan-ref: . format: sarif output: trivy-results.sarif severity: CRITICAL,HIGH name: 上傳掃描結(jié)果到 GitHub Security uses: github/codeql-action/upload-sarifv3 with: sarif_file: trivy-results.sarif name: 檢查 Secrets 泄露 uses: gitleaks/gitleaks-actionv2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} name: 運(yùn)行 Dependency Check uses: dependency-check/Dependency-Check_Actionmain with: project: my-project path: . format: HTML out: reports env: JAVA_HOME: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.9-9/x64 多環(huán)境部署自動(dòng)化 8.1 環(huán)境審批與自動(dòng)部署 name: 多環(huán)境部署 on: push: branches: develop staging main jobs: test: runs-on: ubuntu-latest steps: uses: actions/checkoutv4 name: 運(yùn)行測(cè)試 run: | echo 運(yùn)行單元測(cè)試... npm test 或 mvn test 等 echo 所有測(cè)試通過(guò) deploy-dev: needs: test if: github.ref refs/heads/develop runs-on: ubuntu-latest environment: name: development url: https://dev.example.com steps: name: 部署到開(kāi)發(fā)環(huán)境 run: | echo 部署到開(kāi)發(fā)服務(wù)器... scp 或 rsync 或 kubectl 命令 echo 部署完成: https://dev.example.com deploy-staging: needs: test if: github.ref refs/heads/staging runs-on: ubuntu-latest environment: name: staging url: https://staging.example.com steps: name: 部署到預(yù)發(fā)布環(huán)境 run: | echo 部署到預(yù)發(fā)布服務(wù)器... echo 部署完成: https://staging.example.com deploy-production: needs: test if: github.ref refs/heads/main runs-on: ubuntu-latest environment: name: production url: https://example.com steps: name: 等待人工審批 uses: trstringer/manual-approvalv1 with: secret: ${{ secrets.GITHUB_TOKEN }} approvers: admin-team minimum-approvals: 2 issue-title: 生產(chǎn)環(huán)境部署審批請(qǐng)求 name: 部署到生產(chǎn)環(huán)境 run: | echo 部署到生產(chǎn)服務(wù)器... echo 部署完成: https://example.com name: 健康檢查 run: | sleep 30 STATUS$(curl -s -o /dev/null -w %{http_code} https://example.com/health) if [ $STATUS ! 200 ]; then echo 健康檢查失敗 exit 1 fi echo 健康檢查通過(guò) 監(jiān)控與告警 9.1 工作流運(yùn)行狀態(tài)監(jiān)控 name: 工作流運(yùn)行監(jiān)控 on: workflow_run: workflows: [] types: completed jobs: notify-on-failure: runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion failure }} steps: name: 發(fā)送失敗通知到釘釘 env: DINGTALK_WEBHOOK: ${{ secrets.DINGTALK_WEBHOOK }} run: | WORKFLOW${{ github.event.workflow_run.name }} BRANCH${{ github.event.workflow_run.head_branch }} URL${{ github.event.workflow_run.html_url }} MESSAGE{msgtype:markdown,markdown:{title:工作流運(yùn)行失敗,text:### ?? 工作流運(yùn)行失敗\n\n工作流: $WORKFLOW\n分支: $BRANCH\n倉(cāng)庫(kù): ${{ github.repository }}\n詳情: 查看運(yùn)行日志\n\n請(qǐng)相關(guān)同事及時(shí)處理}} curl -s -X POST -H Content-Type: application/json -d $MESSAGE $DINGTALK_WEBHOOK name: 發(fā)送失敗通知到 Slack uses: slackapi/slack-github-actionv1.24.0 with: payload: | { channel: #ops-alerts, username: GitHub Actions Bot, icon_emoji: :robot_face:, text: ?? 工作流 ${{ github.event.workflow_run.name }} 運(yùn)行失敗\n倉(cāng)庫(kù): ${{ github.repository }}\n分支: ${{ github.event.workflow_run.head_branch }}\n查看詳情: ${{ github.event.workflow_run.html_url }} } env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} 最佳實(shí)踐與優(yōu)化建議 10.1 性能優(yōu)化 緩存依賴(lài)使用 actions/cache 緩存 npm、Maven、pip 等依賴(lài)包減少重復(fù)下載。 矩陣構(gòu)建使用 strategy.matrix 并行測(cè)試多個(gè)版本或平臺(tái)。 條件執(zhí)行利用 if 條件跳過(guò)不必要的步驟。 Job 并行化將無(wú)依賴(lài)的 Job 設(shè)置為并行執(zhí)行。 10.2 安全最佳實(shí)踐 最小權(quán)限原則為 GITHUB_TOKEN 設(shè)置最小必要權(quán)限。 Secrets 管理敏感信息使用 GitHub Secrets 存儲(chǔ)不要在 YAML 中硬編碼。 第三方 Action 審查使用前檢查 Action 源碼優(yōu)先使用官方或經(jīng)過(guò)驗(yàn)證的 Action。 環(huán)境隔離為不同環(huán)境dev/staging/prod配置獨(dú)立的 Environment 和 Secrets。 10.3 可維護(hù)性建議 復(fù)用工作流將通用步驟抽取為可復(fù)用的 Composite Action 或 Reusable Workflow。 命名規(guī)范工作流、Job、Step 使用有意義的名稱(chēng)便于排查問(wèn)題。 日志輸出在關(guān)鍵步驟添加詳細(xì)的日志輸出方便調(diào)試。 版本鎖定使用 Action 的精確版本號(hào)如 v4.1.0而非大版本如 v4避免意外更新導(dǎo)致兼容性問(wèn)題。 總結(jié) 本文從實(shí)戰(zhàn)角度出發(fā)詳細(xì)介紹了 GitHub Actions 在自動(dòng)化運(yùn)維中的多種應(yīng)用場(chǎng)景包括 基礎(chǔ)健康檢查與定時(shí)任務(wù) 自動(dòng)清理與備份 版本發(fā)布與 Release Notes 生成 Issue 與 PR 自動(dòng)管理 安全掃描與合規(guī)檢查 多環(huán)境部署與審批流程 監(jiān)控告警集成 通過(guò)這些實(shí)戰(zhàn)代碼示例你可以快速搭建起一套完整的自動(dòng)化運(yùn)維體系。建議先從簡(jiǎn)單的健康檢查工作流開(kāi)始逐步增加更復(fù)雜的運(yùn)維任務(wù)最終實(shí)現(xiàn)全面的自動(dòng)化運(yùn)維覆蓋。

相關(guān)新聞

無(wú)人機(jī)飛手在沈陽(yáng)沒(méi)活可干?:避開(kāi)飛手內(nèi)卷,搶占無(wú)人機(jī)維修技術(shù)新賽道

無(wú)人機(jī)飛手在沈陽(yáng)沒(méi)活可干?:避開(kāi)飛手內(nèi)卷,搶占無(wú)人機(jī)維修技術(shù)新賽道

最近和不少沈陽(yáng)玩無(wú)人機(jī)、考飛行執(zhí)照的年輕人聊天,大家都在吐槽航拍、短途巡檢的單子越來(lái)越難接,同行太多壓低報(bào)價(jià),想靠單純飛機(jī)器穩(wěn)定增收并不容易。但很少有人留意到低空產(chǎn)業(yè)里一塊人才缺口巨大的藍(lán)海——無(wú)人機(jī)裝調(diào)與維修。如今市面上幾百…

2026/7/29 14:17:14 閱讀更多
Spring AI工具已經(jīng)調(diào)用成功,為什么最終回答仍為空?返回值、循環(huán)與上下文完整排查

Spring AI工具已經(jīng)調(diào)用成功,為什么最終回答仍為空?返回值、循環(huán)與上下文完整排查

文章摘要 有些Spring AI項(xiàng)目可以在日志中看到工具已經(jīng)被調(diào)用,數(shù)據(jù)庫(kù)查詢(xún)或HTTP請(qǐng)求也成功執(zhí)行,但客戶(hù)端最終收到空字符串、模型重復(fù)調(diào)用同一工具,或者回答完全沒(méi)有使用工具結(jié)果。這類(lèi)問(wèn)題與“模型沒(méi)有選擇工具”不同,通常發(fā)生在工…

2026/7/29 13:56:45 閱讀更多
麒麟Linux系統(tǒng)安裝配置MongoDB 6.0全攻略:從倉(cāng)庫(kù)適配到安全部署

麒麟Linux系統(tǒng)安裝配置MongoDB 6.0全攻略:從倉(cāng)庫(kù)適配到安全部署

1. 項(xiàng)目緣起:為什么要在麒麟Linux上折騰MongoDB?最近接手了一個(gè)新項(xiàng)目,后端數(shù)據(jù)模型變動(dòng)頻繁,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在頻繁修改表結(jié)構(gòu)時(shí)顯得有點(diǎn)力不從心。團(tuán)隊(duì)討論后,決定引入文檔型數(shù)據(jù)庫(kù)MongoDB來(lái)應(yīng)對(duì)這種靈活多變的場(chǎng)…

2026/7/29 13:56:45 閱讀更多
SSA-ESN多輸出回歸模型原理與Matlab實(shí)現(xiàn)

SSA-ESN多輸出回歸模型原理與Matlab實(shí)現(xiàn)

1. SSA-ESN多輸出回歸模型概述SSA-ESN(Singular Spectrum Analysis-Echo State Network)是一種結(jié)合奇異譜分析(SSA)和回聲狀態(tài)網(wǎng)絡(luò)(ESN)的混合預(yù)測(cè)模型,特別適用于多變量時(shí)間序列預(yù)測(cè)問(wèn)題。這種…

2026/7/29 15:17:17 閱讀更多
用 JDK 17 真實(shí)生成可被 MAT 打開(kāi)的堆快照練習(xí)文件

用 JDK 17 真實(shí)生成可被 MAT 打開(kāi)的堆快照練習(xí)文件

📌 本文檔手把手教你用 JDK 17 生成真實(shí)的、MAT 可分析的堆快照文件(.hprof),并在 MAT 中完成一次完整的內(nèi)存泄漏分析練習(xí)。 目錄 一、前置準(zhǔn)備二、編寫(xiě)模擬內(nèi)存泄漏的 Java 程序三、編譯并運(yùn)行四、生成堆快照(三種方…

2026/7/29 15:17:17 閱讀更多
電商商家獲客難獲客貴解決方案:平臺(tái)賣(mài)家如何借助 BBWEYY 打造第二獲客入口,含零代碼SAAS、AI編程、源碼定制交付

電商商家獲客難獲客貴解決方案:平臺(tái)賣(mài)家如何借助 BBWEYY 打造第二獲客入口,含零代碼SAAS、AI編程、源碼定制交付

平臺(tái)賣(mài)家如何借助 BBWEYY 打造第二獲客入口 摘要 在平臺(tái)流量競(jìng)爭(zhēng)持續(xù)升級(jí)、廣告成本不斷上升的背景下,越來(lái)越多電商平臺(tái)商家面臨站內(nèi)獲客貴、站外獲客弱、客戶(hù)沉淀難的現(xiàn)實(shí)問(wèn)題。本文圍繞電商平臺(tái)商家的增長(zhǎng)困境展開(kāi),重點(diǎn)討論 BBWEYY 小程序與 GEO 服務(wù)…

2026/7/29 15:17:17 閱讀更多
Arduino 101開(kāi)發(fā)環(huán)境搭建指南:從驅(qū)動(dòng)安裝到第一個(gè)Blink程序

Arduino 101開(kāi)發(fā)環(huán)境搭建指南:從驅(qū)動(dòng)安裝到第一個(gè)Blink程序

1. 從零開(kāi)始:為什么選擇 Arduino/Genuino 101 作為起點(diǎn)? 如果你剛剛踏入嵌入式開(kāi)發(fā)或者物聯(lián)網(wǎng)硬件的大門(mén),面對(duì)琳瑯滿(mǎn)目的開(kāi)發(fā)板,可能會(huì)感到一絲迷茫。Arduino Uno、ESP8266、樹(shù)莓派 Pico…… 每個(gè)都宣稱(chēng)自己簡(jiǎn)單易用。那么&#x…

2026/7/29 15:17:17 閱讀更多
三只貓課后作業(yè)3

三只貓課后作業(yè)3

說(shuō)明 下面的思考以及答案,都是本人憑經(jīng)驗(yàn)輸出的,對(duì)于 AI,我的經(jīng)驗(yàn)很不足的,主要是起到一個(gè)記錄作用,以后熟悉這塊之后再回過(guò)頭來(lái)看看自己的來(lái)時(shí)路。 作者有一句話,值得在平時(shí)工作中使用:要思考a…

2026/7/29 15:17:17 閱讀更多
在行空板上部署MediaPipe實(shí)現(xiàn)實(shí)時(shí)人像分割與摳圖

在行空板上部署MediaPipe實(shí)現(xiàn)實(shí)時(shí)人像分割與摳圖

1. 項(xiàng)目緣起:為什么要在行空板上折騰MediaPipe摳圖? 最近在做一個(gè)智能交互展項(xiàng),需要在資源受限的嵌入式設(shè)備上實(shí)時(shí)處理攝像頭畫(huà)面,把人物從背景里干凈地“摳”出來(lái)。一開(kāi)始想到的是上云或者用高性能工控機(jī)跑OpenCVDeeplabv3&#…

2026/7/29 15:07:17 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過(guò)來(lái)的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫(huà)效果。…

2026/7/29 0:15:24 閱讀更多