2012年10月23日

GitHub - GitHub初體驗

GitHub其實之前就有聽說過了,是非常大的線上版本控制服務,但小弟自己之前都一直使用TFS,所以也沒有好好的來玩玩看GitHub,而這次,因為Windows Azure可以整合GitHub,另外一方面,也考慮到,一些Demo的Code都沒有地方放,所以想說,那就來試試看GitHub吧。

GitHub的文章,其實Google可以找到非常的多,而且小弟也算GitHub的新手,所以就不要誤人子弟XDD,我們這篇就純入門就好,相信想要深入的人,可以找到更多的教學。

小弟也知道,用GitHub或是Git的人,很多都是用MAC,但這篇會以Windows OS為主,所以如果使用MAC的人,可能要讓您失望了,因為這篇講的流程,MAC都不適用。

好的,首先,我們第一步,當然就是去GItHub申請一個帳號,我們可以從GitHub的官網,如下圖的位置開始申請。

image

基本上,申請是不用錢的,但是天底下怎麼可能會有免費的事情!?所以這邊的免費,是有條件的,也就是我們放在GitHub的Code都必須是要公開的;如果想要不公開,就必須付費了…小弟的Code本來就不值錢,所以當然就沒這個困擾,所以就選擇免費的嚕!

image

接下來,我們不需要輸入很多資料,只需要輸入使用者名稱、Email、Password就可以完成註冊,有沒有很方便阿!?

image

註冊完後,他會有一些教學,或是到這裡觀看教學,其實他的教學雖然是英文的,不過也滿簡單的,通常丟到Google翻譯就看得懂了XDDD;因為我們這邊主要是要示範Windows,所以下圖的位置要選擇Windows。

image

其實GitHub非常貼心的幫我們準備了GitHub for Windows這套軟體,讓我們不用再去裝很多東西,就可以方便我們進行管理,甚至比小烏龜還要簡單,而這邊,我們就針對GitHub for Windows這套軟體來做解說;當我們按下Windows按鈕後,我們就可以從下圖的位置下載到GitHub for Windows

image

下載完,安裝完後,我們就可以從桌面發現GitHub的捷徑了,點一下,我們就可以打開軟體。

image

打開後,GitHub for Windows會要求我們做一些設定,並且會幫我們建立SSH的金鑰,未來方便我們連線到GitHub,真的是超佛心又方便的!!首先,我們要在下圖登入我們剛剛申請好的GitHub帳號。

image

然後這邊要設定Git,這邊的Email記得要和GitHub相同,這樣GitHub才能做個繫結,基本上小弟是都Key一樣的使用者名稱和Email…

image

接下來,GitHub for Windows會尋找這台電腦有沒有Repo ( 也就是放版控檔案的目錄 ),因為是第一次,所以當然沒有。

image

接下來,我們要實際新增一個Repo,Repo的全名其實就是Repository,中文翻譯成倉儲,簡單的說,就是放Code或是檔案的地方,我們可以訂一個目錄,而這個目錄裡面的東西就等於是要進行版控的地方。

image

我們可以給新的Repo取一個名稱,甚至是一些註解,當然,最重要的就是要選擇目錄了,而Push to github也記得要打勾,因為我們最後要push到GitHub的 ( 放在Repo的檔案,會先存放在本機 ),Keep this code private就不用勾了,因為要打勾,我們就必須要付錢啦XDD ( 就是私人Repo,可以不公開 )。

image

完成後如下圖,可以發現Repo已經完成了,這時候我們可以快點兩下紅色框框。( 紅色框框是小弟我自己畫上去的… )

image

我們就可以看到,目前裡面有哪些檔案了;這時候,選擇上方的Tools,並選擇open in exploer就可以打開檔案總管來看看實際的目錄內容。( 預設是不會有README,README是小弟後來自己加上去的… )

image

如下,其實就和上圖一樣,而這時候,我們利用記事本,新增一個README的文字檔看看,並且把README.txt的副檔名去掉,變成README。

image

並且在README裡面加上Hello GitHub;至於為什麼要這樣做,等下就會知道了。

image

完成後,我們回到GitHub for Windows,我們就可以利用右邊黃色的區塊,來進行Commit的動作,也就是簽入的動作。

