CI / CD ساده با GitHub در دات نت

گیت‌هاب برای راه اندازی CI/CD از GitHub Actions استفاده می کند که می توانید مستندات آن را در اینجا مشاهده کنید و به صورت کامل با آن آشنا شوید. در اینجا با یک مثال با مراحل راه‌اندازی CI/CD به وسیله GitHub آشنا می شویم.خب ابتدا باید یک پروژه داشته باشیم تا بتونیم کارمون رو شروع کنیم.یه پروژه نمونه میسازیم ، از اونجا که خودم دات نت کار هستم پروژه ی نمونه رو با دات نت کور میسازم و و صد البته یک تست هم می‌نوسیم که بتونیم تو روند CI / CD تست رو هم اجرا کنیم . در واقع بنظرم بدون تست ، روند CI CD ارزش خودش رو نشون نمیده ، باید تست های ما با موفقیت پاس بشن تا مطمئن باشیم که ورژنی که میخوایم پابلیش کنیم درست کار میکنه و مشکلی نداره.پروژه ی نمونه رو ساختیم و یک تست نمونه هم گذاشتیم تا روند کار را ببینیم.یک پروژه ساده و یک تست سادهچون قصدمون اینه که روند CI CD رو ببینیم تستمون هم ساده مینیویسیم . public class SampleTest { [Fact] public void Just_For_Run_Sample_Test() { // Arrange var myvar = &quottest&quot //Act bool result= (myvar == &quottest&quot); //Assert Assert.True(result); } }میبینیم که تستمون که هیچ بیسینسی نداره و پاس میشه .خب پروژمون رو داخل گیت‌هاب اضافه میکنیم تا کارمون رو ادامه بدیم.پروژه ی نمونه رو از این لینک می‌تونید ببینید.داخل ریپازیتوری که ساختیم در سایت گیت هاب به تب Action میریم و دات نت رو انتخاب می‌کنیم.دقت کنید برای استفاده از این سرویس می‌تونیم از زبان ها و پلتفرم های مختلف استفاده کنیم ، چون نمونه پروژه ی ما دات نت هست این گزینه رو انتخاب می‌کنیم.روی دکمه ی Configure کلیک میکنیم تا گیتهاب نمونه کدی که برای تنظیمات داره رو برای ما بسازه. همونطور که مشاهده میکنید داخل پوشه ی .github workflows یک فایل با نام dotnet.yml می‌سازه و کافیه که ما تنظیمات مد نظرمون رو داخل این فایل بنویسیم .فایل با پسوند yml و برای تنظیماتمون هستش.برای پروژه ی نمونه از کد زیر استفاده می‌کنیم..github/workflows/dotnet.ymlname: .NET on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build-test-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: ? Setup .NET uses: actions/setup-dotnet@v2 with: dotnet-version: 6.0.x - name: ? Restore dependencies run: dotnet restore - name: ? Build run: dotnet build --no-restore - name: ? Test run: dotnet test --no-build --verbosity normal - name: ? Sync files uses: SamKirkland/FTP-Deploy-Action@4.3.0 with: server: ${{ secrets.ftp_server }} username: ${{ secrets.ftp_user }} password: ${{ secrets.ftp_password }}ابتدای فایل همونطور که مشخصه ‌، گفتیم که عملیات در چه اکشن هایی انجام بشهon: push: branches: [ master ]وقتی پوش کردیم روی برنچ مستر عملیات شروع میشهدر ادامه یک جاب ساختیم و بهش نام build-test-deploy رو دادیم که منظورمون اینه که در این جاب چه عملیات هایی انجام میشهjobs: build-test-deploy: و مهم ترین قسمت مراحل کارمون یا همون step هامون هستش که به نوبت اجرا میشه و مراحل زیر رو داریم:? Setup .NETبه گیت‌هاب میگیم که پروژمون رو چه کدی هست و ورژن اون چیهuses: actions/setup-dotnet@v2 with: dotnet-version: 6.0.x? Restore dependenciesکه پکیج هایی که داخل پروژه هستند رو میگیره run: dotnet restore? Buildپروژه رو بیلد میکنه ( اگر در همین مرحله خطایی باشه کار متوقف میشه و ادامه پیدا نمیکنه )run: dotnet build --no-restore? Testتست هامون رو اجرا میکنه ( قسمت مهم کار که تست های خودکاری که نوشتیم باید پاس بشه تا روند ادامه پیدا کنه )run: dotnet test --no-build --verbosity normalو در آخر ? Sync filesuses: SamKirkland/FTP-Deploy-Action@4.3.0 with: server: ${{ secrets.ftp_server }} username: ${{ secrets.ftp_user }} password: ${{ secrets.ftp_password }}که در صورت پاس شدن تمام مراحل فایل هامون رو به آدرس FTP که بهش دادیم منتقل میشه.تظیمات FTP رو توسط secret تعریف کردیم تا بتونیم استفاده کنیم ولی دیده نشن.منظورمون از ${{ secrets.ftp_password }} اینه که گیت هاب این مقدار رو از داخل secret هایی که براش تعریف کردیم بخونه.برای تعریف secret به قسمت Settings > Secrets > Actions رفته و روی New repository secret میزنیم سپس نام متغیر خود به عنوان مثال ftp_password وارد کرده و مقدار آن را نیز وارد میکنیم و در کد تنظیماتمون به این شکل میتوان مقدار آن را برگردونیم${{ secrets.ftp_password }}با این کار مقادیر ما خوانده میشود ولی به هیچ عنوان قابل دسترس و دیده شدن نیستند.اگر گیت‌هاب تو هریک از مراحل به مشکلی بر بخوره روند متوقف میشه و ادامه پیدا نمیکنه.در آخر پروژه ما پابلیش میشه.خب فایل رو کامیت میکنیم و خودکار پوش میشه .فایل در آدرس .github/workflows/dotnet.yml اضافه میشه و اینکه حتما یادمون باشه مقادیر ftp_server ftp_user ftp_password رو حتما تو قسمت Settings > Secrets > Actions بسازیم و تعریف کنیم. میریم که پوش کنیم و ببینیم چه اتفاقی میافته . :)خب اولین پوش رو انجام دادیم و GitHub Actions کارش رو شروع میکنهبه تب Action میریم و میبینیم که به خطا خوردیمبا کلیک و مشاهده مشاهده جزییات خطا رو می‌تونیم ببینیمتو قسمت ? Sync files که برای انتقال فایل ها به FTP هستش به خطایError: Error: Input required and not supplied: serverخوردیم و بخاطر اینه که secret رو برای server تعریف نکردیم و مقدار ندادیم.همونطور که میبینید گیت‌هاب تمام مراحل رو نشون میده با جزییات و لاگ که می‌تونید لاگ اونها با کلیک روی هر مرحله ببینید.در ضمن ایمیلی هم براتون ارسال میشه و اطلاع میده که به خطا خوردیم.برای رفع مشکل secret ها رو تعریف میکنیم و دوباره اجرا می‌کنیم.دقت کنید برای اجرای مجدد هم می‌تونید یک پوش انجام بدین و هم اینکه داخل اکشن ها دوباره دکمه ی اجرای مجدد رو بزنید.ما یه پوش ساده میزنیم داخل خود پروژه تا نتیجه رو ببینیمبعله :) می‌بینیم که اکشن با موفقیت اجرا شد و ورژن ما پابلیش شد ، اونم فقط با یه پوش ساده.از این به بعد کافیه که فقط تغییراتمون رو پوش کنیم تا ورژن ما روی سرور بره ، به همین راحتی.اما در نظر داشته باشید که هرکدوم از مراحل انجام نشه ، ورژن ما هم نمیره ، مثلا تست های ما پاس نشن ، برای مثال نتیجه ی تست رو من false پاس میدم ( یه ! کنارش میزارم ) و پوش میکنم تا نتیجه رو ببینیم.Assert.True( ! result); نتیجه میشهتست من پاس نشد و درنتیجه ورژن من هم پابلیش نشد.البته دوباره تست رو درست میکنم تا پاس بشه.امیدوارم این مطلب رو دوست داشته باشید و بدردتون بخوره :) .نمونه کد این مطلب با روند انجامش رو می‌تونید از اینجا بگیرید .