گیتهاب برای راه اندازی 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 = "test" //Act bool result= (myvar == "test"); //Assert Assert.True(result); } }
میبینیم که تستمون که هیچ بیسینسی نداره و پاس میشه .
خب پروژمون رو داخل گیتهاب اضافه میکنیم تا کارمون رو ادامه بدیم.
پروژه ی نمونه رو از این لینک میتونید ببینید.
داخل ریپازیتوری که ساختیم در سایت گیت هاب به تب Action میریم و دات نت رو انتخاب میکنیم.
دقت کنید برای استفاده از این سرویس میتونیم از زبان ها و پلتفرم های مختلف استفاده کنیم ، چون نمونه پروژه ی ما دات نت هست این گزینه رو انتخاب میکنیم.
روی دکمه ی Configure کلیک میکنیم تا گیتهاب نمونه کدی که برای تنظیمات داره رو برای ما بسازه.
همونطور که مشاهده میکنید داخل پوشه ی .github workflows یک فایل با نام dotnet.yml میسازه و کافیه که ما تنظیمات مد نظرمون رو داخل این فایل بنویسیم .
فایل با پسوند yml و برای تنظیماتمون هستش.
برای پروژه ی نمونه از کد زیر استفاده میکنیم.
name: .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 files
uses: 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);
نتیجه میشه
تست من پاس نشد و درنتیجه ورژن من هم پابلیش نشد.
البته دوباره تست رو درست میکنم تا پاس بشه.
امیدوارم این مطلب رو دوست داشته باشید و بدردتون بخوره :) .
نمونه کد این مطلب با روند انجامش رو میتونید از اینجا بگیرید .