Saya kadang-kadang menemukan diri saya mencari biner melalui perubahan dan menjalankan tes untuk menentukan kapan cacat diperkenalkan. Ini membuat saya memiliki banyak log yang sangat mirip untuk disaring, dan terkadang saya kesulitan mengingat file diagnostik mana yang berasal dari changeset yang dijalankan.

Saya ingin memasukkan nomor changeset dalam file diagnostik entah bagaimana. Apakah ada cara untuk melakukan ini dengan Visual Studio/C#/AzureDevOps?

0
ORcoder 8 Maret 2019, 00:52

1 menjawab

Jawaban Terbaik

Microsoft dulu mendukung file bernama BuildInfo.config yang berguna untuk hal semacam ini, tetapi saya pikir dukungan untuk itu dihentikan setelah Visual Studio 2015.

Pada dasarnya, itu adalah file XML sederhana yang dibuat oleh MSBuild. Saat digunakan bersama binari aplikasi, kerangka kerja logging dapat membaca file dan menyertakan detailnya dalam output log.

Ada banyak cara Anda dapat membuat sendiri fungsi serupa. Inilah yang akan saya lakukan...

  1. Buat file info build kosong dan periksa dengan kode sumber Anda. File ini hanyalah contoh referensi--gunakan data placeholder. Ini bisa berupa XML, JSON, atau format lainnya (tetapi mungkin harus berbasis teks). Setel tindakan pembuatan file ke "Konten", sehingga akan disertakan dalam output build.
  2. Gunakan kerangka kerja logging Anda atau fungsionalitas inisialisasi telemetri untuk membaca file info build dan sertakan kontennya dalam output log. Implementasi yang tepat akan tergantung pada kerangka kerja logging Anda.
  3. Tambahkan tugas skrip Powershell ke saluran Azure DevOps Anda. Skrip harus memperbarui atau menimpa file info build. Anda bisa mendapatkan beberapa info bagus dari membuat variabel. Tugas harus dijalankan sebelum langkah kompilasi MSBuild.

Buat dan Parsing file BuildInfo

Untuk contoh ini, saya akan mengimplementasikan file info build saya sebagai pasangan kunci/nilai sederhana dalam file teks. Saya memilih teks sederhana karena memungkinkan contoh yang jelas tanpa memerlukan perpustakaan pihak ketiga atau penguraian yang rumit. Di aplikasi Anda, Anda mungkin ingin menggunakan JSON, XML, atau sesuatu yang lebih standar.

Pertama, buat file info build placeholder. File ini akan digunakan di lingkungan dev lokal, dan akan berfungsi sebagai referensi untuk skema info build Anda. Saya memanggil milik saya BuildInfo.txt, dan meletakkannya di direktori root proyek saya.

COMMIT=commit not set
BUILD=build not set

Selanjutnya, tulis helper untuk mengurai file info build. Milik saya sangat sederhana. Akan lebih bijaksana untuk menambahkan beberapa pertahanan terhadap info build yang hilang atau cacat, tetapi saya memilih untuk menghilangkan kode defensif apa pun untuk menjaga agar contoh tetap fokus.

class BuildInfo
{
    // Singleton instance backing field
    static readonly Lazy<BuildInfo> instance = new Lazy<BuildInfo>(() => new BuildInfo());

    // Singleton instance public accessor
    public static BuildInfo Instance => instance.Value;

    public string Commit { get; }
    public string Build { get; }

    private BuildInfo()
    {
        // This is a very rudimentary example of parsing the info file. It
        // will fail loudly on malformed input. Consider:
        //   1) Using a standard file format (JSON, XML). I rolled my own
        //      here to avoid adding a dependency on a parsing library.
        //   2) If you want your app to fail when no build info is
        //      available, add a more descriptive exception. If you don't
        //      want it to fail, add some devensive code or fallback logic.
        var info = File.ReadAllLines("BuildInfo.txt")
            .Select(l => l.Split('=', 2))
            .ToDictionary(key => key[0], val => val[1]);

        Commit = info["COMMIT"];
        Build = info["BUILD"];
    }
}

Tambahkan Info Bangun ke Output Log Anda

Saya menggunakan log4net di sini, tetapi kerangka kerja logging apa pun harus memiliki mekanisme serupa untuk menyesuaikan output log. Lihat dokumentasi kerangka kerja untuk info lebih lanjut.

Pertama, tambahkan info build Anda ke konteks logging. Ini harus berada di suatu tempat di kode startup aplikasi Anda--sedini mungkin.

log4net.GlobalContext.Properties["Build"] = BuildInfo.Instance.Build;
log4net.GlobalContext.Properties["Commit"] = BuildInfo.Instance.Commit;

Kemudian, perbarui konfigurasi appender log Anda untuk menyertakan bidang khusus. Berikut adalah contoh konfigurasi untuk appender konsol. Bagian-bagian penting adalah %property{BuildId} dan %property{Commit}.

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <target value="Console.Error" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5level [%property{BuildId}] [%property{Commit}] - %message%newline" />
        </layout>
    </appender>
  <root>
    <level value="ALL"/>
    <appender-ref ref="ConsoleAppender" />
  </root>
</log4net>

Sekarang, saat Anda memanggil log.Warn("Some log mesage"), Anda akan melihat yang berikut keluaran konsol:

WARN  [build not set] [commit not set] - Some log mesage

Dapatkan Detail Bangun dari CI

Terakhir, Anda perlu mendapatkan detail build yang sebenarnya dari lingkungan CI Anda. Saya melakukan ini dengan tugas skrip PowerShell yang sangat sederhana. Pastikan tugas berjalan sebelum langkah build Anda!

@(
    "COMMIT=$($Env:BUILD_SOURCEVERSION)",
    "BUILD=$($Env:BUILD_BUILDID)"
) | Out-File BuildInfo.txt

(Kiat: Anda dapat melihat semua variabel lingkungan yang tersedia dengan menjalankan Get-ChildItem Env: | Sort Name dalam tugas PowerShell)

(Kiat lain: jika Anda ingin menggunakan JSON alih-alih teks, lihat cmdlet ConvertTo-Json)

Sekarang, jika semua bagian sudah terpasang, server CI harus menimpa file info build yang dicentang. File baru kemudian harus menjadi paket dengan artefak yang dapat digunakan, dan disalin ke server Anda. Saat startup, aplikasi Anda harus membaca info build, lalu info tersebut harus disertakan dalam setiap pesan log.

Ada banyak hal kecil yang harus disejajarkan antara proses pembuatan dan penerapan Anda, jadi bersiaplah untuk beberapa percobaan dan kesalahan. Pengaturan CI/CD cenderung membosankan, menurut pengalaman saya.

0
xander 10 Maret 2019, 00:41