CICDパイプラインでFastlanを使用して圧縮ビルドファイルのサイズを記録しようとしています。コマンドラインでこれを試した場合:
du -h fileName.ipa | awk '{print $1}'
良い結果。ただし、次のようにスクリプトに入れようとすると、次のようになります。
sh '''
# Add filesize to release message
var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
fileSizeInfo=(du -h '"#{IPA_FILE_PATH}"'$fileName | awk '{print $1}')
echo "$buildInfo"
sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
'''
次の構文エラーが発生します。
[17:50:24]: 262: var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
[17:50:24]: => 263: fileSizeInfo=(du -h '"#{IPA_FILE_PATH}"'$fileName | awk '{print $1}')
[17:50:24]: 264: echo "$buildInfo"
[17:50:24]: 265: sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
[!] Syntax error in your Fastfile on line 263: Fastfile:263: syntax error, unexpected '{', expecting `end'
..._FILE_PATH}"'$fileName | awk '{print $1}')
... ^
Fastfile:285: syntax error, unexpected `end', expecting end-of-input
end
^~~
私はシェルスクリプトが初めてなので、助けてくれてありがとう。間違った場所から引用した可能性があります。役に立つなら、FastlanはRuby構文を使用するので、そこにRuby文字列補間があります。
編集する:
詳細については、クイックファイルから呼び出されるフルパスは次のとおりです。
# Send message MS Teams Channel
lane:sendTeamsMessage do |options|
=begin
MS Teams messages are sent using webhooks and it got limited support to HTML and Markdown.
This implementation uses HTML formatted message.
Webhook will not accept new lines or double quotes because it can break the JSON struture.
The message file preparation is done in multiple steps.
1. Add .ipa file size info to release message HTML
2. Replace all double quotes with single quotes
3. Copy the Teams message payload template and update it with the message content
4. Replace 'MESSAGE_INFO' string with the HTML formatted content file
5. Send the message to Teams channel
=end
sh '''
# Add filesize to release message
var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
var fullFilePath='"#{IPA_FILE_PATH}"'$fileName
echo fullFilePath
fileSizeInfo=(du -h $fullFilePath | awk '{print $1}')
echo "$buildInfo"
sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
'''
sh '''
# Copy the release message html file
cp -fr '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"' '"#{TEAMS_MESSAGE_FILE_NAME}"'
'''
# Replace all double quotes with single quotes to make it JSON friendly
sh("sed","-i","-e","s|\"|\'|g","#{TEAMS_MESSAGE_FILE_NAME}")
sh'''
cp -fr '"#{TEAMS_PAYLOAD_TEMPLATE_FILE_NAME}"' '"#{TEAMS_PAYLOAD_FILE_NAME}"'
message=`cat '"#{TEAMS_MESSAGE_FILE_NAME}"'`
sed -i -e "s|MESSAGE_INFO|'"$message"'|g" '"#{TEAMS_PAYLOAD_FILE_NAME}"'
'''
# Send the message to Teams channel
sh '''
echo '"#{options[:webhook]}"'
curl -H "Content-Type: application/json" -d @'"#{TEAMS_PAYLOAD_FILE_NAME}"' '"#{options[:webhook]}"'
'''
end
ファイルパス/名前を独自の変数に移動しようとしましたが、まだ同じ問題があります。
答え1
bash
コマンド出力をキャプチャするイディオムは次のとおりです。
du -h fileName.ipa | awk '{print $1}'
出力を変数に保存するには:
fileSizeInfo=$(du -h fileName.ipa | awk '{print $1}')
$
これは、コードに欠けている点を除いて、スクリプトのBash部分の行と非常によく似ています(
。これが混乱した出力の主な原因であるようです。
答え2
一度やってみたいと思います。コマンドの置き換え。
あなたの例では
var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
有効なコマンド おおよそ。
2番目のコマンドは欠落のために置き換えられます$
。
fileSizeInfo=$(du -h $fullFilePath | awk '{print $1}')
利用可能な2つのコマンドの置き換えbash
は現代的です。POSIXスタイル
$(command)
または古いスタイル
`command`
読みやすさを高めるには、最初のものを使用することをお勧めします。
コードをもっと読みやすくしたい場合は、あなたが言ったように書いてください。パイプや他のコマンドなしで読みやすい方法でファイルサイズを取得する別の方法は次のとおりです。
stat -c "%s" /path/to/file
あなたの例で試すことができます
fileSizeInfo=$(stat -c "%s" $fullFilePath)
答え3
Rubyでは、次のものを使用できます。
File.stat("/path/to/file").size