# GitHub Actions for .Net Framework
###### tags: `GitHub` `GitHubActions` `CICD` `.NetFramework` `Azure` `yml`
用 GitHub Actions 將 .Net Framework web 自動部署至 Azure。
當時主要參考Calvin A. Allen的兩篇文章
>[Building .NET Framework Applications with Github Actions](https://www.codingwithcalvin.net/building-net-framework-applications-with-github-actions/)
>[Git Tag Based Released Process Using GitHub Actions](https://www.codingwithcalvin.net/git-tag-based-released-process-using-github-actions/)
yml建置部署流程檔建立可由GitHub網站建立,或自行新增檔案。
## 由GitHub網站建立
直接至Repository後,上方點選Actions,可以看到有多個範本樣板

但找不到 .Net Framework的...
沒關係,可以直接選底下的範本讓他自動建立需要的檔案(這邊我選"Deploy Node.js to Azure Web"),並直接在網頁上編輯。
他會在Repo下建立`.github/workflows`資料夾(如果沒有的話)裡面放yml檔。
:::warning
要注意這邊還沒真的新增,需要Commit後才會真的加入Repository
:::

這個yml檔就是列著我們要自動建置部署等等的步驟(Tasks)。所需相關步驟也是由右側Marketplace搜尋取得參數設定。
## 自行建立檔案
從上其實可以知道只要自行在你的Repository下新增`.github/workflows`資料夾,資料夾內新增yml檔就可以了。只是要知道個steps使用的參數。
## yml內容
先給完整的yml檔內容,以及可以參考的[GitHub Actions相關指令](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions)
```yml
name: Azure CI
on:
push:
tags: release/[1-9]+.[0-9]+.[0-9]+
env:
AZURE_WEBAPP_NAME: appname
AZURE_WEBAPP_PACKAGE_PATH: './_build'
jobs:
build-and-deploy-azure:
runs-on: [windows-latest]
steps:
- uses: actions/checkout@v2
- name: Setup MSbuild
uses: microsoft/setup-msbuild@v1.0.1
- name: Setup NuGet
uses: NuGet/setup-nuget@v1.0.2
- name: Restore NuGet Packages
run: nuget restore YourSolution.sln
- name: Build the Solution
run: msbuild YourSolution.sln /p:DeployOnBuild=true /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:platform="Any CPU" /p:configuration="Release" /p:PublishUrl=.${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
- name: Upload Artifact
uses: actions/upload-artifact@v2.1.4
with:
name: AzureDepBundle
path: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
- name: Login to Azure
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Publish Artifacts to Azure
uses: Azure/webapps-deploy@v2
with:
app-name: ${{ env.AZURE_WEBAPP_NAME }}
package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
slot-name: production
```
第一部分是這個workflow的名稱。
```yml
name: Azure CI
```
之後會在Actions workflows顯示的名稱。

第二部分是觸發條件,這邊我是以特定tag名稱為觸發條件,也就是當我git push像是`release/1.2.0`的tag時就會觸發這個workflow。
```yml
on:
push:
tags: release/[1-9]+.[0-9]+.[0-9]+
```
也可以單純的以branch為觸發條件。
```yml
on:
push:
branches: master
```
第三部分是以`map`的形式設定參數,這邊主要是給後面jobs和steps使用。
```yml
env:
AZURE_WEBAPP_NAME: appname
AZURE_WEBAPP_PACKAGE_PATH: './_build'
```
第四部分可以設定多組jobs,預設為同時執行,這邊我只有一個job,job_id叫做`build-and-deploy-azure`(可以自行命名),並指定執行在最新版windows虛擬機上(GitHub-hosted),另外也有self-hosted但就沒有研究了。
接下來就是要做的steps。
```yml
jobs:
build-and-deploy-azure:
runs-on: [windows-latest]
steps:
- uses: actions/checkout@v2
```
因為是 .Net Framework 所以需要MSBuild和NuGet。
```yml
- name: Setup MSbuild
uses: microsoft/setup-msbuild@v1.0.1
- name: Setup NuGet
uses: NuGet/setup-nuget@v1.0.2
```
再來還原NuGet packages與建置專案。
```yml
- name: Restore NuGet Packages
run: nuget restore YourSolution.sln
- name: Build the Solution
run: msbuild YourSolution.sln /p:DeployOnBuild=true /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:platform="Any CPU" /p:configuration="Release" /p:PublishUrl=.${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
```
這邊建置專案指定了一些參數,其中`/p:PublishUrl=.${{ env.AZURE_WEBAPP_PACKAGE_PATH }}`指定建置後在虛擬機上放的路徑,也就是上面設定的`./_build`
再來將建置好的檔案(Artifact)從路徑`./_build`上傳,取名`AzureDepBundle`。
```yml
- name: Upload Artifact
uses: actions/upload-artifact@v2.1.4
with:
name: AzureDepBundle
path: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
```
這是選擇性,上傳會在GitHub上Build的那次紀錄存著一份。

接著是登入Azure並上傳。
```yml
- name: Login to Azure
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Publish Artifacts to Azure
uses: Azure/webapps-deploy@v2
with:
app-name: ${{ env.AZURE_WEBAPP_NAME }}
package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
slot-name: production
```
`secrets.AZURE_CREDENTIALS`是在Settings -> Secrets內設定,`AZURE_CREDENTIALS` 是我自訂的名稱,可以自行更換。
secrets內容請參考 https://github.com/Azure/actions/ 或 https://github.com/Azure/login 產生,應為json形式資料。

app-name部分對應到Azure上App Service名稱。
以上檔案commite後就完成拉~