TechSummary 2025-09-09
· 閱讀時間約 11 分鐘
🔗 如何使用 GitHub 與 JFrog 整合實現從提交到生產的安全可追溯建構
- GitHub 與 JFrog 推出新的整合,旨在建立安全、可追溯的軟體供應鏈,將原始程式碼與經認證的二進位檔案連結。
- 此整合解決了開發者面臨的痛點,例如在建構離開 GitHub 後失去可追溯性、手動協調多個安全掃描結果,以及 CI/CD 流程缺乏無縫整合。
- 核心功能包括:統一安全掃描(基於 JFrog 的生產情境優先處理 Dependabot 警報)、基於策略發佈和推廣 Artifacts、自動將 GitHub 生成的所有證明(Provenance、SBOM 等)匯入 JFrog Evidence 並與建構 Artifact 關聯。
- 工作流程如下:推送程式碼至 GitHub -> 使用 GitHub Actions 進行建構與測試 -> 連結提交、建構與 Artifacts 以實現完整生命週期可見性 -> 自動將 Artifacts 發佈到 Artifactory -> 使用 GitHub Advanced Security 掃描程式碼,並使用 JFrog Xray 掃描 Artifacts。
- 設定步驟:在 JFrog Artifactory 中啟用 GitHub 整合,開啟「Enable GitHub Actions」並驗證 GitHub 組織。
- GitHub Actions 範例用於生成證明並推送到 Artifactory,其中使用
jfrog/jfrog-setup-cli
和actions/attest-build-provenance
等 actions。name: Build, Test & Attest
on:
push:
branches:
- main
env:
OIDC_PROVIDER_NAME: [...]
JF_URL: ${{ vars.JF_URL }}
JF_REGISTRY: ${{ vars.JF_REGISTRY }}
JF_DOCKER_REPO: [...]
IMAGE_NAME: [...]
BUILD_NAME: [...]
jobs:
build-test-deploy:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
attestations: write # Required for attestation
id-token: write # Added for OIDC token access
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Install JFrog CLI
id: setup-jfrog-cli
uses: jfrog/setup-jfrog-cli@v4.5.13
env:
JF_URL: ${{ env.JF_URL }}
with:
version: 2.78.8
oidc-provider-name: ${{ env.OIDC_PROVIDER_NAME }}
- name: Docker login
uses: docker/login-action@v3
with:
registry: ${{ env.JF_REGISTRY }}
username: ${{ steps.setup-jfrog-cli.outputs.oidc-user }}
password: ${{ steps.setup-jfrog-cli.outputs.oidc-token }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ env.JF_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.run_number }}
build-args: ${{ env.BUILD_ARGS }}
- name: Attest docker image
uses: actions/attest-build-provenance@v2
with:
subject-name: oci://${{ env.JF_REGISTRY }}/${{ env.IMAGE_NAME }}
subject-digest: ${{ steps.build-and-push.outputs.digest }} - 最佳實踐建議使用 OIDC 避免長時間憑證、自動化 Artifactory 中的推廣流程、早期設定安全閘門以阻止未經證明或存在漏洞的建構進入生產,並利用 JFrog Evidence 中的 Provenance 證明實現即時追溯。
✨ MPS 2025.2 發布!
Source: https://blog.jetbrains.com/mps/2025/09/mps-2025-1-is-out-2/
- MPS 2025.2 版本著重於全面提升品質與穩定性,並帶來多項顯著升級。
- 新增功能包括:能夠使用 OS 原生啟動器啟動 MPS,提供更穩健便捷的方式(例如:可將應用程式釘選到任務欄和開始選單)。
- 「Show Node Info」對話框進行了現代化改進。
- 改善了在複製貼上參考時處理 resolve-info 的方式,確保其正確更新。
- 引入了新的
FactoryMethodIcon
概念,允許透過具體的靜態工廠方法宣告來指定圖示。 - 平台已更新至支援 Java 21(源代碼和目標兼容性),以利用新的語言特性和提升執行時效能。
- 重要提示: 更新 MPS 合併驅動程式,因為其邏輯已變更並移除了一些舊的持久化 hack。當 MPS 檢測到專案中指定了舊版本時,務必允許其更新。
❄️ 偵測 IntelliJ Platform UI 凍結問題
Source: https://blog.jetbrains.com/platform/2025/09/investigating-intellij-platform-ui-freezes/
- 本文探討了 JetBrains IDE 中 UI 凍結的常見原因,這些 IDE 基於單一事件分派執行緒(EDT)的 Java AWT 框架構建。
- UI 凍結發生在 EDT 無法執行操作時,阻礙了用戶與 IDE 的互動;事件必須在 16 毫秒內處理才能實現 60 FPS 的渲染。
- 偵測 UI 凍結通常從檢查
AWT-EventQueue-0
執行緒傾印開始。 - UI 凍結的常見原因及解決方案:
- 讀寫鎖引起的凍結: EDT 試圖獲取寫鎖時被阻塞,而後台執行緒(例如高亮顯示)持有讀鎖但沒有頻繁檢查
ProgressManager.checkCanceled
。"AWT-EventQueue-0" prio=0 tid=0x0 nid=0x0 waiting on condition
...
(!) at com.intellij.platform.locking.impl.NestedLocksThreadingSupport$ComputationState.upgradeWritePermit(NestedLocksThreadingSupport.kt:370) - 後台寫操作引起的凍結: EDT 無法立即獲取寫意圖鎖,同時後台寫操作(如 VFS 刷新)因活躍的讀操作而掛起。
"AWT-EventQueue-0" #91 [119043] prio=6 os_prio=31 cpu=71985.87ms elapsed=1065.05s tid=0x00000001610c4c00 nid=119043 sleeping [0x0000000398429000]
java.lang.Thread.State: TIMED_WAITING (sleeping) - 執行緒飢餓:
Dispatchers.Default
或Dispatchers.IO
中的所有執行緒都被阻塞,導致協程停留在Cancelling
狀態。解決方案是將阻塞操作移出Default
分派器。"DefaultDispatcher-worker-9@28483" daemon prio=5 tid=0xa0 nid=NA waiting
...
(!) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runDefaultDispatcherTask(CoroutineScheduler.kt:882) - 服務初始化引起的死鎖: EDT 在服務初始化(寫操作)時被阻塞,而服務初始化又被讀鎖的獲取阻塞。解決方案是將讀操作移出服務初始化,或在讀操作中預加載服務。
"AWT-EventQueue-0" #59 [128003] prio=6 os_prio=31 cpu=3011.23ms elapsed=172.40s tid=0x000000012c07ae00 nid=128003 waiting on condition [0x000000039b0ae000]
java.lang.Thread.State: TIMED_WAITING (parking) runBlocking
處理: 執行緒阻塞於runBlocking
表示試圖同步執行協程;應使用平台專用的runBlockingCancellable
,並確保頻繁調用ProgressManager.checkCanceled()
。"JobScheduler FJ pool 6/15" prio=0 tid=0x0 nid=0x0 waiting on condition
...
(!) at com.intellij.openapi.progress.CoroutinesKt.runBlockingCancellable(coroutines.kt:117)
- 讀寫鎖引起的凍結: EDT 試圖獲取寫鎖時被阻塞,而後台執行緒(例如高亮顯示)持有讀鎖但沒有頻繁檢查
- 結論:大多數 UI 凍結是因插件程式碼與 IntelliJ Platform 之間協作不足造成,通過使用平台的可取消操作原語可顯著提升 IDE 響應性。