Azure ReplaceTokens 字串轉義問題

問題現象 在某個專案中,CI/CD 過程需要將設定以 token 替換的方式寫入 JSON 檔案,其中一個欄位包含多行文字內容。在 pipeline 中使用了 qetza.replacetokens.replacetokens-task.replacetokens@5 這個 Azure DevOps Task: - task: qetza.replacetokens.replacetokens-task.replacetokens@5 displayName: 'Replace token in xxx-config.json' inputs: targetFiles: '$(System.ArtifactsDirectory)\\drop\\$(Build.BuildId)\\xxx-config.json' 完成替換並部署到測試環境後,發現無法正常啟動。檢查部署產出的 JSON 檔案時,發現原本應為多行的字串中的 \n,在處理後變成了 \\n。 這導致程式在解析該欄位時,無法還原出原本的格式,進而發生錯誤。 問題原因 查閱文件後發現,ReplaceTokens 預設會對變數值進行 escape 處理。這對一般情況有幫助,但對於需要保留格式的多行字串(如憑證或編碼內容)就會導致格式錯誤。 解法:使用 noescape() 函數停用自動 escape ReplaceTokens 支援開啟轉換函數(Transformations)功能,可用來自訂變數處理方式。具體做法如下: 步驟 1:啟用 enableTransforms 在 ReplaceTokens 的 YAML 設定中加上 enableTransforms: true - task: qetza.replacetokens.replacetokens-task.replacetokens@5 displayName: 'Replace token in xxx-config.json' inputs: targetFiles: '$(System.ArtifactsDirectory)\\drop\\$(Build.BuildId)\\xxx-config.json' enableTransforms: true # 要加這行 步驟 2:修改 JSON,使用 noescape() 將目標檔案中的 token 改寫為: { "config_content": "#{noescape(multiline_config)}#" } 如此可讓 \n 在替換後仍保持原始格式,不會被轉成 \\n。 ...

July 9, 2025 · 1 分鐘

Azure Pipeline 編譯 iOS App Groups 權限未簽入問題

前言 公司原本的上線流程最近要走 Azure DevOps 方式上線,我維護的 iOS App 不外乎也要走這個流程。原本測試都沒有太大問題,但上線之後發現 App Groups 功能沒有正確運作,就開始查找問題,最終找到問題所在並解決,記錄一下過程,並延伸相關知識。 Trouble Shooting 一開始覺得很奇怪,這次上線的內容並沒有異動到 App Group 的設定,所以應該跟 source code 沒有太大關係。後來先嘗試在本機 build 一版,結果發現透過這個方式運作正常,但透過 Azure pipeline build 出來的就會發生問題。因此轉向研究 pipeline yaml 的設定是否出現狀況。 先進一步確認透過 Azure pipeline 包出來的 artifacts 內容是否正確,一般而言,iOS App 打包後的成品如下: DistributionSummary.plist ExportOptions.plist YourAppName.ipa Packaging.log 查看 .ipa 我們可以查看 YourAppName.ipa 裡面到底簽入了哪些權限: 解壓縮 .ipa 檔案: unzip YourAppName.ipa -d AppContents 進入 Payload 目錄: cd AppContents/Payload 執行 codesign 指令: codesign -d --entitlements :- YourAppName.app 每個部分的含義是: codesign:呼叫程式碼簽署工具 d:表示 “display”,用於顯示簽署資訊 -entitlements :-:要求工具顯示應用程式中包含的所有權限(entitlements) 這裡的 :- 是一個特殊的語法,表示將輸出導向到標準輸出(stdout) YourAppName.app:要檢查的應用程式套件路徑 如果有正確簽入 App Groups 的權限,應該要有 <key>com.apple.security.application-groups</key> 的蹤跡,但發現透過 Azure pipeline 包出來 .ipa 沒有。 ...

July 3, 2025 · 2 分鐘