image

完成後,我們可以看到,右邊有簽入完成的資訊,而雖然本地端已經簽入了,但還是要push到GitHub上,所以我們要按下左上方的publish,來丟到GitHub上面。

image

完成後,我們回到GitHub網站,就可以看到我們本機的東西,已經放到GitHub上了,而且下面有個README的框框,裡面也是我們剛剛打上去的資訊;沒錯,其實README的內容,就是用來介紹、說明這個Repo,這個Project的用途,來讓大家知道這個專案是做甚麼用的喔!!

image

到這邊,基本的入門就算結束了,完全沒用到任何一個指令!!非常適合懶人的小弟我,但也不代表指令不重要,有機會,大家還是可以看看指令如何下。

後記

當然,後面還有很多好玩的東西,未來有機會再來介紹介紹,如果大家等不及了,也可以直接去官網看看喔!!

參考網址

2012年10月10日

Windows Azure - 刪除VHD時,產生There is currently a lease on the blob and no lease ID was specified in the request 錯誤

好,前篇介紹了刪除VHD的一些問題,但老實說,還是沒有辦法解決小弟我目前碰到的問題XDD ( 所以上一篇是做爽的… ),但也因為上一篇的經驗,得到了一些啟示,我先來把問題列出來吧。

其實是,昨天在將做VM轉Image的練習,當作完刪除Disk後,準備要刪除Blob裡面的VHD,卻出現這個錯誤

There is currently a lease on the blob and no lease ID was specified in the request

image_thumb[1]

從字面上來解釋,就是這個Blob的ID還在被使用中,所以無法刪除;而這個時候,第一個當然就是會想到VM裡面的Image或是Disk,但是進去看,都是空空的= =… ( 如果Image或是Disk,又或是VM有掛載的話,通常只要移除就可以順利解決問題了,但這邊是很不幸的,完全沒掛載的狀況下…還是不能刪除 )

image_thumb[4]

Disk裡面一樣找不到。

image_thumb[5]

本來想說,這種問題,大概只有官方那邊能解決,正打算用中文信和印度工程師溝通的時候,剛好翻到MSDN有解決的方式,但做完發現,恩,官方的狀況,和我的狀況是不同的XDDD,但還是給了我一盞明燈,沒錯,就還是要使用Windows Azure PowerShell來處理,如果不知道Windows Azure PowerShell的人,或是不知道如何設定的人,可以參考一下上一篇

好,那到底該如何解決這個問題呢?,其實如果管理畫面看不到,那我們就使用Windows Azure Powshell來處理吧!!

其實我們只要下Remove-AzureVMImage –ImageNmae image的名稱 就可以順利刪除了,如下圖;刪除之後,就可以回到Windows Azure管理介面進行刪除Blob的處理了。

image

喔,如果你忘記當初Image的名稱,還可以使用Get-AzureVMImage來取得目前Image的名稱!!

沒錯就是這麼簡單…

後記

其實從這次體會到Windows Azure Powshell的強大,未來有機會再持續研究看看吧!

參考資料

Windows Azure - 錯誤!! 當使用現有的Disk來建立新VM時產生A lease conflict occurred with the blob

其實這篇,是昨天在將做VM轉Image的練習,當作完刪除Disk後,準備要刪除Blob裡面的VHD,卻出現錯誤,後來查了一下MSDN,後來有找到一篇類似的解決方式 (雖然案例和我的狀況完全不同),但感覺滿好玩的,就順便邊做邊翻譯。

根據原文,主要是在寫當,我們要使用VHD來創建不同的VM時,會收到這個錯誤

A lease conflict occurred with the blob <blob url>

當然,一般人應該不會無聊到把一個VHD拿去建立很多個VM,所以根據官方的說法,這個問題是出現在,當合約超過額度,時間等等,而造成系統自動把服務停止;當我們恢復合約( 繼續繳錢 )後,要使用之前的VHD來重建VM,卻建立不起來的情況。

所以官方,就使用了傳說中的命令列模式!! ( 老實說,真不喜歡用… ),也就是使用Windows Azure PowerShell…來處理,根據原文文件指出,可以使用 Lease Blob API 來把契約關連給斷開,至於要怎麼用呢?,就是使用Windows Azure PowerShell來載入Microsoft.WindowsAzure.StorageClient.dll,並使用LeaseAction Enumeration.

