Saya mencoba menulis file gitlab-ci.yml
yang menggunakan string multi-baris untuk perintah. Namun, sepertinya string tersebut tidak diurai. Saya sudah mencoba kedua - |
dan - >
dengan hasil yang sama.
stages:
- mystage
Build:
stage: mystage
script:
- |
echo -e "
echo 'hi';
echo 'bye';
"
Ketika mencoba menjalankannya, hanya muncul echo -e '
sebagai skrip yang akan dijalankan, dan bukan seluruh string multiline. Ini menyebabkan masalah bagi saya.
Apa sintaks yang benar untuk menulis sesuatu seperti ini?
Saya datang ke sini dengan menduga sebelumnya bahwa ini akan menjadi masalah, tetapi perintah "multi-line" berikut ini untuk keterbacaan bekerja untuk saya:
Gitlab Runner: Shell Runner versi 1.11.0 / Versi Gitlab: 8.17.2
myjob:
stage: deploy
script:
# Single line command
- az component update --add sql
# Multi-line command
- az sql server create -n ${variable} -g ${variable} -l ${variable}
--administrator-login ${variable} --administrator-login-password ${variable}
Anda dapat menggunakan skrip/perintah multiline melalui fitur yaml literal_block dan anchors. Contoh:
.build: &build |
echo -e "\n$hl🛠 Building $green$build_path/$build_assets_dir/*.js $nl\n"
echo -e "javascript-obfuscator $build_path/$build_assets_dir/*.js"
[...]
build:master:
stage: build
script:
- *rsync
- *build
[...]
TL;DR; Anda ingin menggunakan skalar YAML multi-baris (untuk keterbacaan) yang dimuat sebagai string baris tunggal yang dapat dikeluarkan sebagai perintah oleh Gitlab-CI. Untuk melakukannya, gunakan skalar polos (tanpa tanda kutip) di YAML yang tersebar di beberapa baris:
script:
- echo -e
"echo 'hi';
echo 'bye';"
Perlu diketahui bahwa ada beberapa batasan yang diberlakukan oleh YAML pada skalar tersebut. Apa yang perlu Anda ketahui adalah bahwa setiap baris berikut diindentasi setidaknya satu posisi lebih dari echo -e
(yang diindentasi dua posisi relatif terhadap node koleksinya, yang tidak diindentasi sama sekali), dan bahwa setiap baris baru digantikan oleh spasi saat dimuat (jadi Anda perlu sedikit berhati-hati di mana harus meletakkan baris baru).
Ada beberapa kesalahpahaman dalam postingan Anda, yang menyebabkan Anda mengajukan pertanyaan yang salah.
Tidak ada yang namanya string YAML multi-baris. YAML memiliki skalar dan beberapa dari skalar ini dapat dimuat oleh program sebagai string, sementara beberapa yang lain akan dimuat sebagai bilangan bulat, float, dll.
Anda jelas tertarik pada node skalar yang dimuat sebagai string, karena string tersebut kemudian dapat diinterpretasikan sebagai command-line. Tetapi Anda tidak ingin memiliki baris perintah multi-baris (yaitu dengan baris baru yang disematkan), karena skrip multi-baris tidak didukung di Gitlab CI (seperti yang ditunjukkan @Jordan).
Untuk keterbacaan, Anda ingin menggunakan kemampuan standar YAML untuk memuat skalar multi-baris sebagai string baris tunggal.
Jika Anda tidak peduli dengan keterbacaan, Anda dapat menggunakan:
- echo -e "\n echo 'hi';\n echo 'bye';\n"
dan karena skalar Anda tidak dikutip (yaitu dimulai dengan echo
) Anda tidak perlu melakukan sesuatu yang khusus di YAML untuk backslashes atau tanda kutip.
Hasil dari skripnya sama (cetak baris kosong, cetak echo 'hi';
pada baris yang menjorok empat spasi, cetak echo 'bye';
pada baris yang menjorok empat spasi).
Jika Anda ingin menggunakan input multi-baris untuk keterbacaan, yang dimuat sebagai satu baris, pada dasarnya ada dua pilihan: gunakan skalar bidang multi-baris atau gunakan skalar terlipat di YAML Anda.
Polos berarti skalar tidak dikuotasi, dan seperti halnya dengan multi-baris di YAML, multi-baris berarti baris-baris berikut perlu diindentasi dengan tepat, dalam hal ini lebih jauh dari baris awal
script:
- echo -e
"echo 'hi';
echo 'bye';"
garis baru diganti dengan spasi jadi jangan'tidak dilakukan:
script:
- echo -e
"echo 'hi';
echo '
bye';"
karena Anda akan mendapatkan spasi yang terlihat sebelum bye
.
Ada beberapa batasan seperti bahwa Anda tidak dapat memiliki titik dua yang diikuti oleh spasi di dalam skalar tersebut (yang akan membuatnya terlihat seperti pasangan nilai-kunci).
Tidak perlu untuk melepaskan backslash dalam skalar biasa, karena Anda tidak dapat melepaskan karakter apa pun dalam skalar biasa, tetapi tentu saja Anda dapat menyertakan backslash, yang akan berakhir dalam string yang dimuat dari YAML dan dapat memiliki arti untuk perintah yang dieksekusi dari string itu.
Skalar terlipat mirip dengan skalar biasa di mana semua baris baru (tunggal) diganti dengan spasi selama pemuatan:
script:
- >
echo -e
"echo 'hi';
echo 'bye';"
Anda perlu mengindentasi informasi perintah yang sebenarnya setidaknya sebanyak indikator skalar terlipat (>
).
Berlawanan dengan skalar biasa, hal-hal seperti :
tidak memiliki arti khusus. Jadi jika skalar biasa gagal dengan melemparkan kesalahan YAML, skalar terlipat serupa kemungkinan besar tidak akan'tidak.
Konfigurasi wp membuat perintah sangat rewel... dari .gitlab-ci...
build:
stage: build
script:
- echo "Building the app"
- |
wp config create --dbname=$vardb --dbhost=$varhost --dbuser=$varusr --dbpass=$varpas --extra-php <<PHP
define( 'WP_DEBUG', false );
define( 'FS_METHOD', 'direct' );
define( 'WP_POST_REVISIONS', 5 );
define( 'AUTOSAVE_INTERVAL', 600 );
PHP
- scp ./wp-config.php continued...
allow_failure: true
Ini bekerja untuk saya di Travis CI
before_install:
- set -e
- |
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<settings xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xsi:schemaLocation=\"http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd\">
<servers>
<server>
<id>github</id>
<username>${GITHUB_USERNAME}</username>
<password>${GITHUB_PASSWORD}</password>
</server>
</servers>
</settings>
" > ${HOME}/.m2/settings.xml
Berikut dua env variabel (${GITHUB_USERNAME}
dan ${GITHUB_PASSWORD}
) juga akan diinterpolasi