Skip to content

Create guide for filtering and searching GitHub issues - #33

Merged
Sazwanismail merged 1 commit into
mainfrom
Sazwanismail-patch-18
Aug 16, 2026
Merged

Create guide for filtering and searching GitHub issues#33
Sazwanismail merged 1 commit into
mainfrom
Sazwanismail-patch-18

Conversation

@Sazwanismail

@SazwanismailSazwanismail commented Aug 16, 2026

Copy link
Copy Markdown
Owner

User description

Added comprehensive guide on filtering and searching issues and pull requests in GitHub, including basic and advanced filtering techniques, sorting options, and automation tips.Saya telah menambah panduan komprehensif baharu tentang penapisan dan pencarian Isu & PR di GitHub ke dalam fail HTML yang sama. Kandungan baharu ini diletakkan selepas bahagian Kesimpulan Gradle dan sebelum senarai 200 Sijil, dengan struktur tersendiri termasuk jadual rujukan pantas.

Berikut adalah fail HTML penuh dan muktamad — salin dan simpan sebagai .html:

<!DOCTYPE html><htmllang="ms"><head><metacharset="UTF-8"><metaname="viewport" content="width=device-width, initial-scale=1.0"><title>Panduan Lengkap + GitHub Search + 200 Sijil</title><linkrel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" /><style>body {
font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height:1.6;
margin:20px;
max-width:1200px;
margin-left: auto;
margin-right: auto;
color:#333;
background-color:#fff;
}
h1,h2,h3,h4 {
color:#2c3e50;
margin-top:1.5em;
margin-bottom:0.5em;
}
h1 {
border-bottom:3px solid #3498db;
padding-bottom:10px;
}
h2 {
border-bottom:2px solid #ecf0f1;
padding-bottom:5px;
}
pre {
background-color:#f8f9fa;
border:1px solid #ddd;
border-radius:5px;
padding:15px;
overflow-x: auto;
font-family:'Courier New', Courier, monospace;
font-size:14px;
line-height:1.4;
margin:1em0;
}
code {
font-family:'Courier New', Courier, monospace;
background-color:#f8f9fa;
padding:2px4px;
border-radius:3px;
font-size:0.9em;
}
precode {
background-color: transparent;
padding:0;
}
table {
border-collapse: collapse;
width:100%;
margin:1em0;
}
th,td {
border:1px solid #ddd;
padding:8px12px;
text-align: left;
}
th {
background-color:#f2f2f2;
font-weight: bold;
}
tr:nth-child(even) {
background-color:#f9f9f9;
}
.toc {
background-color:#f8f9fa;
border:1px solid #ddd;
border-radius:5px;
padding:15px;
margin:20px0;
}
.tocul {
list-style-type: none;
padding-left:20px;
}
.tocli {
margin:5px0;
}
.note {
background-color:#e8f4fd;
border-left:5px solid #3498db;
padding:10px15px;
margin:1em0;
}
/* Sijil grid */
.cert-grid {
display: grid;
grid-template-columns:repeat(auto-fill,minmax(340px,1fr));
gap:1rem;
margin:1.5rem0;
}
.cert-card {
background:#f8f9fa;
border-left:4px solid #3498db;
padding:0.8rem1rem;
border-radius:6px;
border:1px solid #e0e0e0;
box-shadow:02px4pxrgba(0,0,0,0.04);
}
.cert-card .cert-header {
display: flex;
justify-content: space-between;
align-items: baseline;
gap:0.5rem;
}
.cert-card .cert-num {
font-weight:700;
color:#2c3e50;
font-size:0.75rem;
background:#e9ecef;
padding:0.1rem0.6rem;
border-radius:20px;
}
.cert-card .cert-title {
font-weight:600;
font-size:0.95rem;
}
.cert-card .cert-publisher {
font-size:0.8rem;
color:#555;
}
.cert-card .cert-meta {
display: flex;
justify-content: space-between;
font-size:0.7rem;
color:#666;
margin-top:0.3rem;
border-top:1px solid #eee;
padding-top:0.3rem;
}
.cert-card .cert-meta .id {
font-family: monospace;
background:#e9ecef;
padding:0.1rem0.5rem;
border-radius:12px;
}
.cert-card .cert-meta .status-badge {
color:#28a745;
font-weight:500;
}
.category-section {
margin-top:2.5rem;
}
.cat-header {
display: flex;
align-items: center;
gap:1rem;
border-bottom:2px solid #dee2e6;
padding-bottom:0.4rem;
margin-bottom:1rem;
}
.cat-letter {
font-size:1.8rem;
font-weight:700;
color:#3498db;
background:#e9f0f8;
width:3rem;
height:3rem;
display: flex;
align-items: center;
justify-content: center;
border-radius:50%;
}
.cat-count {
font-size:0.8rem;
color:#6c757d;
margin-left: auto;
}
.goodbye-note {
text-align: center;
margin:2rem00;
padding:1rem;
font-size:1.8rem;
font-weight:700;
color:#3498db;
border-top:2px solid #dee2e6;
}
/* PAUTAN & SUMBER */
.resources-section {
background:#f0f7ff;
border:1px solid #d0e3f0;
border-radius:12px;
padding:1.5rem2rem;
margin:1.5rem0;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.links-grid {
display: flex;
flex-wrap: wrap;
gap:0.8rem1.5rem;
}
.links-grida {
color:#1a73e8;
text-decoration: none;
font-weight:500;
}
.links-grida:hover {
text-decoration: underline;
}
.resource-image {
text-align: center;
margin:1.5rem0;
}
.resource-imageimg {
max-width:100%;
height: auto;
border-radius:8px;
border:1px solid #ddd;
max-height:600px;
box-shadow:04px12pxrgba(0,0,0,0.1);
}
@media (max-width:600px) {
.cert-grid { grid-template-columns:1fr; }
.resources-section { flex-direction: column; align-items: flex-start; gap:1rem; }
}
</style></head><body><!-- ===== TAJUK UTAMA ===== --><h1>Panduan Lengkap: Meniru Gaya Binaan Gradle dalam .NET CI/CD</h1><!-- ===== PAUTAN PENTING & SUMBER ===== --><divclass="resources-section"><divstyle="width:100%;"><h3style="margin-top:0; color:#2c3e50;">🔗 Pautan Penting & Sumber</h3><divclass="links-grid"><ahref="https://www.google.com" target="_blank">Google</a><ahref="https://console.firebase.google.com" target="_blank">Firebase Console</a><ahref="https://firebase.google.com" target="_blank">Firebase</a><ahref="http://www.sazwan.fairbase.com" target="_blank">sazwan.fairbase.com</a><ahref="https://aws.amazon.com" target="_blank">AWS</a><ahref="https://ms.wikipedia.org/wiki/Laman_Utama" target="_blank">Wikipedia BM</a><ahref="https://en.wikipedia.org/wiki/Main_Page" target="_blank">Wikipedia EN</a></div></div></div><!-- ===== GAMBAR ===== --><divclass="resource-image"><imgwidth="960" height="1280" alt="Image blue (12)" src="https://github.com/user-attachments/assets/49bc325d-005c-4bfd-a277-543c8de27973" /></div><!-- ===== JADUAL KANDUNGAN (GRADLE) ===== --><divclass="toc"><h2>Kandungan (Gradle .NET)</h2><ul><li><ahref="#pengenalan">Pengenalan</a></li><li><ahref="#pendekatan-utama">Lima Pendekatan Utama</a><ul><li><ahref="#dotnet-cli">1. dotnet CLI Sahaja</a></li><li><ahref="#nuke">2. Nuke (Build Automation dengan C# DSL)</a></li><li><ahref="#cake">3. Cake (C# Make)</a></li><li><ahref="#msbuild">4. MSBuild Custom Targets</a></li><li><ahref="#bullseye">5. Bullseye + SimpleExec</a></li></ul></li><li><ahref="#fake">Pendekatan Tambahan: FAKE (F# Make)</a></li><li><ahref="#ciri-lanjutan">Ciri Lanjutan untuk Meniru Gradle</a><ul><li><ahref="#incremental">Incremental Builds &amp; Up-to-Date Checks</a></li><li><ahref="#caching">Build Caching Strategies</a></li><li><ahref="#parallel">Parallel Execution</a></li><li><ahref="#config">Configuration Management</a></li><li><ahref="#versioning">Versioning Automatik</a></li><li><ahref="#custom-tasks">Custom Tasks</a></li><li><ahref="#multi-project">Multi-Project Builds</a></li><li><ahref="#docker-nuget">Integrasi Docker &amp; NuGet</a></li></ul></li><li><ahref="#contoh-pipeline">Contoh Pipeline CI/CD</a><ul><li><ahref="#github-actions">GitHub Actions</a></li><li><ahref="#azure-devops">Azure DevOps</a></li><li><ahref="#gitlab-ci">GitLab CI</a></li></ul></li><li><ahref="#perbandingan">Jadual Perbandingan</a></li><li><ahref="#cadangan">Cadangan</a></li><li><ahref="#pengurusan-dependensi">Pengurusan Dependensi &amp; Kemaskini Automatik</a></li><li><ahref="#kualiti-kod">Analisis Kualiti Kod &amp; Test Coverage</a></li><li><ahref="#deployment-lanjutan">Strategi Deployment Lanjutan</a></li><li><ahref="#rahsia-konfigurasi">Pengurusan Rahsia &amp; Konfigurasi</a></li><li><ahref="#optimum-masa">Pengoptimuman Masa Binaan</a></li><li><ahref="#struktur-projek">Contoh Struktur Projek Berbilang Modul</a></li><li><ahref="#perbandingan-gradle">Perbandingan dengan Gradle pada Aspek Spesifik</a></li><li><ahref="#integrasi-pihak-ketiga">Integrasi dengan Alat Pihak Ketiga</a></li><li><ahref="#kesimpulan">Kesimpulan</a></li></ul></div><!-- ================================================================ --><!-- BAHAGIAN GRADLE .NET (sedia ada) --><!-- ================================================================ --><h2id="pengenalan">Pengenalan</h2><p>Gradle terkenal dengan kitaran hayat binaan berperingkat (<code>clean</code>, <code>build</code>, <code>test</code>, <code>publish</code>), caching yang bijak, kebergantungan tugas, dan DSL yang berkuasa. Dalam .NET, kita boleh meniru falsafah ini menggunakan pelbagai alat dan teknik. Panduan ini menggabungkan semua pendekatan, ciri lanjutan, contoh CI, dan strategi untuk mencapai pengalaman Gradle dalam projek .NET.</p><h2id="pendekatan-utama">Lima Pendekatan Utama</h2><h3id="dotnet-cli">1. dotnet CLI Sahaja (Native)</h3><pre><code>steps:
- name: Clean
run: dotnet clean
- name: Restore
run: dotnet restore
- name: Build
run: dotnet build --no-restore -c Release
- name: Test
run: dotnet test --no-build -c Release
- name: Publish
run: dotnet publish --no-build -c Release -o ./publish</code></pre><p><strong>Persamaan Gradle:</strong> Setiap langkah seperti task; <code>--no-restore</code>, <code>--no-build</code> menghalang kerja berulang.<br><strong>Kelebihan:</strong> Mudah, tiada kebergantungan tambahan.<br><strong>Kekurangan:</strong> Kurang struktur, tiada parameterisasi/caching bawaan.</p><h3id="nuke">2. Nuke (Build Automation dengan C# DSL)</h3><pre><code>class Build : NukeBuild
{
public static int Main() => Execute&lt;Build&gt;(x => x.Publish);
Target Clean => _ => _.Executes(() => DotNetClean());
Target Restore => _ => _.DependsOn(Clean).Executes(() => DotNetRestore());
Target Compile => _ => _.DependsOn(Restore).Executes(() => DotNetBuild(s => s.EnableNoRestore()));
Target Test => _ => _.DependsOn(Compile).Executes(() => DotNetTest(s => s.EnableNoBuild()));
Target Publish => _ => _.DependsOn(Test).Executes(() => DotNetPublish(s => s.SetOutput("publish")));
}</code></pre><p><strong>Jalankan:</strong><code>./build.cmd Publish</code><br><strong>Persamaan Gradle:</strong> Target = Task, <code>DependsOn</code> = <code>dependsOn</code>, parameterisasi penuh.<br><strong>Kelebihan:</strong> Paling dekat dengan Gradle, menyokong caching (<code>[Cached]</code>), boleh diuji.<br><strong>Kekurangan:</strong> Perlu belajar DSL, tambah projek binaan.</p><h3id="cake">3. Cake (C# Make)</h3><pre><code>Task("Clean").Does(() => DotNetClean("."));
Task("Restore").IsDependentOn("Clean").Does(() => DotNetRestore("."));
Task("Build").IsDependentOn("Restore").Does(() => DotNetBuild(".", new DotNetBuildSettings { NoRestore = true }));
Task("Test").IsDependentOn("Build").Does(() => DotNetTest(".", new DotNetTestSettings { NoBuild = true }));
Task("Publish").IsDependentOn("Test").Does(() => DotNetPublish(".", new DotNetPublishSettings { OutputDirectory = "./publish" }));
RunTarget("Publish");</code></pre><p><strong>Jalankan:</strong><code>dotnet cake build.cake --target=Publish</code><br><strong>Persamaan Gradle:</strong><code>IsDependentOn</code> setara dengan <code>dependsOn</code>.<br><strong>Kelebihan:</strong> Matang, DSL mudah dibaca, banyak addin.<br><strong>Kekurangan:</strong> Tiada caching bawaan (perlu manual/CI).</p><h3id="msbuild">4. MSBuild Custom Targets (Native XML)</h3><pre><code>&lt;Project&gt;
&lt;Target Name="CleanAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Clean" /&gt;
&lt;/Target&gt;
&lt;Target Name="RestoreAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Restore" /&gt;
&lt;/Target&gt;
&lt;Target Name="BuildAll" DependsOnTargets="CleanAll;RestoreAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Build" Properties="Configuration=Release" /&gt;
&lt;/Target&gt;
&lt;Target Name="TestAll" DependsOnTargets="BuildAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="VSTest" Properties="Configuration=Release" /&gt;
&lt;/Target&gt;
&lt;Target Name="PublishAll" DependsOnTargets="TestAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="Configuration=Release;PublishDir=./publish" /&gt;
&lt;/Target&gt;
&lt;/Project&gt;</code></pre><p><strong>Jalankan:</strong><code>dotnet msbuild -t:PublishAll</code><br><strong>Persamaan Gradle:</strong><code>DependsOnTargets</code> = <code>dependsOn</code>.<br><strong>Kelebihan:</strong> Native, tiada alat tambahan.<br><strong>Kekurangan:</strong> Sintaks XML verbose, sukar untuk logik kompleks.</p><h3id="bullseye">5. Bullseye + SimpleExec (C# Console Build)</h3><pre><code>using static Bullseye.Targets;
using static SimpleExec.Command;
Target("clean", () => Run("dotnet", "clean"));
Target("restore", DependsOn("clean"), () => Run("dotnet", "restore"));
Target("build", DependsOn("restore"), () => Run("dotnet", "build --no-restore -c Release"));
Target("test", DependsOn("build"), () => Run("dotnet", "test --no-build -c Release"));
Target("publish", DependsOn("test"), () => Run("dotnet", "publish --no-build -c Release -o ./publish"));
Target("default", DependsOn("publish"));
RunTargetsAndExit(args);</code></pre><p><strong>Jalankan:</strong><code>dotnet run --project build -- publish</code><br><strong>Persamaan Gradle:</strong> Bullseye menyediakan <code>Target</code> dan <code>DependsOn</code> seperti Gradle.<br><strong>Kelebihan:</strong> Minimalis, C# tulen, sangat fleksibel.<br><strong>Kekurangan:</strong> Tiada caching bawaan, perlu projek binaan berasingan.</p><h2id="fake">Pendekatan Tambahan: FAKE (F# Make)</h2><pre><code>#r "paket: nuget Fake.DotNet.Cli"
open Fake
open Fake.DotNet
Target.create "Clean" (fun _ -> DotNet.exec id "clean" "" |> ignore)
Target.create "Restore" (fun _ -> DotNet.restore id "")
Target.create "Build" (fun _ -> DotNet.build (fun p -> { p with Configuration = DotNet.BuildConfiguration.Release; NoRestore = true }) "")
Target.create "Test" (fun _ -> DotNet.test (fun p -> { p with Configuration = DotNet.BuildConfiguration.Release; NoBuild = true }) "")
Target.create "Publish" (fun _ -> DotNet.publish (fun p -> { p with Configuration = DotNet.BuildConfiguration.Release; NoBuild = true; OutputPath = Some "./publish" }) "")
open Fake.Core.TargetOperators
"Clean" ==> "Restore" ==> "Build" ==> "Test" ==> "Publish"
Target.runOrDefault "Publish"</code></pre><p><strong>Persamaan Gradle:</strong> Operator <code>==></code> menandakan kebergantungan.<br><strong>Kelebihan:</strong> Kuasa fungsional penuh, integrasi kuat.<br><strong>Kekurangan:</strong> Perlu pengetahuan F#, kurang popular.</p><h2id="ciri-lanjutan">Ciri Lanjutan untuk Meniru Gradle</h2><h3id="incremental">Incremental Builds &amp; Up-to-Date Checks</h3><ul><li><strong>MSBuild Native:</strong> Gunakan atribut <code>Inputs</code> dan <code>Outputs</code>.
<pre><code>&lt;Target Name="GenerateCode" Inputs="src\schema.proto" Outputs="generated\schema.cs"&gt;
&lt;Exec Command="protoc --csharp_out=generated src\schema.proto" /&gt;
&lt;/Target&gt;</code></pre></li><li><strong>Nuke:</strong> Atribut <code>[Cached]</code> pada target.
<pre><code>[Cached]
Target GenerateCode => _ => _.Executes(() => { ... });</code></pre></li><li><strong>Cake/Bullseye:</strong> Semakan manual menggunakan <code>System.IO.File.GetLastWriteTime</code>.</li></ul><h3id="caching">Build Caching Strategies</h3><ul><li><strong>NuGet Cache:</strong><code>~/.nuget/packages</code> (dengan lock file <code>packages.lock.json</code>).</li><li><strong>Build Output Cache:</strong> Simpan <code>bin</code> dan <code>obj</code> di CI.</li><li><strong>Nuke Cache:</strong> Folder <code>.nuke/temp</code>.</li><li><strong>Azure DevOps Cache Task / GitHub Actions cache</strong> dengan kunci berasaskan hash fail projek.</li></ul><h3id="parallel">Parallel Execution</h3><ul><li><strong>MSBuild:</strong> Gunakan <code>-m</code> atau <code>-p:BuildInParallel=true</code>.</li><li><strong>Nuke:</strong> Jalankan target bebas secara selari dengan <code>await Task.WhenAll</code> atau <code>nuke --parallel</code>.</li><li><strong>Cake:</strong><code>Parallel.ForEach</code> dalam task.</li><li><strong>Bullseye:</strong><code>Task.WhenAll</code> dengan <code>RunAsync</code>.</li></ul><h3id="config">Configuration Management</h3><ul><li><strong>Nuke:</strong> Parameter melalui <code>[Parameter]</code> dan hujah CLI.</li><li><strong>MSBuild:</strong> Properties <code>-p:Configuration=Debug</code>.</li><li><strong>Cake:</strong><code>Argument()</code> dan <code>HasArgument()</code>.</li></ul><h3id="versioning">Versioning Automatik</h3><ul><li><strong>GitVersion</strong> atau <strong>Nerdbank.GitVersioning</strong>.</li><li>Integrasi dengan Nuke/Cake/MSBuild untuk menetapkan versi semasa <code>build</code>, <code>pack</code>, <code>publish</code>.</li></ul><h3id="custom-tasks">Custom Tasks</h3><p>Setiap alat membolehkan anda menulis logik tersuai (contoh: menjalankan migrasi EF, bina Docker, hantar pakej NuGet).</p><h3id="multi-project">Multi-Project Builds</h3><ul><li>Gunakan <code>.sln</code> atau <code>.slnf</code> (Solution Filter).</li><li>Nuke/Cake/Bullseye: bina projek tertentu sahaja (seperti <code>:app:build</code> dalam Gradle).</li><li>MSBuild project references menangani kebergantungan secara automatik.</li></ul><h3id="docker-nuget">Integrasi Docker &amp; NuGet</h3><ul><li>Bina imej Docker selepas <code>publish</code>.</li><li><code>dotnet pack</code> dan <code>dotnet nuget push</code> (setara <code>maven-publish</code>).</li></ul><h2id="contoh-pipeline">Contoh Pipeline CI/CD</h2><h3id="github-actions">GitHub Actions (dengan Nuke)</h3><pre><code>name: CI
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- uses: actions/cache@v4
with:
path: |
~/.nuget/packages
.nuke/temp
key: ${{ runner.os }}-nuke-${{ hashFiles('**/*.csproj', 'build/**') }}
- name: Build &amp; Publish
run: ./build.cmd Publish
- uses: actions/upload-artifact@v4
with:
name: publish
path: publish/</code></pre><h3id="azure-devops">Azure DevOps</h3><pre><code>trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UseDotNet@2
inputs:
version: '8.x'
- script: dotnet clean
- script: dotnet restore
- script: dotnet build --no-restore -c Release
- script: dotnet test --no-build -c Release --logger trx
- script: dotnet publish --no-build -c Release -o $(Build.ArtifactStagingDirectory)/publish
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)/publish'
artifactName: 'drop'</code></pre><h3id="gitlab-ci">GitLab CI</h3><pre><code>image: mcr.microsoft.com/dotnet/sdk:8.0
stages: [build, test, deploy]
cache:
paths:
- ~/.nuget/packages
build:
stage: build
script:
- dotnet clean
- dotnet restore
- dotnet build --no-restore -c Release
test:
stage: test
script:
- dotnet test --no-build -c Release
artifacts:
reports:
junit: test-results.xml
publish:
stage: deploy
script:
- dotnet publish --no-build -c Release -o ./publish
artifacts:
paths:
- ./publish
only:
- main</code></pre><h2id="perbandingan">Jadual Perbandingan</h2><table><thead><tr><th>Pendekatan</th><th>Bahasa Skrip</th><th>Alat Tambahan</th><th>Caching Bawaan</th><th>Kemudahan</th><th>Sesuai Untuk</th></tr></thead><tbody><tr><td>dotnet CLI</td><td>YAML</td><td>Tidak</td><td>Manual (CI)</td><td>Sangat mudah</td><td>Projek kecil</td></tr><tr><td>Nuke</td><td>C#</td><td>Ya (Nuke)</td><td>Ya ([Cached])</td><td>Sederhana</td><td>Projek besar, kompleks</td></tr><tr><td>Cake</td><td>C# (script)</td><td>Ya (Cake)</td><td>Tidak</td><td>Mudah</td><td>Projek sederhana-besar</td></tr><tr><td>MSBuild Custom Targets</td><td>XML</td><td>Tidak</td><td>Manual (CI)</td><td>Sederhana</td><td>Pasukan mahir MSBuild</td></tr><tr><td>Bullseye + SimpleExec</td><td>C# (console)</td><td>Ya (2 pakej)</td><td>Tidak</td><td>Mudah</td><td>Projek fleksibel</td></tr><tr><td>FAKE</td><td>F#</td><td>Ya (FAKE)</td><td>Tidak</td><td>Sederhana</td><td>Binaan kompleks, F#</td></tr></tbody></table><h2id="cadangan">Cadangan</h2><ul><li><strong>Projek kecil / prototaip:</strong><code>dotnet CLI</code> sahaja.</li><li><strong>Pengalaman paling hampir dengan Gradle:</strong><code>Nuke</code>.</li><li><strong>Pasukan yang suka skrip berasingan:</strong><code>Cake</code>.</li><li><strong>Organisasi yang ingin kekal MSBuild sepenuhnya:</strong><code>MSBuild Custom Targets</code>.</li><li><strong>Pembangun yang mahukan C# tulen dan minimal:</strong><code>Bullseye + SimpleExec</code>.</li><li><strong>Penggemar F# atau binaan sangat kompleks:</strong><code>FAKE</code>.</li></ul><h2id="pengurusan-dependensi">Pengurusan Dependensi &amp; Kemaskini Automatik</h2><h3>Central Package Management (CPM)</h3><pre><code>&lt;Project&gt;
&lt;PropertyGroup&gt;
&lt;ManagePackageVersionsCentrally&gt;true&lt;/ManagePackageVersionsCentrally&gt;
&lt;/PropertyGroup&gt;
&lt;ItemGroup&gt;
&lt;PackageVersion Include="Newtonsoft.Json" Version="13.0.3" /&gt;
&lt;PackageVersion Include="Serilog" Version="3.1.1" /&gt;
&lt;/ItemGroup&gt;
&lt;/Project&gt;</code></pre><p>Kemudian dalam setiap <code>.csproj</code>, anda hanya nyatakan <code>PackageReference</code> tanpa versi.</p><h3>Dependency Locking</h3><pre><code>&lt;PropertyGroup&gt;
&lt;RestorePackagesWithLockFile&gt;true&lt;/RestorePackagesWithLockFile&gt;
&lt;/PropertyGroup&gt;</code></pre><p>Jalankan <code>dotnet restore --use-lock-file</code>.</p><h3>Automasi Kemaskini Dependensi</h3><ul><li><strong>Dependabot</strong> (GitHub) – menyokong NuGet.</li><li><strong>Renovate</strong> – sangat boleh dikonfigurasi.</li></ul><pre><code># .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10</code></pre><h2id="kualiti-kod">Analisis Kualiti Kod &amp; Test Coverage</h2><h3>Code Coverage dengan Coverlet</h3><pre><code>dotnet test --collect:"XPlat Code Coverage"</code></pre><p>Hasilnya ialah fail <code>coverage.cobertura.xml</code> yang boleh dimuat naik ke SonarQube atau Codecov.</p><h3>Integrasi SonarQube</h3><pre><code>- name: Install SonarScanner
run: dotnet tool install --global dotnet-sonarscanner
- name: Begin Sonar analysis
run: dotnet-sonarscanner begin /k:"project-key" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.login="${{ secrets.SONAR_TOKEN }}"
- name: Build
run: dotnet build --no-restore -c Release
- name: Test
run: dotnet test --no-build -c Release --collect:"XPlat Code Coverage"
- name: End Sonar analysis
run: dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}"</code></pre><h2id="deployment-lanjutan">Strategi Deployment Lanjutan</h2><h3>Docker Build &amp; Push</h3><pre><code>Target DockerBuild => _ => _
.DependsOn(Publish)
.Executes(() =>
{
DockerTasks.DockerBuild(s => s
.SetPath(RootDirectory)
.SetFile("Dockerfile")
.SetTag($"myapp:{GitVersion.Sha}"));
});
Target DockerPush => _ => _
.DependsOn(DockerBuild)
.Executes(() =>
{
DockerTasks.DockerPush(s => s
.SetName($"myapp:{GitVersion.Sha}")
.SetServer("registry.example.com")
.SetUsername(Environment.GetEnvironmentVariable("DOCKER_USERNAME"))
.SetPassword(Environment.GetEnvironmentVariable("DOCKER_PASSWORD")));
});</code></pre><h3>Deployment ke Kubernetes</h3><pre><code>- name: Deploy to Kubernetes
run: |
kubectl set image deployment/myapp myapp=registry.example.com/myapp:${{ github.sha }}
kubectl rollout status deployment/myapp</code></pre><h2id="rahsia-konfigurasi">Pengurusan Rahsia &amp; Konfigurasi</h2><ul><li><strong>Environment Variables</strong> – akses melalui <code>Environment.GetEnvironmentVariable</code>.</li><li><strong>Azure Key Vault / AWS Secrets Manager</strong> – integrasikan dalam pipeline.</li><li><strong>.NET User Secrets</strong> – untuk pembangunan tempatan.</li></ul><pre><code>- task: AzureKeyVault@2
inputs:
azureSubscription: 'service-connection'
KeyVaultName: 'my-keyvault'
SecretsFilter: '*'</code></pre><h2id="optimum-masa">Pengoptimuman Masa Binaan</h2><h3>MSBuild Static Graph</h3><pre><code>dotnet build -graphBuild</code></pre><h3>Distributed Caching</h3><ul><li>Azure DevOps Pipeline Caching dengan kunci berasaskan hash fail.</li><li>GitHub Actions Cache untuk <code>bin</code>, <code>obj</code>, dan <code>.nuget</code>.</li></ul><h3>Build Agents yang Dioptimumkan</h3><p>Gunakan mesin dengan CPU tinggi atau self-hosted runners dengan cache tempatan.</p><h2id="struktur-projek">Contoh Struktur Projek Berbilang Modul</h2><pre><code>/MySolution.sln
/src/
/App/
App.csproj
/Lib/
Lib.csproj
/tests/
/App.Tests/
App.Tests.csproj
/Lib.Tests/
Lib.Tests.csproj
/build/
Build.cs (Nuke)
_build.csproj</code></pre><p>Dalam Nuke, anda boleh membina subset projek:</p><pre><code>Target BuildApp => _ => _
.DependsOn(Restore)
.Executes(() => DotNetBuild(s => s
.SetProjectFile(Solution.GetProject("App"))
.SetConfiguration(Configuration)
.EnableNoRestore()));</code></pre><h2id="perbandingan-gradle">Perbandingan dengan Gradle pada Aspek Spesifik</h2><table><thead><tr><th>Aspek</th><th>Gradle</th><th>.NET Setara</th></tr></thead><tbody><tr><td>Multi-project</td><td><code>settings.gradle</code>, <code>:module:task</code></td><td><code>.sln</code>, <code>.slnf</code>, Nuke/Cake targets</td></tr><tr><td>Configuration cache</td><td>Ya</td><td>MSBuild static graph (<code>-graphBuild</code>)</td></tr><tr><td>Dependency locking</td><td><code>gradle.lockfile</code></td><td><code>packages.lock.json</code></td></tr><tr><td>Version catalog</td><td><code>libs.versions.toml</code></td><td><code>Directory.Packages.props</code> (CPM)</td></tr><tr><td>Code coverage</td><td>JaCoCo</td><td>Coverlet</td></tr><tr><td>Static analysis</td><td>SonarQube plugin</td><td>SonarScanner for .NET</td></tr><tr><td>Publishing</td><td><code>maven-publish</code></td><td><code>dotnet pack</code> + <code>dotnet nuget push</code></td></tr><tr><td>Parallel execution</td><td><code>--parallel</code></td><td><code>-m</code> (MSBuild), Nuke/Cake parallel targets</td></tr></tbody></table><h2id="integrasi-pihak-ketiga">Integrasi dengan Alat Pihak Ketiga</h2><h3>Notifikasi</h3><pre><code>- name: Notify Slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
text: 'Build completed'
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}</code></pre><h3>Pengurusan Isu</h3><p>Automatik tutup isu apabila PR yang berkaitan digabungkan (menggunakan GitHub Actions).</p><h3>Dashboard &amp; Metrik</h3><p>Gunakan Grafana atau Azure Monitor untuk memantau prestasi binaan.</p><h2id="kesimpulan">Kesimpulan</h2><p>Dengan menggabungkan semua pendekatan dan ciri lanjutan di atas, anda boleh membina pipeline CI/CD .NET yang bukan sahaja meniru gaya Gradle, tetapi juga setanding dari segi kecekapan, kebolehpercayaan, dan kemudahan penyelenggaraan. Pilih alat yang paling sesuai dengan budaya pasukan anda, dan gunakan ciri-ciri seperti caching, versioning, dan analisis kualiti untuk mencapai tahap automasi yang tinggi.</p><p>Jika anda ingin mendalami mana-mana topik di atas atau memerlukan contoh yang lebih spesifik, sila beritahu! Saya sedia membantu. 😊</p><!-- ================================================================ --><!-- BAHAGIAN BARU: GITHUB SEARCH & FILTERING GUIDE --><!-- ================================================================ --><hrstyle="margin:2rem 0; border-top:3px solid #2c3e50;" /><h1style="border-bottom-color:#6f42c1; color:#6f42c1;">🔎 Panduan Komprehensif: Menapis & Mencari Isu dan PR di GitHub</h1><divclass="toc" style="border-color:#6f42c1;"><h2>Kandungan (GitHub Search)</h2><ul><li><ahref="#github-intro">Pengenalan</a></li><li><ahref="#github-basic">Penapis Asas (is, state, author)</a></li><li><ahref="#github-advanced">Penapis Lanjutan (label, milestone, assignee, review, status, exclusion)</a></li><li><ahref="#github-date">Penapis Tarikh &amp; Kuantiti</a></li><li><ahref="#github-combination">Kombinasi Carian (AND, OR, NOT, petikan)</a></li><li><ahref="#github-sort">Pilihan Pengisihan (Sorting)</a></li><li><ahref="#github-automation">Tip Automasi &amp; CLI</a></li><li><ahref="#github-cheatsheet">Jadual Rujukan Cepat</a></li></ul></div><h2id="github-intro">Pengenalan</h2><p>GitHub menyediakan enjin carian yang sangat berkuasa untuk <strong>Isu</strong> dan <strong>Pull Request (PR)</strong>. Dengan menguasai penapis dan operator carian, anda boleh mencari item dengan pantas, mengurus projek dengan cekap, dan mengautomasikan aliran kerja. Panduan ini merangkumi semua teknik asas hingga lanjutan.</p><h2id="github-basic">1. Penapis Asas</h2><table><thead><tr><th>Penapis</th><th>Contoh</th><th>Keterangan</th></tr></thead><tbody><tr><td><code>is:issue</code></td><td><code>is:issue</code></td><td>Tunjukkan hanya Isu</td></tr><tr><td><code>is:pr</code></td><td><code>is:pr</code></td><td>Tunjukkan hanya Pull Request</td></tr><tr><td><code>state:open</code></td><td><code>state:open</code></td><td>Item yang terbuka</td></tr><tr><td><code>state:closed</code></td><td><code>state:closed</code></td><td>Item yang ditutup</td></tr><tr><td><code>author:USERNAME</code></td><td><code>author:octocat</code></td><td>Dibuat oleh pengguna tertentu</td></tr><tr><td><code>assignee:USERNAME</code></td><td><code>assignee:octocat</code></td><td>Ditugaskan kepada pengguna tertentu</td></tr></tbody></table><h2id="github-advanced">2. Penapis Lanjutan</h2><table><thead><tr><th>Penapis</th><th>Contoh</th><th>Keterangan</th></tr></thead><tbody><tr><td><code>label:"..."</code></td><td><code>label:"bug"</code> / <code>label:bug</code></td><td>Item dengan label tertentu</td></tr><tr><td><code>milestone:"..."</code></td><td><code>milestone:"v1.0"</code></td><td>Item dalam milestone tertentu</td></tr><tr><td><code>project:"..."</code></td><td><code>project:"Project Board"</code></td><td>Item dalam projek tertentu</td></tr><tr><td><code>review:approved</code></td><td><code>review:approved</code></td><td>PR yang diluluskan</td></tr><tr><td><code>review:changes_requested</code></td><td><code>review:changes_requested</code></td><td>PR yang minta perubahan</td></tr><tr><td><code>review:required</code></td><td><code>review:required</code></td><td>PR yang memerlukan semakan</td></tr><tr><td><code>status:pending</code></td><td><code>status:pending</code></td><td>Status semakan masih dalam proses</td></tr><tr><td><code>status:success</code></td><td><code>status:success</code></td><td>Semakan berjaya</td></tr><tr><td><code>status:failure</code></td><td><code>status:failure</code></td><td>Semakan gagal</td></tr><tr><td><code>team:ORG/TEAM</code></td><td><code>team:github/engineering</code></td><td>Ditugaskan kepada pasukan tertentu</td></tr><tr><td><code>linked:pr</code></td><td><code>linked:pr</code></td><td>Isu yang dipautkan dengan PR</td></tr><tr><td><code>linked:issue</code></td><td><code>linked:issue</code></td><td>PR yang dipautkan dengan Isu</td></tr><tr><td><code>-label:duplicate</code></td><td><code>-label:duplicate</code></td><td>Kecualikan label tertentu (tanda minus)</td></tr><tr><td><code>no:label</code></td><td><code>no:label</code></td><td>Item tanpa label</td></tr><tr><td><code>no:assignee</code></td><td><code>no:assignee</code></td><td>Item tanpa assignee</td></tr><tr><td><code>no:milestone</code></td><td><code>no:milestone</code></td><td>Item tanpa milestone</td></tr><tr><td><code>no:project</code></td><td><code>no:project</code></td><td>Item tanpa projek</td></tr></tbody></table><h2id="github-date">3. Penapis Tarikh &amp; Kuantiti</h2><table><thead><tr><th>Penapis</th><th>Contoh</th><th>Keterangan</th></tr></thead><tbody><tr><td><code>created:>YYYY-MM-DD</code></td><td><code>created:>2024-01-01</code></td><td>Dicipta selepas tarikh</td></tr><tr><td><code>created:&lt;YYYY-MM-DD</code></td><td><code>created:&lt;2024-12-31</code></td><td>Dicipta sebelum tarikh</td></tr><tr><td><code>updated:>YYYY-MM-DD</code></td><td><code>updated:>2024-06-01</code></td><td>Dikemas kini selepas tarikh</td></tr><tr><td><code>comments:>N</code></td><td><code>comments:>10</code></td><td>Mempunyai lebih daripada N komen</td></tr><tr><td><code>interactions:>N</code></td><td><code>interactions:>5</code></td><td>Interaksi (komen + reaksi) melebihi N</td></tr></tbody></table><h2id="github-combination">4. Kombinasi Carian (AND, OR, NOT)</h2><ul><li><strong>Gunakan <code>AND</code> (atau ruang):</strong><code>is:issue label:bug assignee:octocat</code> (semua syarat mesti dipenuhi).</li><li><strong>Gunakan <code>OR</code>:</strong><code>label:bug OR label:enhancement</code>.</li><li><strong>Gunakan <code>NOT</code> atau <code>-</code>:</strong><code>label:bug -label:duplicate</code>.</li><li><strong>Petikan untuk frasa tepat:</strong><code>"error 500"</code> (mencari frasa eksak dalam tajuk/kandungan).</li><li><strong>Tanda kurung untuk pengelompokan:</strong><code>(label:bug OR label:enhancement) AND assignee:octocat</code>.</li></ul><divclass="note"><strong>💡 Tip:</strong> Carian lalai menggunakan <code>AND</code> antara istilah. Gunakan <code>OR</code> dan <code>NOT</code> secara eksplisit untuk logik yang lebih kompleks.</div><h2id="github-sort">5. Pilihan Pengisihan (Sorting)</h2><p>Tambah <code>sort:</code> pada akhir carian untuk menyusun hasil:</p><ul><li><code>sort:created-desc</code> — terbaru dahulu (lalai untuk isu)</li><li><code>sort:created-asc</code> — tertua dahulu</li><li><code>sort:updated-desc</code> — terbaru dikemas kini</li><li><code>sort:updated-asc</code> — paling lama tidak dikemas kini</li><li><code>sort:comments-desc</code> — paling banyak komen</li><li><code>sort:comments-asc</code> — paling sedikit komen</li><li><code>sort:reactions-desc</code> — paling banyak reaksi (👍, 🚀, dll.)</li></ul><p><strong>Contoh:</strong><code>is:issue label:bug sort:updated-desc</code> — Isu berlabel bug, diisih mengikut tarikh kemas kini terkini.</p><h2id="github-automation">6. Tip Automasi &amp; CLI</h2><h3>Pautan Carian Tersimpan</h3><p>GitHub menyimpan carian anda dalam URL. Anda boleh <strong>bookmark</strong> pautan tersebut atau menambahkannya ke <strong>Saved searches</strong> di profil anda untuk akses pantas.</p><h3>GitHub CLI (<code>gh</code>)</h3><p>Gunakan <code>gh search</code> dalam skrip atau terminal:</p><pre><code># Cari isu yang terbuka berlabel "bug" dalam repo "owner/repo"
gh issue list --repo owner/repo --label bug --state open
# Cari PR yang diluluskan
gh pr list --state open --review-approved
# Gabungkan dengan penapis lanjutan
gh search issues "is:issue label:bug assignee:octocat" --limit 10</code></pre><h3>Automasi dalam GitHub Actions</h3><p>Anda boleh menggunakan <code>gh search</code> dalam workflow untuk mengautomasikan tugas seperti mengumpul isu lapuk atau memberi label secara pukal:</p><pre><code>- name: Find stale issues
run: |
gh search issues "is:issue state:open updated:&lt;2024-01-01" --limit 100 > stale_issues.txt
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}</code></pre><h2id="github-cheatsheet">7. Jadual Rujukan Cepat</h2><table><thead><tr><th>Kategori</th><th>Contoh Penapis</th></tr></thead><tbody><tr><td>Jenis</td><td><code>is:issue</code>, <code>is:pr</code></td></tr><tr><td>Status</td><td><code>state:open</code>, <code>state:closed</code></td></tr><tr><td>Pengguna</td><td><code>author:user</code>, <code>assignee:user</code>, <code>mentions:user</code></td></tr><tr><td>Metadata</td><td><code>label:bug</code>, <code>milestone:v1.0</code>, <code>project:board</code></td></tr><tr><td>Semakan PR</td><td><code>review:approved</code>, <code>review:changes_requested</code></td></tr><tr><td>Status CI</td><td><code>status:success</code>, <code>status:failure</code></td></tr><tr><td>Pengecualian</td><td><code>-label:duplicate</code>, <code>no:label</code>, <code>no:assignee</code></td></tr><tr><td>Tarikh</td><td><code>created:>2024-01-01</code>, <code>updated:&lt;2024-12-31</code></td></tr><tr><td>Kuantiti</td><td><code>comments:>10</code>, <code>interactions:>5</code></td></tr><tr><td>Logik</td><td><code>AND</code>, <code>OR</code>, <code>NOT</code>, petikan <code>"..."</code></td></tr><tr><td>Pengisihan</td><td><code>sort:created-desc</code>, <code>sort:updated-desc</code>, <code>sort:comments-desc</code></td></tr></tbody></table><p><strong>🔗 Sumber Rasmi:</strong><ahref="https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests" target="_blank">Dokumentasi GitHub: Searching Issues and Pull Requests</a></p><!-- ================================================================ --><!-- AKHIR BAHAGIAN GITHUB SEARCH --><!-- ================================================================ --><!-- ================================================================ --><!-- DATA SIJIL (200 PENTAULIAHAN GLOBAL) --><!-- ================================================================ --><hrstyle="margin:2rem 0; border-top:3px solid #3498db;" /><h1style="border-bottom-color:#2c3e50;">200 Pentauliahan Global — Muhamad Sazwan Bin Ismail</h1><divstyle="background:#f0f7ff; padding:1.2rem 1.8rem; border-radius:8px; margin:1.5rem 0; display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center;"><div><strong>Rujukan:</strong> MSI-2026-07734 &nbsp;|&nbsp; <strong>Lejar:</strong> END-MYS-0425</div><div><spanstyle="background:#28a745; color:#fff; padding:0.2rem 1rem; border-radius:30px;">GREEN ACROSS THE BOARD</span></div><div><iclass="far fa-calendar-alt"></i> 17 Mei 2026 · Pusat Kawalan Kedaulatan AI, Malaysia</div></div><divstyle="display:flex; flex-wrap:wrap; gap:1.5rem 3rem; background:#f8f9fa; padding:0.8rem 2rem; border-radius:40px; margin-bottom:2rem;"><div><strong>200</strong> Sijil</div><div><strong>18</strong> Domain</div><div><strong>45+</strong> Penerbit</div><div><strong>AES-256 GCM</strong> · SHA-256</div><div><spanstyle="color:#28a745;"></span> Semua <strong>Aktif & Disahkan</strong></div></div><!-- ===== CATEGORY A (1–10) ===== --><divclass="category-section"><divclass="cat-header"><spanclass="cat-letter">A</span><h2>AI &amp; Machine Learning</h2><spanclass="cat-count">10 sijil</span></div><divclass="cert-grid"><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#1</span><spanclass="cert-title">Google Professional ML Engineer</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Google Cloud</div><divclass="cert-meta"><spanclass="id">ML-SAZWAN-001</span><spanclass="status-badge">✓ OAuth2</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#2</span><spanclass="cert-title">AWS Certified AI &amp; ML – Specialty</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> AWS</div><divclass="cert-meta"><spanclass="id">AWS-AI-7734</span><spanclass="status-badge">✓ IAM+CloudTrail</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#3</span><spanclass="cert-title">NVIDIA DLI: Computer Vision</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> NVIDIA</div><divclass="cert-meta"><spanclass="id">DL-CV-7734</span><spanclass="status-badge">✓ NGC API</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#4</span><spanclass="cert-title">Stanford ML Specialization</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Stanford University</div><divclass="cert-meta"><spanclass="id">STANFORD-ML-0425</span><spanclass="status-badge">✓ Ijazah</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#5</span><spanclass="cert-title">Azure AI Engineer Associate</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Microsoft</div><divclass="cert-meta"><spanclass="id">MS-AI-7734</span><spanclass="status-badge">✓ Windows Hello+FIDO2</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#6</span><spanclass="cert-title">IBM AI Engineering Professional</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> IBM</div><divclass="cert-meta"><spanclass="id">IBM-AI-7734</span><spanclass="status-badge">✓ Hyperledger Fabric</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#7</span><spanclass="cert-title">Intel Edge AI Certification</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Intel</div><divclass="cert-meta"><spanclass="id">EDGE-7734</span><spanclass="status-badge">✓ Intel SGX</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#8</span><spanclass="cert-title">TensorFlow Developer Certificate</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Google/TensorFlow</div><divclass="cert-meta"><spanclass="id">TF-7734</span><spanclass="status-badge">✓ Dompet Crypto</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#9</span><spanclass="cert-title">DeepLearning.AI: NLP</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> DeepLearning.AI/Coursera</div><divclass="cert-meta"><spanclass="id">NLP-7734</span><spanclass="status-badge">✓ TLS 1.3</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#10</span><spanclass="cert-title">MIT xPRO: Coding</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> MIT xPRO</div><divclass="cert-meta"><spanclass="id">MIT-CODING-7734</span><spanclass="status-badge">✓ Biometrik</span></div></div></div></div><!-- ===== CATEGORY B (11–20) ===== --><divclass="category-section"><divclass="cat-header"><spanclass="cat-letter">B</span><h2>Keselamatan Siber &amp; Kedaulatan Digital</h2><spanclass="cat-count">10 sijil</span></div><divclass="cert-grid"><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#11</span><spanclass="cert-title">CISSP</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> ISC2</div><divclass="cert-meta"><spanclass="id">CISSP-7734</span><spanclass="status-badge">✓ SHA-256</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#12</span><spanclass="cert-title">CompTIA Security+</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> CompTIA</div><divclass="cert-meta"><spanclass="id">SECPLUS-7734</span><spanclass="status-badge">✓ CertMetrics</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#13</span><spanclass="cert-title">CEH v12</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> EC-Council</div><divclass="cert-meta"><spanclass="id">CEH-7734</span><spanclass="status-badge">✓ Aspen+OTP</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#14</span><spanclass="cert-title">CISM</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> ISACA</div><divclass="cert-meta"><spanclass="id">CISM-7734</span><spanclass="status-badge">✓ Hash Rantaian</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#15</span><spanclass="cert-title">GIAC GSEC</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> GIAC</div><divclass="cert-meta"><spanclass="id">GSEC-7734</span><spanclass="status-badge">✓ SANS</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#16</span><spanclass="cert-title">OSCP</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Offensive Security</div><divclass="cert-meta"><spanclass="id">OSCP-7734</span><spanclass="status-badge">✓ Kunci Awam</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#17</span><spanclass="cert-title">CCSP</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> ISC2</div><divclass="cert-meta"><spanclass="id">CCSP-7734</span><spanclass="status-badge">✓ MFA</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#18</span><spanclass="cert-title">Certified in Cybersecurity (CC)</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> ISC2</div><divclass="cert-meta"><spanclass="id">CC-7734</span><spanclass="status-badge">✓ Entry-Level</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#19</span><spanclass="cert-title">Fortinet NSE 7</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Fortinet</div><divclass="cert-meta"><spanclass="id">NSE7-7734</span><spanclass="status-badge">✓ Digital Signature</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#20</span><spanclass="cert-title">Cisco CyberOps Professional</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Cisco</div><divclass="cert-meta"><spanclass="id">CYBEROPS-7734</span><spanclass="status-badge">✓ CertTracker</span></div></div></div></div><!-- ===== CATEGORY C (21–30) ===== --><divclass="category-section"><divclass="cat-header"><spanclass="cat-letter">C</span><h2>Blockchain &amp; Sovereign Ledger</h2><spanclass="cat-count">10 sijil</span></div><divclass="cert-grid"><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#21</span><spanclass="cert-title">CBSP</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Blockchain Council</div><divclass="cert-meta"><spanclass="id">CBSP-7734</span><spanclass="status-badge">✓ On-Chain</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#22</span><spanclass="cert-title">Certified Blockchain Architect</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Blockchain Council</div><divclass="cert-meta"><spanclass="id">ARCH-7734</span><spanclass="status-badge">✓ DID</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#23</span><spanclass="cert-title">Ethereum Developer</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> ConsenSys</div><divclass="cert-meta"><spanclass="id">ETH-7734</span><spanclass="status-badge">✓ Mainnet</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#24</span><spanclass="cert-title">Hyperledger Fabric Admin</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Linux Foundation</div><divclass="cert-meta"><spanclass="id">HLF-7734</span><spanclass="status-badge">✓ LF Wallet</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#25</span><spanclass="cert-title">Corda Certified Developer</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> R3</div><divclass="cert-meta"><spanclass="id">CORDA-7734</span><spanclass="status-badge">✓ Corda Network</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#26</span><spanclass="cert-title">Ripple (XRP) Ledger Certification</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Ripple</div><divclass="cert-meta"><spanclass="id">XRP-7734</span><spanclass="status-badge">✓ XRP Account</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#27</span><spanclass="cert-title">Smart Contract Security Auditor</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> CertIK</div><divclass="cert-meta"><spanclass="id">SCSA-7734</span><spanclass="status-badge">✓ Audit Chain</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#28</span><spanclass="cert-title">Decentralized Identity Specialist</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> DIF</div><divclass="cert-meta"><spanclass="id">DID-7734</span><spanclass="status-badge">✓ IPFS</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#29</span><spanclass="cert-title">Cryptocurrency Forensic Investigator</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> CipherTrace</div><divclass="cert-meta"><spanclass="id">CFI-7734</span><spanclass="status-badge">✓ API Tracker</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#30</span><spanclass="cert-title">Web3 Security Professional</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Web3 Foundation</div><divclass="cert-meta"><spanclass="id">W3S-7734</span><spanclass="status-badge">✓ Polkadot.js</span></div></div></div></div><!-- ===== CATEGORY D (31–40) ===== --><divclass="category-section"><divclass="cat-header"><spanclass="cat-letter">D</span><h2>Infrastruktur Awan &amp; Geopintar</h2><spanclass="cat-count">10 sijil</span></div><divclass="cert-grid"><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#31</span><spanclass="cert-title">Azure Solutions Architect Expert</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Microsoft</div><divclass="cert-meta"><spanclass="id">AZ-ARCH-7734</span><spanclass="status-badge">✓ Microsoft</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#32</span><spanclass="cert-title">Google Cloud Digital Leader</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Google Cloud</div><divclass="cert-meta"><spanclass="id">CDL-7734</span><spanclass="status-badge">✓ Google Credential</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#33</span><spanclass="cert-title">AWS Solutions Architect Professional</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> AWS</div><divclass="cert-meta"><spanclass="id">SA-PRO-7734</span><spanclass="status-badge">✓ Biometrik</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#34</span><spanclass="cert-title">Terraform Associate</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> HashiCorp</div><divclass="cert-meta"><spanclass="id">TERRA-7734</span><spanclass="status-badge">✓ HCP</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#35</span><spanclass="cert-title">Certified Kubernetes Administrator</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> CNCF</div><divclass="cert-meta"><spanclass="id">CKA-7734</span><spanclass="status-badge">✓ Kluster Peribadi</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#36</span><spanclass="cert-title">Red Hat Certified Architect</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Red Hat</div><divclass="cert-meta"><spanclass="id">RHCA-7734</span><spanclass="status-badge">✓ Red Hat Portal</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#37</span><spanclass="cert-title">Oracle Cloud Infrastructure Architect</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Oracle</div><divclass="cert-meta"><spanclass="id">OCI-ARCH-7734</span><spanclass="status-badge">✓ MFA</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#38</span><spanclass="cert-title">VMware VCP-Cloud Management</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> VMware</div><divclass="cert-meta"><spanclass="id">VCP-CM-7734</span><spanclass="status-badge">✓ Kunci Awam</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#39</span><spanclass="cert-title">GISP (GIS Professional)</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> GISCI</div><divclass="cert-meta"><spanclass="id">GISP-7734</span><spanclass="status-badge">✓ Geopintar</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#40</span><spanclass="cert-title">Satellite Imagery Analysis for AI</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Esri / Maxar</div><divclass="cert-meta"><spanclass="id">SAT-7734</span><spanclass="status-badge">✓ ArcGIS+API</span></div></div></div></div><!-- ===== CATEGORY E (41–50) ===== --><divclass="category-section"><divclass="cat-header"><spanclass="cat-letter">E</span><h2>Kepimpinan &amp; Strategi Digital</h2><spanclass="cat-count">10 sijil</span></div><divclass="cert-grid"><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#41</span><spanclass="cert-title">PMP</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> PMI</div><divclass="cert-meta"><spanclass="id">PMP-7734</span><spanclass="status-badge">✓ PMI Registry</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#42</span><spanclass="cert-title">ITIL 4 Managing Professional</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> AXELOS</div><divclass="cert-meta"><spanclass="id">ITIL4-7734</span><spanclass="status-badge">✓ AXELOS Portal</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#43</span><spanclass="cert-title">COBIT 2019 Foundation</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> ISACA</div><divclass="cert-meta"><spanclass="id">COBIT-7734</span><spanclass="status-badge">✓ 2FA</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#44</span><spanclass="cert-title">CDPSE</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> ISACA</div><divclass="cert-meta"><spanclass="id">CDPSE-7734</span><spanclass="status-badge">✓ Privasi Terenkripsi</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#45</span><spanclass="cert-title">Digital Transformation Specialist</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> IQBBA</div><divclass="cert-meta"><spanclass="id">DTS-7734</span><spanclass="status-badge">✓ IQBBA</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#46</span><spanclass="cert-title">AI Governance Professional (AIGP)</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> IAPP</div><divclass="cert-meta"><spanclass="id">AIGP-7734</span><spanclass="status-badge">✓ Digital Signature</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#47</span><spanclass="cert-title">Quantum Computing Foundations</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> IBM/Qiskit</div><divclass="cert-meta"><spanclass="id">QUANTUM-7734</span><spanclass="status-badge">✓ Qiskit Badge</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#48</span><spanclass="cert-title">ISO/IEC 27001 Lead Auditor</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> PECB</div><divclass="cert-meta"><spanclass="id">ISO27K-7734</span><spanclass="status-badge">✓ Hash Audit</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#49</span><spanclass="cert-title">Strategic Intelligence &amp; Analysis</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> INSA</div><divclass="cert-meta"><spanclass="id">INTEL-7734</span><spanclass="status-badge">✓ Keselamatan Berlapis</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#50</span><spanclass="cert-title">Global Technology Leadership</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> MIT Sloan/edX</div><divclass="cert-meta"><spanclass="id">LEAD-7734</span><spanclass="status-badge">✓ MIT Integriti</span></div></div></div></div><!-- ===== CATEGORY F (51–65) ===== --><divclass="category-section"><divclass="cat-header"><spanclass="cat-letter">F</span><h2>Advanced AI &amp; Data Science</h2><spanclass="cat-count">15 sijil</span></div><divclass="cert-grid"><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#51</span><spanclass="cert-title">Google Professional Data Engineer</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Google Cloud</div><divclass="cert-meta"><spanclass="id">DE-7734-001</span><spanclass="status-badge">✓ FIDO2</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#52</span><spanclass="cert-title">Databricks Certified Data Engineer Pro</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> Databricks</div><divclass="cert-meta"><spanclass="id">DE-PRO-7734</span><spanclass="status-badge">✓ Lakehouse</span></div></div><divclass="cert-card"><divclass="cert-header"><spanclass="cert-num">#53</span><spanclass="cert-title">SAS Certified AI &amp; ML Professional</span></div><divclass="cert-publisher"><iclass="fas fa-building"></i> SAS</div><divclass="cert-meta"><spanclass="id">AIML-7734</span><spanclass="status-badge">✓ SAS Viya</span></div></di…
___
## **CodeAnt-AI Description**
Add a practical guide to filtering and searching GitHub issues and pull requests
### What Changed
- Documents basic filters for finding open, assigned, created, or mentioned issues and pull requests
- Provides examples for author, assignee, label, state, type, exclusion, Boolean, and nested searches
- Explains pull request review, draft, merge, status, and linked-issue filters, plus issue-specific filters
- Covers sorting, sharing filtered views, GitHub CLI searches, and tips for clearing or combining filters
### Impact
`✅ Faster issue and pull request discovery`
`✅ Clearer search syntax examples`
`✅ Easier sharing and automation of filtered views`
<details><summary><strong>💡 Usage Guide</strong></summary>
### Checking Your Pull Request
Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.
### Talking to CodeAnt AI
Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:
<pre><code>@codeant-ai ask: Your question here</code></pre>
This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.
#### Example
<pre><code>@codeant-ai ask: Can you suggest a safer alternative to storing this secret?</code></pre>
### Preserve Org Learnings with CodeAnt
You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:
<pre><code>@codeant-ai: Your feedback here</code></pre>
This helps CodeAnt AI learn and adapt to your team's coding style and standards.
#### Example
<pre><code>@codeant-ai: Do not flag unused imports.</code></pre>
### Retrigger review
Ask CodeAnt AI to review the PR again, by typing:
<pre><code>@codeant-ai: review</code></pre>
### Check Your Repository Health
To analyze the health of your code repository, visit our dashboard at [https://app.codeant.ai](https://app.codeant.ai). This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.
</details>

Added comprehensive guide on filtering and searching issues and pull requests in GitHub, including basic and advanced filtering techniques, sorting options, and automation tips.Saya telah **menambah panduan komprehensif baharu** tentang penapisan dan pencarian Isu & PR di GitHub ke dalam fail HTML yang sama. Kandungan baharu ini diletakkan **selepas bahagian Kesimpulan Gradle** dan **sebelum senarai 200 Sijil**, dengan struktur tersendiri termasuk jadual rujukan pantas.
Berikut adalah **fail HTML penuh dan muktamad** — salin dan simpan sebagai `.html`:
```html
<!DOCTYPE html>
<html lang="ms">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Panduan Lengkap + GitHub Search + 200 Sijil</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" />
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
margin: 20px;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
color: #333;
background-color: #fff;
}
h1, h2, h3, h4 {
color: #2c3e50;
margin-top: 1.5em;
margin-bottom: 0.5em;
}
h1 {
border-bottom: 3px solid #3498db;
padding-bottom: 10px;
}
h2 {
border-bottom: 2px solid #ecf0f1;
padding-bottom: 5px;
}
pre {
background-color: #f8f9fa;
border: 1px solid #ddd;
border-radius: 5px;
padding: 15px;
overflow-x: auto;
font-family: 'Courier New', Courier, monospace;
font-size: 14px;
line-height: 1.4;
margin: 1em 0;
}
code {
font-family: 'Courier New', Courier, monospace;
background-color: #f8f9fa;
padding: 2px 4px;
border-radius: 3px;
font-size: 0.9em;
}
pre code {
background-color: transparent;
padding: 0;
}
table {
border-collapse: collapse;
width: 100%;
margin: 1em 0;
}
th, td {
border: 1px solid #ddd;
padding: 8px 12px;
text-align: left;
}
th {
background-color: #f2f2f2;
font-weight: bold;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
.toc {
background-color: #f8f9fa;
border: 1px solid #ddd;
border-radius: 5px;
padding: 15px;
margin: 20px 0;
}
.toc ul {
list-style-type: none;
padding-left: 20px;
}
.toc li {
margin: 5px 0;
}
.note {
background-color: #e8f4fd;
border-left: 5px solid #3498db;
padding: 10px 15px;
margin: 1em 0;
}
/* Sijil grid */
.cert-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 1rem;
margin: 1.5rem 0;
}
.cert-card {
background: #f8f9fa;
border-left: 4px solid #3498db;
padding: 0.8rem 1rem;
border-radius: 6px;
border: 1px solid #e0e0e0;
box-shadow: 0 2px 4px rgba(0,0,0,0.04);
}
.cert-card .cert-header {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 0.5rem;
}
.cert-card .cert-num {
font-weight: 700;
color: #2c3e50;
font-size: 0.75rem;
background: #e9ecef;
padding: 0.1rem 0.6rem;
border-radius: 20px;
}
.cert-card .cert-title {
font-weight: 600;
font-size: 0.95rem;
}
.cert-card .cert-publisher {
font-size: 0.8rem;
color: #555;
}
.cert-card .cert-meta {
display: flex;
justify-content: space-between;
font-size: 0.7rem;
color: #666;
margin-top: 0.3rem;
border-top: 1px solid #eee;
padding-top: 0.3rem;
}
.cert-card .cert-meta .id {
font-family: monospace;
background: #e9ecef;
padding: 0.1rem 0.5rem;
border-radius: 12px;
}
.cert-card .cert-meta .status-badge {
color: #28a745;
font-weight: 500;
}
.category-section {
margin-top: 2.5rem;
}
.cat-header {
display: flex;
align-items: center;
gap: 1rem;
border-bottom: 2px solid #dee2e6;
padding-bottom: 0.4rem;
margin-bottom: 1rem;
}
.cat-letter {
font-size: 1.8rem;
font-weight: 700;
color: #3498db;
background: #e9f0f8;
width: 3rem;
height: 3rem;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
}
.cat-count {
font-size: 0.8rem;
color: #6c757d;
margin-left: auto;
}
.goodbye-note {
text-align: center;
margin: 2rem 0 0;
padding: 1rem;
font-size: 1.8rem;
font-weight: 700;
color: #3498db;
border-top: 2px solid #dee2e6;
}
/* PAUTAN & SUMBER */
.resources-section {
background: #f0f7ff;
border: 1px solid #d0e3f0;
border-radius: 12px;
padding: 1.5rem 2rem;
margin: 1.5rem 0;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.links-grid {
display: flex;
flex-wrap: wrap;
gap: 0.8rem 1.5rem;
}
.links-grid a {
color: #1a73e8;
text-decoration: none;
font-weight: 500;
}
.links-grid a:hover {
text-decoration: underline;
}
.resource-image {
text-align: center;
margin: 1.5rem 0;
}
.resource-image img {
max-width: 100%;
height: auto;
border-radius: 8px;
border: 1px solid #ddd;
max-height: 600px;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
@media (max-width: 600px) {
.cert-grid { grid-template-columns: 1fr; }
.resources-section { flex-direction: column; align-items: flex-start; gap: 1rem; }
}
</style>
</head>
<body>
<!-- ===== TAJUK UTAMA ===== -->
<h1>Panduan Lengkap: Meniru Gaya Binaan Gradle dalam .NET CI/CD</h1>
<!-- ===== PAUTAN PENTING & SUMBER ===== -->
<div class="resources-section">
<div style="width:100%;">
<h3 style="margin-top:0; color:#2c3e50;">🔗 Pautan Penting & Sumber</h3>
<div class="links-grid">
<a href="https://www.google.com" target="_blank">Google</a>
<a href="https://console.firebase.google.com" target="_blank">Firebase Console</a>
<a href="https://firebase.google.com" target="_blank">Firebase</a>
<a href="http://www.sazwan.fairbase.com" target="_blank">sazwan.fairbase.com</a>
<a href="https://aws.amazon.com" target="_blank">AWS</a>
<a href="https://ms.wikipedia.org/wiki/Laman_Utama" target="_blank">Wikipedia BM</a>
<a href="https://en.wikipedia.org/wiki/Main_Page" target="_blank">Wikipedia EN</a>
</div>
</div>
</div>
<!-- ===== GAMBAR ===== -->
<div class="resource-image">
<img width="960" height="1280" alt="Image blue (12)" src="https://github.com/user-attachments/assets/49bc325d-005c-4bfd-a277-543c8de27973" />
</div>
<!-- ===== JADUAL KANDUNGAN (GRADLE) ===== -->
<div class="toc">
<h2>Kandungan (Gradle .NET)</h2>
<ul>
<li><a href="#pengenalan">Pengenalan</a></li>
<li><a href="#pendekatan-utama">Lima Pendekatan Utama</a>
<ul>
<li><a href="#dotnet-cli">1. dotnet CLI Sahaja</a></li>
<li><a href="#nuke">2. Nuke (Build Automation dengan C# DSL)</a></li>
<li><a href="#cake">3. Cake (C# Make)</a></li>
<li><a href="#msbuild">4. MSBuild Custom Targets</a></li>
<li><a href="#bullseye">5. Bullseye + SimpleExec</a></li>
</ul>
</li>
<li><a href="#fake">Pendekatan Tambahan: FAKE (F# Make)</a></li>
<li><a href="#ciri-lanjutan">Ciri Lanjutan untuk Meniru Gradle</a>
<ul>
<li><a href="#incremental">Incremental Builds &amp; Up-to-Date Checks</a></li>
<li><a href="#caching">Build Caching Strategies</a></li>
<li><a href="#parallel">Parallel Execution</a></li>
<li><a href="#config">Configuration Management</a></li>
<li><a href="#versioning">Versioning Automatik</a></li>
<li><a href="#custom-tasks">Custom Tasks</a></li>
<li><a href="#multi-project">Multi-Project Builds</a></li>
<li><a href="#docker-nuget">Integrasi Docker &amp; NuGet</a></li>
</ul>
</li>
<li><a href="#contoh-pipeline">Contoh Pipeline CI/CD</a>
<ul>
<li><a href="#github-actions">GitHub Actions</a></li>
<li><a href="#azure-devops">Azure DevOps</a></li>
<li><a href="#gitlab-ci">GitLab CI</a></li>
</ul>
</li>
<li><a href="#perbandingan">Jadual Perbandingan</a></li>
<li><a href="#cadangan">Cadangan</a></li>
<li><a href="#pengurusan-dependensi">Pengurusan Dependensi &amp; Kemaskini Automatik</a></li>
<li><a href="#kualiti-kod">Analisis Kualiti Kod &amp; Test Coverage</a></li>
<li><a href="#deployment-lanjutan">Strategi Deployment Lanjutan</a></li>
<li><a href="#rahsia-konfigurasi">Pengurusan Rahsia &amp; Konfigurasi</a></li>
<li><a href="#optimum-masa">Pengoptimuman Masa Binaan</a></li>
<li><a href="#struktur-projek">Contoh Struktur Projek Berbilang Modul</a></li>
<li><a href="#perbandingan-gradle">Perbandingan dengan Gradle pada Aspek Spesifik</a></li>
<li><a href="#integrasi-pihak-ketiga">Integrasi dengan Alat Pihak Ketiga</a></li>
<li><a href="#kesimpulan">Kesimpulan</a></li>
</ul>
</div>
<!-- ================================================================ -->
<!-- BAHAGIAN GRADLE .NET (sedia ada) -->
<!-- ================================================================ -->
<h2 id="pengenalan">Pengenalan</h2>
<p>Gradle terkenal dengan kitaran hayat binaan berperingkat (<code>clean</code>, <code>build</code>, <code>test</code>, <code>publish</code>), caching yang bijak, kebergantungan tugas, dan DSL yang berkuasa. Dalam .NET, kita boleh meniru falsafah ini menggunakan pelbagai alat dan teknik. Panduan ini menggabungkan semua pendekatan, ciri lanjutan, contoh CI, dan strategi untuk mencapai pengalaman Gradle dalam projek .NET.</p>
<h2 id="pendekatan-utama">Lima Pendekatan Utama</h2>
<h3 id="dotnet-cli">1. dotnet CLI Sahaja (Native)</h3>
<pre><code>steps:
- name: Clean
run: dotnet clean
- name: Restore
run: dotnet restore
- name: Build
run: dotnet build --no-restore -c Release
- name: Test
run: dotnet test --no-build -c Release
- name: Publish
run: dotnet publish --no-build -c Release -o ./publish</code></pre>
<p><strong>Persamaan Gradle:</strong> Setiap langkah seperti task; <code>--no-restore</code>, <code>--no-build</code> menghalang kerja berulang.<br>
<strong>Kelebihan:</strong> Mudah, tiada kebergantungan tambahan.<br>
<strong>Kekurangan:</strong> Kurang struktur, tiada parameterisasi/caching bawaan.</p>
<h3 id="nuke">2. Nuke (Build Automation dengan C# DSL)</h3>
<pre><code>class Build : NukeBuild
{
public static int Main() => Execute&lt;Build&gt;(x => x.Publish);
Target Clean => _ => _.Executes(() => DotNetClean());
Target Restore => _ => _.DependsOn(Clean).Executes(() => DotNetRestore());
Target Compile => _ => _.DependsOn(Restore).Executes(() => DotNetBuild(s => s.EnableNoRestore()));
Target Test => _ => _.DependsOn(Compile).Executes(() => DotNetTest(s => s.EnableNoBuild()));
Target Publish => _ => _.DependsOn(Test).Executes(() => DotNetPublish(s => s.SetOutput("publish")));
}</code></pre>
<p><strong>Jalankan:</strong> <code>./build.cmd Publish</code><br>
<strong>Persamaan Gradle:</strong> Target = Task, <code>DependsOn</code> = <code>dependsOn</code>, parameterisasi penuh.<br>
<strong>Kelebihan:</strong> Paling dekat dengan Gradle, menyokong caching (<code>[Cached]</code>), boleh diuji.<br>
<strong>Kekurangan:</strong> Perlu belajar DSL, tambah projek binaan.</p>
<h3 id="cake">3. Cake (C# Make)</h3>
<pre><code>Task("Clean").Does(() => DotNetClean("."));
Task("Restore").IsDependentOn("Clean").Does(() => DotNetRestore("."));
Task("Build").IsDependentOn("Restore").Does(() => DotNetBuild(".", new DotNetBuildSettings { NoRestore = true }));
Task("Test").IsDependentOn("Build").Does(() => DotNetTest(".", new DotNetTestSettings { NoBuild = true }));
Task("Publish").IsDependentOn("Test").Does(() => DotNetPublish(".", new DotNetPublishSettings { OutputDirectory = "./publish" }));
RunTarget("Publish");</code></pre>
<p><strong>Jalankan:</strong> <code>dotnet cake build.cake --target=Publish</code><br>
<strong>Persamaan Gradle:</strong> <code>IsDependentOn</code> setara dengan <code>dependsOn</code>.<br>
<strong>Kelebihan:</strong> Matang, DSL mudah dibaca, banyak addin.<br>
<strong>Kekurangan:</strong> Tiada caching bawaan (perlu manual/CI).</p>
<h3 id="msbuild">4. MSBuild Custom Targets (Native XML)</h3>
<pre><code>&lt;Project&gt;
&lt;Target Name="CleanAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Clean" /&gt;
&lt;/Target&gt;
&lt;Target Name="RestoreAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Restore" /&gt;
&lt;/Target&gt;
&lt;Target Name="BuildAll" DependsOnTargets="CleanAll;RestoreAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Build" Properties="Configuration=Release" /&gt;
&lt;/Target&gt;
&lt;Target Name="TestAll" DependsOnTargets="BuildAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="VSTest" Properties="Configuration=Release" /&gt;
&lt;/Target&gt;
&lt;Target Name="PublishAll" DependsOnTargets="TestAll"&gt;
&lt;MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="Configuration=Release;PublishDir=./publish" /&gt;
&lt;/Target&gt;
&lt;/Project&gt;</code></pre>
<p><strong>Jalankan:</strong> <code>dotnet msbuild -t:PublishAll</code><br>
<strong>Persamaan Gradle:</strong> <code>DependsOnTargets</code> = <code>dependsOn</code>.<br>
<strong>Kelebihan:</strong> Native, tiada alat tambahan.<br>
<strong>Kekurangan:</strong> Sintaks XML verbose, sukar untuk logik kompleks.</p>
<h3 id="bullseye">5. Bullseye + SimpleExec (C# Console Build)</h3>
<pre><code>using static Bullseye.Targets;
using static SimpleExec.Command;
Target("clean", () => Run("dotnet", "clean"));
Target("restore", DependsOn("clean"), () => Run("dotnet", "restore"));
Target("build", DependsOn("restore"), () => Run("dotnet", "build --no-restore -c Release"));
Target("test", DependsOn("build"), () => Run("dotnet", "test --no-build -c Release"));
Target("publish", DependsOn("test"), () => Run("dotnet", "publish --no-build -c Release -o ./publish"));
Target("default", DependsOn("publish"));
RunTargetsAndExit(args);</code></pre>
<p><strong>Jalankan:</strong> <code>dotnet run --project build -- publish</code><br>
<strong>Persamaan Gradle:</strong> Bullseye menyediakan <code>Target</code> dan <code>DependsOn</code> seperti Gradle.<br>
<strong>Kelebihan:</strong> Minimalis, C# tulen, sangat fleksibel.<br>
<strong>Kekurangan:</strong> Tiada caching bawaan, perlu projek binaan berasingan.</p>
<h2 id="fake">Pendekatan Tambahan: FAKE (F# Make)</h2>
<pre><code>#r "paket: nuget Fake.DotNet.Cli"
open Fake
open Fake.DotNet
Target.create "Clean" (fun _ -> DotNet.exec id "clean" "" |> ignore)
Target.create "Restore" (fun _ -> DotNet.restore id "")
Target.create "Build" (fun _ -> DotNet.build (fun p -> { p with Configuration = DotNet.BuildConfiguration.Release; NoRestore = true }) "")
Target.create "Test" (fun _ -> DotNet.test (fun p -> { p with Configuration = DotNet.BuildConfiguration.Release; NoBuild = true }) "")
Target.create "Publish" (fun _ -> DotNet.publish (fun p -> { p with Configuration = DotNet.BuildConfiguration.Release; NoBuild = true; OutputPath = Some "./publish" }) "")
open Fake.Core.TargetOperators
"Clean" ==> "Restore" ==> "Build" ==> "Test" ==> "Publish"
Target.runOrDefault "Publish"</code></pre>
<p><strong>Persamaan Gradle:</strong> Operator <code>==></code> menandakan kebergantungan.<br>
<strong>Kelebihan:</strong> Kuasa fungsional penuh, integrasi kuat.<br>
<strong>Kekurangan:</strong> Perlu pengetahuan F#, kurang popular.</p>
<h2 id="ciri-lanjutan">Ciri Lanjutan untuk Meniru Gradle</h2>
<h3 id="incremental">Incremental Builds &amp; Up-to-Date Checks</h3>
<ul>
<li><strong>MSBuild Native:</strong> Gunakan atribut <code>Inputs</code> dan <code>Outputs</code>.
<pre><code>&lt;Target Name="GenerateCode" Inputs="src\schema.proto" Outputs="generated\schema.cs"&gt;
&lt;Exec Command="protoc --csharp_out=generated src\schema.proto" /&gt;
&lt;/Target&gt;</code></pre></li>
<li><strong>Nuke:</strong> Atribut <code>[Cached]</code> pada target.
<pre><code>[Cached]
Target GenerateCode => _ => _.Executes(() => { ... });</code></pre></li>
<li><strong>Cake/Bullseye:</strong> Semakan manual menggunakan <code>System.IO.File.GetLastWriteTime</code>.</li>
</ul>
<h3 id="caching">Build Caching Strategies</h3>
<ul>
<li><strong>NuGet Cache:</strong> <code>~/.nuget/packages</code> (dengan lock file <code>packages.lock.json</code>).</li>
<li><strong>Build Output Cache:</strong> Simpan <code>bin</code> dan <code>obj</code> di CI.</li>
<li><strong>Nuke Cache:</strong> Folder <code>.nuke/temp</code>.</li>
<li><strong>Azure DevOps Cache Task / GitHub Actions cache</strong> dengan kunci berasaskan hash fail projek.</li>
</ul>
<h3 id="parallel">Parallel Execution</h3>
<ul>
<li><strong>MSBuild:</strong> Gunakan <code>-m</code> atau <code>-p:BuildInParallel=true</code>.</li>
<li><strong>Nuke:</strong> Jalankan target bebas secara selari dengan <code>await Task.WhenAll</code> atau <code>nuke --parallel</code>.</li>
<li><strong>Cake:</strong> <code>Parallel.ForEach</code> dalam task.</li>
<li><strong>Bullseye:</strong> <code>Task.WhenAll</code> dengan <code>RunAsync</code>.</li>
</ul>
<h3 id="config">Configuration Management</h3>
<ul>
<li><strong>Nuke:</strong> Parameter melalui <code>[Parameter]</code> dan hujah CLI.</li>
<li><strong>MSBuild:</strong> Properties <code>-p:Configuration=Debug</code>.</li>
<li><strong>Cake:</strong> <code>Argument()</code> dan <code>HasArgument()</code>.</li>
</ul>
<h3 id="versioning">Versioning Automatik</h3>
<ul>
<li><strong>GitVersion</strong> atau <strong>Nerdbank.GitVersioning</strong>.</li>
<li>Integrasi dengan Nuke/Cake/MSBuild untuk menetapkan versi semasa <code>build</code>, <code>pack</code>, <code>publish</code>.</li>
</ul>
<h3 id="custom-tasks">Custom Tasks</h3>
<p>Setiap alat membolehkan anda menulis logik tersuai (contoh: menjalankan migrasi EF, bina Docker, hantar pakej NuGet).</p>
<h3 id="multi-project">Multi-Project Builds</h3>
<ul>
<li>Gunakan <code>.sln</code> atau <code>.slnf</code> (Solution Filter).</li>
<li>Nuke/Cake/Bullseye: bina projek tertentu sahaja (seperti <code>:app:build</code> dalam Gradle).</li>
<li>MSBuild project references menangani kebergantungan secara automatik.</li>
</ul>
<h3 id="docker-nuget">Integrasi Docker &amp; NuGet</h3>
<ul>
<li>Bina imej Docker selepas <code>publish</code>.</li>
<li><code>dotnet pack</code> dan <code>dotnet nuget push</code> (setara <code>maven-publish</code>).</li>
</ul>
<h2 id="contoh-pipeline">Contoh Pipeline CI/CD</h2>
<h3 id="github-actions">GitHub Actions (dengan Nuke)</h3>
<pre><code>name: CI
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- uses: actions/cache@v4
with:
path: |
~/.nuget/packages
.nuke/temp
key: ${{ runner.os }}-nuke-${{ hashFiles('**/*.csproj', 'build/**') }}
- name: Build &amp; Publish
run: ./build.cmd Publish
- uses: actions/upload-artifact@v4
with:
name: publish
path: publish/</code></pre>
<h3 id="azure-devops">Azure DevOps</h3>
<pre><code>trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UseDotNet@2
inputs:
version: '8.x'
- script: dotnet clean
- script: dotnet restore
- script: dotnet build --no-restore -c Release
- script: dotnet test --no-build -c Release --logger trx
- script: dotnet publish --no-build -c Release -o $(Build.ArtifactStagingDirectory)/publish
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)/publish'
artifactName: 'drop'</code></pre>
<h3 id="gitlab-ci">GitLab CI</h3>
<pre><code>image: mcr.microsoft.com/dotnet/sdk:8.0
stages: [build, test, deploy]
cache:
paths:
- ~/.nuget/packages
build:
stage: build
script:
- dotnet clean
- dotnet restore
- dotnet build --no-restore -c Release
test:
stage: test
script:
- dotnet test --no-build -c Release
artifacts:
reports:
junit: test-results.xml
publish:
stage: deploy
script:
- dotnet publish --no-build -c Release -o ./publish
artifacts:
paths:
- ./publish
only:
- main</code></pre>
<h2 id="perbandingan">Jadual Perbandingan</h2>
<table>
<thead>
<tr>
<th>Pendekatan</th>
<th>Bahasa Skrip</th>
<th>Alat Tambahan</th>
<th>Caching Bawaan</th>
<th>Kemudahan</th>
<th>Sesuai Untuk</th>
</tr>
</thead>
<tbody>
<tr><td>dotnet CLI</td><td>YAML</td><td>Tidak</td><td>Manual (CI)</td><td>Sangat mudah</td><td>Projek kecil</td></tr>
<tr><td>Nuke</td><td>C#</td><td>Ya (Nuke)</td><td>Ya ([Cached])</td><td>Sederhana</td><td>Projek besar, kompleks</td></tr>
<tr><td>Cake</td><td>C# (script)</td><td>Ya (Cake)</td><td>Tidak</td><td>Mudah</td><td>Projek sederhana-besar</td></tr>
<tr><td>MSBuild Custom Targets</td><td>XML</td><td>Tidak</td><td>Manual (CI)</td><td>Sederhana</td><td>Pasukan mahir MSBuild</td></tr>
<tr><td>Bullseye + SimpleExec</td><td>C# (console)</td><td>Ya (2 pakej)</td><td>Tidak</td><td>Mudah</td><td>Projek fleksibel</td></tr>
<tr><td>FAKE</td><td>F#</td><td>Ya (FAKE)</td><td>Tidak</td><td>Sederhana</td><td>Binaan kompleks, F#</td></tr>
</tbody>
</table>
<h2 id="cadangan">Cadangan</h2>
<ul>
<li><strong>Projek kecil / prototaip:</strong> <code>dotnet CLI</code> sahaja.</li>
<li><strong>Pengalaman paling hampir dengan Gradle:</strong> <code>Nuke</code>.</li>
<li><strong>Pasukan yang suka skrip berasingan:</strong> <code>Cake</code>.</li>
<li><strong>Organisasi yang ingin kekal MSBuild sepenuhnya:</strong> <code>MSBuild Custom Targets</code>.</li>
<li><strong>Pembangun yang mahukan C# tulen dan minimal:</strong> <code>Bullseye + SimpleExec</code>.</li>
<li><strong>Penggemar F# atau binaan sangat kompleks:</strong> <code>FAKE</code>.</li>
</ul>
<h2 id="pengurusan-dependensi">Pengurusan Dependensi &amp; Kemaskini Automatik</h2>
<h3>Central Package Management (CPM)</h3>
<pre><code>&lt;Project&gt;
&lt;PropertyGroup&gt;
&lt;ManagePackageVersionsCentrally&gt;true&lt;/ManagePackageVersionsCentrally&gt;
&lt;/PropertyGroup&gt;
&lt;ItemGroup&gt;
&lt;PackageVersion Include="Newtonsoft.Json" Version="13.0.3" /&gt;
&lt;PackageVersion Include="Serilog" Version="3.1.1" /&gt;
&lt;/ItemGroup&gt;
&lt;/Project&gt;</code></pre>
<p>Kemudian dalam setiap <code>.csproj</code>, anda hanya nyatakan <code>PackageReference</code> tanpa versi.</p>
<h3>Dependency Locking</h3>
<pre><code>&lt;PropertyGroup&gt;
&lt;RestorePackagesWithLockFile&gt;true&lt;/RestorePackagesWithLockFile&gt;
&lt;/PropertyGroup&gt;</code></pre>
<p>Jalankan <code>dotnet restore --use-lock-file</code>.</p>
<h3>Automasi Kemaskini Dependensi</h3>
<ul>
<li><strong>Dependabot</strong> (GitHub) – menyokong NuGet.</li>
<li><strong>Renovate</strong> – sangat boleh dikonfigurasi.</li>
</ul>
<pre><code># .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10</code></pre>
<h2 id="kualiti-kod">Analisis Kualiti Kod &amp; Test Coverage</h2>
<h3>Code Coverage dengan Coverlet</h3>
<pre><code>dotnet test --collect:"XPlat Code Coverage"</code></pre>
<p>Hasilnya ialah fail <code>coverage.cobertura.xml</code> yang boleh dimuat naik ke SonarQube atau Codecov.</p>
<h3>Integrasi SonarQube</h3>
<pre><code>- name: Install SonarScanner
run: dotnet tool install --global dotnet-sonarscanner
- name: Begin Sonar analysis
run: dotnet-sonarscanner begin /k:"project-key" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.login="${{ secrets.SONAR_TOKEN }}"
- name: Build
run: dotnet build --no-restore -c Release
- name: Test
run: dotnet test --no-build -c Release --collect:"XPlat Code Coverage"
- name: End Sonar analysis
run: dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}"</code></pre>
<h2 id="deployment-lanjutan">Strategi Deployment Lanjutan</h2>
<h3>Docker Build &amp; Push</h3>
<pre><code>Target DockerBuild => _ => _
.DependsOn(Publish)
.Executes(() =>
{
DockerTasks.DockerBuild(s => s
.SetPath(RootDirectory)
.SetFile("Dockerfile")
.SetTag($"myapp:{GitVersion.Sha}"));
});
Target DockerPush => _ => _
.DependsOn(DockerBuild)
.Executes(() =>
{
DockerTasks.DockerPush(s => s
.SetName($"myapp:{GitVersion.Sha}")
.SetServer("registry.example.com")
.SetUsername(Environment.GetEnvironmentVariable("DOCKER_USERNAME"))
.SetPassword(Environment.GetEnvironmentVariable("DOCKER_PASSWORD")));
});</code></pre>
<h3>Deployment ke Kubernetes</h3>
<pre><code>- name: Deploy to Kubernetes
run: |
kubectl set image deployment/myapp myapp=registry.example.com/myapp:${{ github.sha }}
kubectl rollout status deployment/myapp</code></pre>
<h2 id="rahsia-konfigurasi">Pengurusan Rahsia &amp; Konfigurasi</h2>
<ul>
<li><strong>Environment Variables</strong> – akses melalui <code>Environment.GetEnvironmentVariable</code>.</li>
<li><strong>Azure Key Vault / AWS Secrets Manager</strong> – integrasikan dalam pipeline.</li>
<li><strong>.NET User Secrets</strong> – untuk pembangunan tempatan.</li>
</ul>
<pre><code>- task: AzureKeyVault@2
inputs:
azureSubscription: 'service-connection'
KeyVaultName: 'my-keyvault'
SecretsFilter: '*'</code></pre>
<h2 id="optimum-masa">Pengoptimuman Masa Binaan</h2>
<h3>MSBuild Static Graph</h3>
<pre><code>dotnet build -graphBuild</code></pre>
<h3>Distributed Caching</h3>
<ul>
<li>Azure DevOps Pipeline Caching dengan kunci berasaskan hash fail.</li>
<li>GitHub Actions Cache untuk <code>bin</code>, <code>obj</code>, dan <code>.nuget</code>.</li>
</ul>
<h3>Build Agents yang Dioptimumkan</h3>
<p>Gunakan mesin dengan CPU tinggi atau self-hosted runners dengan cache tempatan.</p>
<h2 id="struktur-projek">Contoh Struktur Projek Berbilang Modul</h2>
<pre><code>/MySolution.sln
/src/
/App/
App.csproj
/Lib/
Lib.csproj
/tests/
/App.Tests/
App.Tests.csproj
/Lib.Tests/
Lib.Tests.csproj
/build/
Build.cs (Nuke)
_build.csproj</code></pre>
<p>Dalam Nuke, anda boleh membina subset projek:</p>
<pre><code>Target BuildApp => _ => _
.DependsOn(Restore)
.Executes(() => DotNetBuild(s => s
.SetProjectFile(Solution.GetProject("App"))
.SetConfiguration(Configuration)
.EnableNoRestore()));</code></pre>
<h2 id="perbandingan-gradle">Perbandingan dengan Gradle pada Aspek Spesifik</h2>
<table>
<thead>
<tr><th>Aspek</th><th>Gradle</th><th>.NET Setara</th></tr>
</thead>
<tbody>
<tr><td>Multi-project</td><td><code>settings.gradle</code>, <code>:module:task</code></td><td><code>.sln</code>, <code>.slnf</code>, Nuke/Cake targets</td></tr>
<tr><td>Configuration cache</td><td>Ya</td><td>MSBuild static graph (<code>-graphBuild</code>)</td></tr>
<tr><td>Dependency locking</td><td><code>gradle.lockfile</code></td><td><code>packages.lock.json</code></td></tr>
<tr><td>Version catalog</td><td><code>libs.versions.toml</code></td><td><code>Directory.Packages.props</code> (CPM)</td></tr>
<tr><td>Code coverage</td><td>JaCoCo</td><td>Coverlet</td></tr>
<tr><td>Static analysis</td><td>SonarQube plugin</td><td>SonarScanner for .NET</td></tr>
<tr><td>Publishing</td><td><code>maven-publish</code></td><td><code>dotnet pack</code> + <code>dotnet nuget push</code></td></tr>
<tr><td>Parallel execution</td><td><code>--parallel</code></td><td><code>-m</code> (MSBuild), Nuke/Cake parallel targets</td></tr>
</tbody>
</table>
<h2 id="integrasi-pihak-ketiga">Integrasi dengan Alat Pihak Ketiga</h2>
<h3>Notifikasi</h3>
<pre><code>- name: Notify Slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
text: 'Build completed'
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}</code></pre>
<h3>Pengurusan Isu</h3>
<p>Automatik tutup isu apabila PR yang berkaitan digabungkan (menggunakan GitHub Actions).</p>
<h3>Dashboard &amp; Metrik</h3>
<p>Gunakan Grafana atau Azure Monitor untuk memantau prestasi binaan.</p>
<h2 id="kesimpulan">Kesimpulan</h2>
<p>Dengan menggabungkan semua pendekatan dan ciri lanjutan di atas, anda boleh membina pipeline CI/CD .NET yang bukan sahaja meniru gaya Gradle, tetapi juga setanding dari segi kecekapan, kebolehpercayaan, dan kemudahan penyelenggaraan. Pilih alat yang paling sesuai dengan budaya pasukan anda, dan gunakan ciri-ciri seperti caching, versioning, dan analisis kualiti untuk mencapai tahap automasi yang tinggi.</p>
<p>Jika anda ingin mendalami mana-mana topik di atas atau memerlukan contoh yang lebih spesifik, sila beritahu! Saya sedia membantu. 😊</p>
<!-- ================================================================ -->
<!-- BAHAGIAN BARU: GITHUB SEARCH & FILTERING GUIDE -->
<!-- ================================================================ -->
<hr style="margin:2rem 0; border-top:3px solid #2c3e50;" />
<h1 style="border-bottom-color:#6f42c1; color:#6f42c1;">🔎 Panduan Komprehensif: Menapis & Mencari Isu dan PR di GitHub</h1>
<div class="toc" style="border-color:#6f42c1;">
<h2>Kandungan (GitHub Search)</h2>
<ul>
<li><a href="#github-intro">Pengenalan</a></li>
<li><a href="#github-basic">Penapis Asas (is, state, author)</a></li>
<li><a href="#github-advanced">Penapis Lanjutan (label, milestone, assignee, review, status, exclusion)</a></li>
<li><a href="#github-date">Penapis Tarikh &amp; Kuantiti</a></li>
<li><a href="#github-combination">Kombinasi Carian (AND, OR, NOT, petikan)</a></li>
<li><a href="#github-sort">Pilihan Pengisihan (Sorting)</a></li>
<li><a href="#github-automation">Tip Automasi &amp; CLI</a></li>
<li><a href="#github-cheatsheet">Jadual Rujukan Cepat</a></li>
</ul>
</div>
<h2 id="github-intro">Pengenalan</h2>
<p>GitHub menyediakan enjin carian yang sangat berkuasa untuk <strong>Isu</strong> dan <strong>Pull Request (PR)</strong>. Dengan menguasai penapis dan operator carian, anda boleh mencari item dengan pantas, mengurus projek dengan cekap, dan mengautomasikan aliran kerja. Panduan ini merangkumi semua teknik asas hingga lanjutan.</p>
<h2 id="github-basic">1. Penapis Asas</h2>
<table>
<thead><tr><th>Penapis</th><th>Contoh</th><th>Keterangan</th></tr></thead>
<tbody>
<tr><td><code>is:issue</code></td><td><code>is:issue</code></td><td>Tunjukkan hanya Isu</td></tr>
<tr><td><code>is:pr</code></td><td><code>is:pr</code></td><td>Tunjukkan hanya Pull Request</td></tr>
<tr><td><code>state:open</code></td><td><code>state:open</code></td><td>Item yang terbuka</td></tr>
<tr><td><code>state:closed</code></td><td><code>state:closed</code></td><td>Item yang ditutup</td></tr>
<tr><td><code>author:USERNAME</code></td><td><code>author:octocat</code></td><td>Dibuat oleh pengguna tertentu</td></tr>
<tr><td><code>assignee:USERNAME</code></td><td><code>assignee:octocat</code></td><td>Ditugaskan kepada pengguna tertentu</td></tr>
</tbody>
</table>
<h2 id="github-advanced">2. Penapis Lanjutan</h2>
<table>
<thead><tr><th>Penapis</th><th>Contoh</th><th>Keterangan</th></tr></thead>
<tbody>
<tr><td><code>label:"..."</code></td><td><code>label:"bug"</code> / <code>label:bug</code></td><td>Item dengan label tertentu</td></tr>
<tr><td><code>milestone:"..."</code></td><td><code>milestone:"v1.0"</code></td><td>Item dalam milestone tertentu</td></tr>
<tr><td><code>project:"..."</code></td><td><code>project:"Project Board"</code></td><td>Item dalam projek tertentu</td></tr>
<tr><td><code>review:approved</code></td><td><code>review:approved</code></td><td>PR yang diluluskan</td></tr>
<tr><td><code>review:changes_requested</code></td><td><code>review:changes_requested</code></td><td>PR yang minta perubahan</td></tr>
<tr><td><code>review:required</code></td><td><code>review:required</code></td><td>PR yang memerlukan semakan</td></tr>
<tr><td><code>status:pending</code></td><td><code>status:pending</code></td><td>Status semakan masih dalam proses</td></tr>
<tr><td><code>status:success</code></td><td><code>status:success</code></td><td>Semakan berjaya</td></tr>
<tr><td><code>status:failure</code></td><td><code>status:failure</code></td><td>Semakan gagal</td></tr>
<tr><td><code>team:ORG/TEAM</code></td><td><code>team:github/engineering</code></td><td>Ditugaskan kepada pasukan tertentu</td></tr>
<tr><td><code>linked:pr</code></td><td><code>linked:pr</code></td><td>Isu yang dipautkan dengan PR</td></tr>
<tr><td><code>linked:issue</code></td><td><code>linked:issue</code></td><td>PR yang dipautkan dengan Isu</td></tr>
<tr><td><code>-label:duplicate</code></td><td><code>-label:duplicate</code></td><td>Kecualikan label tertentu (tanda minus)</td></tr>
<tr><td><code>no:label</code></td><td><code>no:label</code></td><td>Item tanpa label</td></tr>
<tr><td><code>no:assignee</code></td><td><code>no:assignee</code></td><td>Item tanpa assignee</td></tr>
<tr><td><code>no:milestone</code></td><td><code>no:milestone</code></td><td>Item tanpa milestone</td></tr>
<tr><td><code>no:project</code></td><td><code>no:project</code></td><td>Item tanpa projek</td></tr>
</tbody>
</table>
<h2 id="github-date">3. Penapis Tarikh &amp; Kuantiti</h2>
<table>
<thead><tr><th>Penapis</th><th>Contoh</th><th>Keterangan</th></tr></thead>
<tbody>
<tr><td><code>created:>YYYY-MM-DD</code></td><td><code>created:>2024-01-01</code></td><td>Dicipta selepas tarikh</td></tr>
<tr><td><code>created:&lt;YYYY-MM-DD</code></td><td><code>created:&lt;2024-12-31</code></td><td>Dicipta sebelum tarikh</td></tr>
<tr><td><code>updated:>YYYY-MM-DD</code></td><td><code>updated:>2024-06-01</code></td><td>Dikemas kini selepas tarikh</td></tr>
<tr><td><code>comments:>N</code></td><td><code>comments:>10</code></td><td>Mempunyai lebih daripada N komen</td></tr>
<tr><td><code>interactions:>N</code></td><td><code>interactions:>5</code></td><td>Interaksi (komen + reaksi) melebihi N</td></tr>
</tbody>
</table>
<h2 id="github-combination">4. Kombinasi Carian (AND, OR, NOT)</h2>
<ul>
<li><strong>Gunakan <code>AND</code> (atau ruang):</strong> <code>is:issue label:bug assignee:octocat</code> (semua syarat mesti dipenuhi).</li>
<li><strong>Gunakan <code>OR</code>:</strong> <code>label:bug OR label:enhancement</code>.</li>
<li><strong>Gunakan <code>NOT</code> atau <code>-</code>:</strong> <code>label:bug -label:duplicate</code>.</li>
<li><strong>Petikan untuk frasa tepat:</strong> <code>"error 500"</code> (mencari frasa eksak dalam tajuk/kandungan).</li>
<li><strong>Tanda kurung untuk pengelompokan:</strong> <code>(label:bug OR label:enhancement) AND assignee:octocat</code>.</li>
</ul>
<div class="note"><strong>💡 Tip:</strong> Carian lalai menggunakan <code>AND</code> antara istilah. Gunakan <code>OR</code> dan <code>NOT</code> secara eksplisit untuk logik yang lebih kompleks.</div>
<h2 id="github-sort">5. Pilihan Pengisihan (Sorting)</h2>
<p>Tambah <code>sort:</code> pada akhir carian untuk menyusun hasil:</p>
<ul>
<li><code>sort:created-desc</code> — terbaru dahulu (lalai untuk isu)</li>
<li><code>sort:created-asc</code> — tertua dahulu</li>
<li><code>sort:updated-desc</code> — terbaru dikemas kini</li>
<li><code>sort:updated-asc</code> — paling lama tidak dikemas kini</li>
<li><code>sort:comments-desc</code> — paling banyak komen</li>
<li><code>sort:comments-asc</code> — paling sedikit komen</li>
<li><code>sort:reactions-desc</code> — paling banyak reaksi (👍, 🚀, dll.)</li>
</ul>
<p><strong>Contoh:</strong> <code>is:issue label:bug sort:updated-desc</code> — Isu berlabel bug, diisih mengikut tarikh kemas kini terkini.</p>
<h2 id="github-automation">6. Tip Automasi &amp; CLI</h2>
<h3>Pautan Carian Tersimpan</h3>
<p>GitHub menyimpan carian anda dalam URL. Anda boleh <strong>bookmark</strong> pautan tersebut atau menambahkannya ke <strong>Saved searches</strong> di profil anda untuk akses pantas.</p>
<h3>GitHub CLI (<code>gh</code>)</h3>
<p>Gunakan <code>gh search</code> dalam skrip atau terminal:</p>
<pre><code># Cari isu yang terbuka berlabel "bug" dalam repo "owner/repo"
gh issue list --repo owner/repo --label bug --state open
# Cari PR yang diluluskan
gh pr list --state open --review-approved
# Gabungkan dengan penapis lanjutan
gh search issues "is:issue label:bug assignee:octocat" --limit 10</code></pre>
<h3>Automasi dalam GitHub Actions</h3>
<p>Anda boleh menggunakan <code>gh search</code> dalam workflow untuk mengautomasikan tugas seperti mengumpul isu lapuk atau memberi label secara pukal:</p>
<pre><code>- name: Find stale issues
run: |
gh search issues "is:issue state:open updated:&lt;2024-01-01" --limit 100 > stale_issues.txt
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}</code></pre>
<h2 id="github-cheatsheet">7. Jadual Rujukan Cepat</h2>
<table>
<thead><tr><th>Kategori</th><th>Contoh Penapis</th></tr></thead>
<tbody>
<tr><td>Jenis</td><td><code>is:issue</code>, <code>is:pr</code></td></tr>
<tr><td>Status</td><td><code>state:open</code>, <code>state:closed</code></td></tr>
<tr><td>Pengguna</td><td><code>author:user</code>, <code>assignee:user</code>, <code>mentions:user</code></td></tr>
<tr><td>Metadata</td><td><code>label:bug</code>, <code>milestone:v1.0</code>, <code>project:board</code></td></tr>
<tr><td>Semakan PR</td><td><code>review:approved</code>, <code>review:changes_requested</code></td></tr>
<tr><td>Status CI</td><td><code>status:success</code>, <code>status:failure</code></td></tr>
<tr><td>Pengecualian</td><td><code>-label:duplicate</code>, <code>no:label</code>, <code>no:assignee</code></td></tr>
<tr><td>Tarikh</td><td><code>created:>2024-01-01</code>, <code>updated:&lt;2024-12-31</code></td></tr>
<tr><td>Kuantiti</td><td><code>comments:>10</code>, <code>interactions:>5</code></td></tr>
<tr><td>Logik</td><td><code>AND</code>, <code>OR</code>, <code>NOT</code>, petikan <code>"..."</code></td></tr>
<tr><td>Pengisihan</td><td><code>sort:created-desc</code>, <code>sort:updated-desc</code>, <code>sort:comments-desc</code></td></tr>
</tbody>
</table>
<p><strong>🔗 Sumber Rasmi:</strong> <a href="https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests" target="_blank">Dokumentasi GitHub: Searching Issues and Pull Requests</a></p>
<!-- ================================================================ -->
<!-- AKHIR BAHAGIAN GITHUB SEARCH -->
<!-- ================================================================ -->
<!-- ================================================================ -->
<!-- DATA SIJIL (200 PENTAULIAHAN GLOBAL) -->
<!-- ================================================================ -->
<hr style="margin:2rem 0; border-top:3px solid #3498db;" />
<h1 style="border-bottom-color:#2c3e50;">200 Pentauliahan Global — Muhamad Sazwan Bin Ismail</h1>
<div style="background:#f0f7ff; padding:1.2rem 1.8rem; border-radius:8px; margin:1.5rem 0; display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center;">
<div><strong>Rujukan:</strong> MSI-2026-07734 &nbsp;|&nbsp; <strong>Lejar:</strong> END-MYS-0425</div>
<div><span style="background:#28a745; color:#fff; padding:0.2rem 1rem; border-radius:30px;">GREEN ACROSS THE BOARD</span></div>
<div><i class="far fa-calendar-alt"></i> 17 Mei 2026 · Pusat Kawalan Kedaulatan AI, Malaysia</div>
</div>
<div style="display:flex; flex-wrap:wrap; gap:1.5rem 3rem; background:#f8f9fa; padding:0.8rem 2rem; border-radius:40px; margin-bottom:2rem;">
<div><strong>200</strong> Sijil</div>
<div><strong>18</strong> Domain</div>
<div><strong>45+</strong> Penerbit</div>
<div><strong>AES-256 GCM</strong> · SHA-256</div>
<div><span style="color:#28a745;">✓</span> Semua <strong>Aktif & Disahkan</strong></div>
</div>
<!-- ===== CATEGORY A (1–10) ===== -->
<div class="category-section">
<div class="cat-header"><span class="cat-letter">A</span><h2>AI &amp; Machine Learning</h2><span class="cat-count">10 sijil</span></div>
<div class="cert-grid">
<div class="cert-card"><div class="cert-header"><span class="cert-num">#1</span><span class="cert-title">Google Professional ML Engineer</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Google Cloud</div><div class="cert-meta"><span class="id">ML-SAZWAN-001</span><span class="status-badge">✓ OAuth2</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#2</span><span class="cert-title">AWS Certified AI &amp; ML – Specialty</span></div><div class="cert-publisher"><i class="fas fa-building"></i> AWS</div><div class="cert-meta"><span class="id">AWS-AI-7734</span><span class="status-badge">✓ IAM+CloudTrail</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#3</span><span class="cert-title">NVIDIA DLI: Computer Vision</span></div><div class="cert-publisher"><i class="fas fa-building"></i> NVIDIA</div><div class="cert-meta"><span class="id">DL-CV-7734</span><span class="status-badge">✓ NGC API</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#4</span><span class="cert-title">Stanford ML Specialization</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Stanford University</div><div class="cert-meta"><span class="id">STANFORD-ML-0425</span><span class="status-badge">✓ Ijazah</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#5</span><span class="cert-title">Azure AI Engineer Associate</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Microsoft</div><div class="cert-meta"><span class="id">MS-AI-7734</span><span class="status-badge">✓ Windows Hello+FIDO2</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#6</span><span class="cert-title">IBM AI Engineering Professional</span></div><div class="cert-publisher"><i class="fas fa-building"></i> IBM</div><div class="cert-meta"><span class="id">IBM-AI-7734</span><span class="status-badge">✓ Hyperledger Fabric</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#7</span><span class="cert-title">Intel Edge AI Certification</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Intel</div><div class="cert-meta"><span class="id">EDGE-7734</span><span class="status-badge">✓ Intel SGX</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#8</span><span class="cert-title">TensorFlow Developer Certificate</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Google/TensorFlow</div><div class="cert-meta"><span class="id">TF-7734</span><span class="status-badge">✓ Dompet Crypto</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#9</span><span class="cert-title">DeepLearning.AI: NLP</span></div><div class="cert-publisher"><i class="fas fa-building"></i> DeepLearning.AI/Coursera</div><div class="cert-meta"><span class="id">NLP-7734</span><span class="status-badge">✓ TLS 1.3</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#10</span><span class="cert-title">MIT xPRO: Coding</span></div><div class="cert-publisher"><i class="fas fa-building"></i> MIT xPRO</div><div class="cert-meta"><span class="id">MIT-CODING-7734</span><span class="status-badge">✓ Biometrik</span></div></div>
</div>
</div>
<!-- ===== CATEGORY B (11–20) ===== -->
<div class="category-section">
<div class="cat-header"><span class="cat-letter">B</span><h2>Keselamatan Siber &amp; Kedaulatan Digital</h2><span class="cat-count">10 sijil</span></div>
<div class="cert-grid">
<div class="cert-card"><div class="cert-header"><span class="cert-num">#11</span><span class="cert-title">CISSP</span></div><div class="cert-publisher"><i class="fas fa-building"></i> ISC2</div><div class="cert-meta"><span class="id">CISSP-7734</span><span class="status-badge">✓ SHA-256</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#12</span><span class="cert-title">CompTIA Security+</span></div><div class="cert-publisher"><i class="fas fa-building"></i> CompTIA</div><div class="cert-meta"><span class="id">SECPLUS-7734</span><span class="status-badge">✓ CertMetrics</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#13</span><span class="cert-title">CEH v12</span></div><div class="cert-publisher"><i class="fas fa-building"></i> EC-Council</div><div class="cert-meta"><span class="id">CEH-7734</span><span class="status-badge">✓ Aspen+OTP</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#14</span><span class="cert-title">CISM</span></div><div class="cert-publisher"><i class="fas fa-building"></i> ISACA</div><div class="cert-meta"><span class="id">CISM-7734</span><span class="status-badge">✓ Hash Rantaian</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#15</span><span class="cert-title">GIAC GSEC</span></div><div class="cert-publisher"><i class="fas fa-building"></i> GIAC</div><div class="cert-meta"><span class="id">GSEC-7734</span><span class="status-badge">✓ SANS</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#16</span><span class="cert-title">OSCP</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Offensive Security</div><div class="cert-meta"><span class="id">OSCP-7734</span><span class="status-badge">✓ Kunci Awam</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#17</span><span class="cert-title">CCSP</span></div><div class="cert-publisher"><i class="fas fa-building"></i> ISC2</div><div class="cert-meta"><span class="id">CCSP-7734</span><span class="status-badge">✓ MFA</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#18</span><span class="cert-title">Certified in Cybersecurity (CC)</span></div><div class="cert-publisher"><i class="fas fa-building"></i> ISC2</div><div class="cert-meta"><span class="id">CC-7734</span><span class="status-badge">✓ Entry-Level</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#19</span><span class="cert-title">Fortinet NSE 7</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Fortinet</div><div class="cert-meta"><span class="id">NSE7-7734</span><span class="status-badge">✓ Digital Signature</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#20</span><span class="cert-title">Cisco CyberOps Professional</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Cisco</div><div class="cert-meta"><span class="id">CYBEROPS-7734</span><span class="status-badge">✓ CertTracker</span></div></div>
</div>
</div>
<!-- ===== CATEGORY C (21–30) ===== -->
<div class="category-section">
<div class="cat-header"><span class="cat-letter">C</span><h2>Blockchain &amp; Sovereign Ledger</h2><span class="cat-count">10 sijil</span></div>
<div class="cert-grid">
<div class="cert-card"><div class="cert-header"><span class="cert-num">#21</span><span class="cert-title">CBSP</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Blockchain Council</div><div class="cert-meta"><span class="id">CBSP-7734</span><span class="status-badge">✓ On-Chain</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#22</span><span class="cert-title">Certified Blockchain Architect</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Blockchain Council</div><div class="cert-meta"><span class="id">ARCH-7734</span><span class="status-badge">✓ DID</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#23</span><span class="cert-title">Ethereum Developer</span></div><div class="cert-publisher"><i class="fas fa-building"></i> ConsenSys</div><div class="cert-meta"><span class="id">ETH-7734</span><span class="status-badge">✓ Mainnet</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#24</span><span class="cert-title">Hyperledger Fabric Admin</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Linux Foundation</div><div class="cert-meta"><span class="id">HLF-7734</span><span class="status-badge">✓ LF Wallet</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#25</span><span class="cert-title">Corda Certified Developer</span></div><div class="cert-publisher"><i class="fas fa-building"></i> R3</div><div class="cert-meta"><span class="id">CORDA-7734</span><span class="status-badge">✓ Corda Network</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#26</span><span class="cert-title">Ripple (XRP) Ledger Certification</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Ripple</div><div class="cert-meta"><span class="id">XRP-7734</span><span class="status-badge">✓ XRP Account</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#27</span><span class="cert-title">Smart Contract Security Auditor</span></div><div class="cert-publisher"><i class="fas fa-building"></i> CertIK</div><div class="cert-meta"><span class="id">SCSA-7734</span><span class="status-badge">✓ Audit Chain</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#28</span><span class="cert-title">Decentralized Identity Specialist</span></div><div class="cert-publisher"><i class="fas fa-building"></i> DIF</div><div class="cert-meta"><span class="id">DID-7734</span><span class="status-badge">✓ IPFS</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#29</span><span class="cert-title">Cryptocurrency Forensic Investigator</span></div><div class="cert-publisher"><i class="fas fa-building"></i> CipherTrace</div><div class="cert-meta"><span class="id">CFI-7734</span><span class="status-badge">✓ API Tracker</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#30</span><span class="cert-title">Web3 Security Professional</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Web3 Foundation</div><div class="cert-meta"><span class="id">W3S-7734</span><span class="status-badge">✓ Polkadot.js</span></div></div>
</div>
</div>
<!-- ===== CATEGORY D (31–40) ===== -->
<div class="category-section">
<div class="cat-header"><span class="cat-letter">D</span><h2>Infrastruktur Awan &amp; Geopintar</h2><span class="cat-count">10 sijil</span></div>
<div class="cert-grid">
<div class="cert-card"><div class="cert-header"><span class="cert-num">#31</span><span class="cert-title">Azure Solutions Architect Expert</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Microsoft</div><div class="cert-meta"><span class="id">AZ-ARCH-7734</span><span class="status-badge">✓ Microsoft</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#32</span><span class="cert-title">Google Cloud Digital Leader</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Google Cloud</div><div class="cert-meta"><span class="id">CDL-7734</span><span class="status-badge">✓ Google Credential</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#33</span><span class="cert-title">AWS Solutions Architect Professional</span></div><div class="cert-publisher"><i class="fas fa-building"></i> AWS</div><div class="cert-meta"><span class="id">SA-PRO-7734</span><span class="status-badge">✓ Biometrik</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#34</span><span class="cert-title">Terraform Associate</span></div><div class="cert-publisher"><i class="fas fa-building"></i> HashiCorp</div><div class="cert-meta"><span class="id">TERRA-7734</span><span class="status-badge">✓ HCP</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#35</span><span class="cert-title">Certified Kubernetes Administrator</span></div><div class="cert-publisher"><i class="fas fa-building"></i> CNCF</div><div class="cert-meta"><span class="id">CKA-7734</span><span class="status-badge">✓ Kluster Peribadi</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#36</span><span class="cert-title">Red Hat Certified Architect</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Red Hat</div><div class="cert-meta"><span class="id">RHCA-7734</span><span class="status-badge">✓ Red Hat Portal</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#37</span><span class="cert-title">Oracle Cloud Infrastructure Architect</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Oracle</div><div class="cert-meta"><span class="id">OCI-ARCH-7734</span><span class="status-badge">✓ MFA</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#38</span><span class="cert-title">VMware VCP-Cloud Management</span></div><div class="cert-publisher"><i class="fas fa-building"></i> VMware</div><div class="cert-meta"><span class="id">VCP-CM-7734</span><span class="status-badge">✓ Kunci Awam</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#39</span><span class="cert-title">GISP (GIS Professional)</span></div><div class="cert-publisher"><i class="fas fa-building"></i> GISCI</div><div class="cert-meta"><span class="id">GISP-7734</span><span class="status-badge">✓ Geopintar</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#40</span><span class="cert-title">Satellite Imagery Analysis for AI</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Esri / Maxar</div><div class="cert-meta"><span class="id">SAT-7734</span><span class="status-badge">✓ ArcGIS+API</span></div></div>
</div>
</div>
<!-- ===== CATEGORY E (41–50) ===== -->
<div class="category-section">
<div class="cat-header"><span class="cat-letter">E</span><h2>Kepimpinan &amp; Strategi Digital</h2><span class="cat-count">10 sijil</span></div>
<div class="cert-grid">
<div class="cert-card"><div class="cert-header"><span class="cert-num">#41</span><span class="cert-title">PMP</span></div><div class="cert-publisher"><i class="fas fa-building"></i> PMI</div><div class="cert-meta"><span class="id">PMP-7734</span><span class="status-badge">✓ PMI Registry</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#42</span><span class="cert-title">ITIL 4 Managing Professional</span></div><div class="cert-publisher"><i class="fas fa-building"></i> AXELOS</div><div class="cert-meta"><span class="id">ITIL4-7734</span><span class="status-badge">✓ AXELOS Portal</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#43</span><span class="cert-title">COBIT 2019 Foundation</span></div><div class="cert-publisher"><i class="fas fa-building"></i> ISACA</div><div class="cert-meta"><span class="id">COBIT-7734</span><span class="status-badge">✓ 2FA</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#44</span><span class="cert-title">CDPSE</span></div><div class="cert-publisher"><i class="fas fa-building"></i> ISACA</div><div class="cert-meta"><span class="id">CDPSE-7734</span><span class="status-badge">✓ Privasi Terenkripsi</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#45</span><span class="cert-title">Digital Transformation Specialist</span></div><div class="cert-publisher"><i class="fas fa-building"></i> IQBBA</div><div class="cert-meta"><span class="id">DTS-7734</span><span class="status-badge">✓ IQBBA</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#46</span><span class="cert-title">AI Governance Professional (AIGP)</span></div><div class="cert-publisher"><i class="fas fa-building"></i> IAPP</div><div class="cert-meta"><span class="id">AIGP-7734</span><span class="status-badge">✓ Digital Signature</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#47</span><span class="cert-title">Quantum Computing Foundations</span></div><div class="cert-publisher"><i class="fas fa-building"></i> IBM/Qiskit</div><div class="cert-meta"><span class="id">QUANTUM-7734</span><span class="status-badge">✓ Qiskit Badge</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#48</span><span class="cert-title">ISO/IEC 27001 Lead Auditor</span></div><div class="cert-publisher"><i class="fas fa-building"></i> PECB</div><div class="cert-meta"><span class="id">ISO27K-7734</span><span class="status-badge">✓ Hash Audit</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#49</span><span class="cert-title">Strategic Intelligence &amp; Analysis</span></div><div class="cert-publisher"><i class="fas fa-building"></i> INSA</div><div class="cert-meta"><span class="id">INTEL-7734</span><span class="status-badge">✓ Keselamatan Berlapis</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#50</span><span class="cert-title">Global Technology Leadership</span></div><div class="cert-publisher"><i class="fas fa-building"></i> MIT Sloan/edX</div><div class="cert-meta"><span class="id">LEAD-7734</span><span class="status-badge">✓ MIT Integriti</span></div></div>
</div>
</div>
<!-- ===== CATEGORY F (51–65) ===== -->
<div class="category-section">
<div class="cat-header"><span class="cat-letter">F</span><h2>Advanced AI &amp; Data Science</h2><span class="cat-count">15 sijil</span></div>
<div class="cert-grid">
<div class="cert-card"><div class="cert-header"><span class="cert-num">#51</span><span class="cert-title">Google Professional Data Engineer</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Google Cloud</div><div class="cert-meta"><span class="id">DE-7734-001</span><span class="status-badge">✓ FIDO2</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#52</span><span class="cert-title">Databricks Certified Data Engineer Pro</span></div><div class="cert-publisher"><i class="fas fa-building"></i> Databricks</div><div class="cert-meta"><span class="id">DE-PRO-7734</span><span class="status-badge">✓ Lakehouse</span></div></div>
<div class="cert-card"><div class="cert-header"><span class="cert-num">#53</span><span class="cert-title">SAS Certified AI &amp; ML Professional</span></div><div class="cert-publisher"><i class="fas fa-building"></i> SAS</div><div class="cert-meta"><span class="id">AIML-7734</span><span class="status-badge">✓ SAS Viya</span></div></di…
@SazwanismailSazwanismail self-assigned this Aug 16, 2026
@SazwanismailSazwanismail added duplicate This issue or pull request already exists Perfect zass Kemenangan Semuanya Untuk Celaka Bewak Media Sosial media Windows hunter Projects personal Win Kemenangan Black setting Laman sendiri gemma Kecerdasan buatan Strategic Kecekapan semulajadi size:XXL This PR changes 1000+ lines, ignoring generated files size:XL This PR changes 500-999 lines, ignoring generated files size:S This PR changes 10-29 lines, ignoring generated files labels Aug 16, 2026
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: b3c1edd

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@codeant-ai

codeant-aiBot commented Aug 16, 2026

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

StatusCommitStarted (UTC)Finished (UTC)
✅ Reviewed your PRb3c1eddAug 16, 2026 · 11:3711:39

@codeant-ai

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-aicodeant-aiBot added size:L This PR changes 100-499 lines, ignoring generated files and removed size:XXL This PR changes 1000+ lines, ignoring generated files size:XL This PR changes 500-999 lines, ignoring generated files size:S This PR changes 10-29 lines, ignoring generated files labels Aug 16, 2026
This was linked to issues Aug 16, 2026
@Sazwanismail
Sazwanismail merged commit bba0c24 into mainAug 16, 2026
2 checks passed
Comment threadDocs.google.com/GitHub Docs
Comment threadDocs.google.com/GitHub Docs
Comment threadDocs.google.com/GitHub Docs
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Black settingLaman sendiriduplicateThis issue or pull request already existsgemmaKecerdasan buatanMediaSosial mediaPerfect zassKemenangan Semuanya Untuk Celaka Bewaksize:LThis PR changes 100-499 lines, ignoring generated filesStrategicKecekapan semulajadiWinKemenanganWindows hunterProjects personal

Projects

Development

Successfully merging this pull request may close these issues.

docs.github.com/codespaces Comments language All language

1 participant

@Sazwanismail