神奇吧!?沒錯,我也是覺得很神奇,要不是找到官方這篇文章XDD,誰知道可以這樣搞呢~~

開始!!

我們先要下載Windows Azure管理工具,因為小弟是Windows環境,就使用Windows的管理工具。

image

接下來,安裝程式會呼叫Web Platform Installer 4.0,當然,也沒甚麼好猶豫的…反正也只能安裝了= =…

image

安裝完後,就可以找到Windows Azure PowerShell。( 找不到的人,可以利用搜尋功能,搜尋Windows Azure PowerShell,通常裝完後,就可以從開始那邊找到。 ),另外,記得用administrator權限開啟!!

image

接下來,在管理工具裡面輸入Get-AzurePublishSettingsFile,他就會自動地開啟瀏覽器,並且提供publishsetting檔案給我們下載,我們當然就是下載啦!!( 建議存到預設的下載目錄,這樣等下就不需要再打路徑了。 )

image

那剛剛下載的Publishsetting是做甚麼的呢,當然就是給Windows Azure PowerShell用的,如果沒有這個檔案,Windows Azure PowerShell自然就沒有權限…,所以下一步,我們要把這個檔案給Windows Azure PowerShell來使用;我們要在Windows Azure PowerShell裡面下這個指令Import-AzurePublishSettingsfile $env:userprofile\downloads\*.publishsettings 很簡單吧!!所以剛剛才建議大家直接丟到下載目錄,這樣這時候就可以直接複製上面那個指令到Windows Azure PowserShell裡面了,如果不是放到下載目錄,而是放在其他目錄,則後面的路徑,就要記得自己改喔!!

image

接下來,我們要把下面這烙烙長的程式碼貼到記事本上面去!! ( 就不要問小弟我內容了= =|| ),並且取名為BreakLease.ps1 ( 副檔名是ps1阿!不是txt喔,所以要用另存新檔的方式喔!! )

Param([string]$Uri = $(Read-Host -prompt "Please specify a blob URL"))

$ProgressPreference = 'SilentlyContinue'


echo "Processing $Uri"

echo "Reading storage account information..."
$acct = Get-AzureStorageAccount | ? { (new-object System.Uri($_.Endpoints[0])).Host -eq (new-object System.Uri($Uri)).Host }
if(-not $acct) {
    write-host "The supplied URL does not appear to correspond to a storage account associated with the current subscription." -foregroundcolor "red"
    break
}

$acctKey = Get-AzureStorageKey ($acct.StorageAccountName)
$creds = "DefaultEndpointsProtocol=http;AccountName=$($acctKey.StorageAccountName);AccountKey=$($acctKey.Primary)"
$acctobj = [Microsoft.WindowsAzure.CloudStorageAccount]::Parse($creds)
$uri = $acctobj.Credentials.TransformUri($uri)
echo "Confirmed - storage account '$($acct.StorageAccountName)'."


$blobclient = New-Object Microsoft.WindowsAzure.StorageClient.CloudBlobClient($acctobj.BlobEndpoint, $acctobj.Credentials)
$blobclient.Timeout = (New-TimeSpan -Minutes 1)
$blob = New-Object Microsoft.WindowsAzure.StorageClient.CloudPageBlob($uri, $blobclient)


echo "Checking whether the blob is currently registered as a disk or image..."
$disk = Get-AzureDisk | ? { (new-object System.Uri($_.MediaLink)) -eq $blob.Uri }
if($disk) {
    write-host "The blob is still registered as a disk with name '$($disk.DiskName)'.  Please delete the disk first." -foregroundcolor "red"
    break
}
$image = Get-AzureVMImage | ? { $_.MediaLink -eq $blob.Uri.AbsoluteUri }
if($image) {
    write-host "The blob is still registered as an OS image with name '$($image.ImageName)'.  Please delete the OS image first." -foregroundcolor "red"
    break
}
echo "Confirmed - the blob is not in use by the Windows Azure platform."




echo "Inspecting the blob's lease status..."
try {
    $blob.FetchAttributes()
} catch [System.Management.Automation.MethodInvocationException] {
    write-host $_.Exception.InnerException.Message -foregroundcolor "red"
    break
}

echo "Current lease status: $($blob.Properties.LeaseStatus)"

if($blob.Properties.LeaseStatus -ne [Microsoft.WindowsAzure.StorageClient.LeaseStatus]::Locked) {
    write-host "Success - the blob is unlocked." -foregroundcolor "green"
    break
}



echo "Unlocking the blob..."
$request = [Microsoft.WindowsAzure.StorageClient.Protocol.BlobRequest]::Lease($uri, 0, [Microsoft.WindowsAzure.StorageClient.Protocol.LeaseAction]::Break, $null)
$request.Timeout = $blobclient.Timeout.TotalMilliseconds
$acctobj.Credentials.SignRequest($request)
try {
    $response = $request.GetResponse()
    $response.Close()
}
catch {
    write-host "The blob could not be unlocked:" -foregroundcolor "red"
    write-host $_.Exception.InnerException.Message -foregroundcolor "red"
    break
}

$blob.FetchAttributes()
echo "Current lease status: $($blob.Properties.LeaseStatus)"

write-host "Success - the blob is unlocked." -foregroundcolor "green"

如下圖,存完後的檔案。

image

接下來,因為要執行的shell,會牽涉到安全性,所以我們要先把Windows Azure PowserShell的安全性原則解除,輸入Set-ExecutionPolicy unrestricted,然後按下Y。

image

接下來,我們就要Run剛剛建立的Shell之後,就會要求我們填入一些資訊,第一個要填的是Blob的URL,我們可以回到Windows Azure的管理介面,Blob那邊找到 ( 也就是要刪除的那頁 ),我們把URL全部框起來,利用左鍵,並按下複製,其實就可以將全部的URL複製下來了喔!!如下圖,貼上去就可以了。

image

然後根據官方文件,就會吐出這些東西。

BreakLease.ps1 -Uri 'http://clstorage.blob.core.windows.net/vhds/testvm1-testvm1-2012-06-26.vhd'
Processing http://clstorage.blob.core.windows.net/vhds/testvm1-testvm1-2012-06-26.vhd
Reading storage account information...
Confirmed - storage account 'clstorage'.
Checking whether the blob is currently registered as a disk or image...
Confirmed - the blob is not in use by the Windows Azure platform.
Inspecting the blob's lease status...
Current lease status: Locked
Unlocking the blob...
Current lease status: Unlocked
Success - the blob is unlocked.

到這邊,就算完成了!!

後記

而官方也提供了另外一個方法,是利用CloudXplorer工具,利用此工具的Rename功能來複製VHD ( 沒錯,就是Rename功能- -.. ),然後再用新的VHD來建立Disk;其實這個方法也滿簡單的,至於要用哪個做法就看看官如何選擇啦~~

參考網址

2012年10月9日

Windows Azure - 刪除Windows Azure上的VM (10月新功能)

上一篇,我們提到了刪除Virtual Machine後續還要處理一堆事情,相信微軟也聽到了大家的心聲,所以在10月的新功能裡面,可以讓我們快速刪除;而這篇的誕生,也是為了怕大家以為,刪除Virtual Machine都要那麼麻煩,所以多附上這篇,如果想要清楚知道整個Virtual Machine的刪除過程,也可以重新參考上一篇

如果有讀過上一篇,那應該會很清楚,刪除完Virtual Machine後,其實Disk也還在,Storage也還在,如果依照以前的方法,就會要處理很多步驟,而這次Microsoft的更新,多了一個選項給我們;一個是Delete Assoclated VHD,另一個是Retain Assoclated VHD。

image

如果選擇Delete Assoclated VHD,就不用進行麻煩的Blob刪除,他會全部刪除光光.( 但是Cloud Service還是要自己手動 ),如下圖,就找不到剛剛建立的VHD。

image

但如果選擇Retain Assoclated VHD,就會把VHD給保留在Blob裡面,如下圖,deletest2的VHD就被保留下來了,所以如果不想全部刪掉的人,可以用這個方式留下來。

image

後記

基本上就這樣,這是新版的貼心小改變,也提供給需要的人。