azure関数githubからパイプラインをスラックする


このポストでは、私はどのようにAzure関数でスラックスパイプラインにgithubを実装する方法を今日表示されます
我々は、Azure関数の基礎をカバーし、私たちのGithubリポジトリに変更をコミットするときにスラックチャネルにメッセージを送信する関数を実装します.
また、我々のAzure機能とスラックに送るためにWebhookにメッセージを受け取るために、webhooksを利用しています.
また、YouTubeでステップビデオでフルステップを見ることができます:
私たちが今日カバーするトピックのいくつかは以下の通りです.
我々が始める前に、Azure機能であることをカバーしましょう.Azure関数は、クラウド内の小さなプログラムや関数を実行する簡単な方法を提供するServerlessなアプリケーションプラットフォームです.それはサービスプラットホームとして(FAAS)機能と呼ばれることができました.
それで、ServerlessなWordが何を意味するかは、典型的なホスティングシナリオでは、我々のアプリケーションをホストするサーバウィンドウまたはLinuxを持っているでしょう.そして、私たちはそのサーバーとそのリソースを管理する責任があります.Serverlessでは、クラウドにこのタスクを委任していますが、サーバとその設定については気にしません.また、Azureが私たちの場合にはクラウドプロバイダとして機能します.我々がする必要があるすべては、我々のコードをアップロードして、それをthatsすることです
Serverlessなアプリケーションを実行する利点のいくつか
の我々のアプリケーションの自動スケーリング
  • 柔軟な支払いは、私たちは、そのランニング
  • それは異なったタイプのコーディング言語C
    Azure入口またはCLI
  • によって管理される

  • 我々が開発に飛び込む前に、我々はAzure口座を持っていなければなりません、登録プロセスはまっすぐです.あなたはクレジットカードを提供する必要がありますが、我々が使用しているすべてのサービスは無料です.
    同様に我々は無料ですgithubアカウントを持っている必要があります.
    また、無料ですスラックアカウントが必要になります.
    私たちが始める前に、私たちはazure関数を使用するために必要なツールをダウンロードする必要があります、マイクロソフトDocumentation https://azure.microsoft.comに移動します.そして私はMac上で私はAzure関数CLIをインストールするためにHomebrewを使用しているので、我々はAzure関数の使用されたV 3に焦点を当てます
    brew tap azure/functions
    brew install azure-functions-core-tools@3
    # if upgrading on a machine that has 2.x installed
    brew link --overwrite azure-functions-core-tools@3
    
    次に、Visual Studioのコードに拡張子をインストールします.
    さあ、コードにジャンプする前に行う必要のあるスラックの設定をしましょう.
    スラックをオープンし、スラックコールの内側にチャネルを作成します
    一旦チャンネルが作成されるならば、我々は「アプリを加えてください」の上でクリックする必要があります
    Webhookのインストールを完了すると、Webhook URLを取得します.
    https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=macos%2Ccsharp%2Cbash
    次のステップはすべてが正常に動作しているかどうかをテストすることです.リクエストはポストである必要があり、リクエストの本文は次のようになります.
    {
        "text" : "Hi from postman"
    }
    
    すぐに我々のazureポータルを開けましょう
  • 新しいリソース
  • を作成します
    機能アプリの
  • 検索
    リスト
  • からの
  • 選択機能アプリ
  • をクリックして作成
    今、我々は我々が我々の機能アプリを構成するために記入する必要があるフォームを持っている
  • 私のためにあなたが
  • に行くように、それが支払われる購読を選んでください
    資源グループのための
  • は一度新しいものをつくります、それで、あなたがどんな料金をアンコールしないように、それは終わりで簡単に削除されます
  • 私は私たちのアプリケーションの名前を追加します
  • 実行時スタックを選択します.ネットコア
  • 地域Iは、英国南部
  • を選びます
  • は、次の「ホスティング」
  • をクリックします
  • 私たちは
  • であるように保管口座を残します
  • オペレーティングシステム「Windows」
  • 計画「消費」
  • の監視をクリック
  • は、
  • であるように、すべてを残します
  • タグをクリックして、我々は
  • に何かを変更する必要はありません
  • レビューをクリックして作成し、作成し、クリックする
  • 機能を作成すると、その仕上げが新しく作成されたリソースに移動し、すべてがそこにあるかどうかを確認すると、数分かかるでしょう.
    今すぐ私たちの端末にジャンプすることができます
    我々のCLIを使用している我々のHTTP機能を我々の端末の中につくりましょう
    func init YoutubeProject
    
    私たちは1を押すことによってdotnetを選択します
    func new 
    
    HttpLegel 2を選択し、名前をGithubslackPipeline
    さて、VSコードでコードを開き、以下の関数を更新します.すべてのコードは、すべての行の上のコメントで説明します.スラックに接続する責任がある新しい機能を追加します
    // Slack hook
    public static async Task<string> SendSlackMessage(string message)
    {
        // Update this webhook to your own one
        var slackWebhookUrl = "https://hooks.slack.com/services/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";
    
        // Using the using will automatically call the garbage collector and clean 
        using(var client  = new HttpClient())
        {
            // Building the Json body
            var jsonBody = "{'text': '" + message + "'}";
            var data = new StringContent(jsonBody, Encoding.UTF8, "application/json");
    
            var response = await client.PostAsync(slackWebhookUrl, data);
    
            var result = await response.Content.ReadAsStringAsync();
    
            return result;
        }
    }
    
    次のことは、我々の主な機能でこの機能に呼び出しを加えることです
    await SendSlackMessage("Test from az func");
    
    今すぐアプリケーションを実行し、ローカルでテストすることができますし、その作業
    func start --build
    
    Funcのスタートが完了した後、我々はURLが私たちのために作成されていることがわかります、これは私たちのWebブラウザには、このURLをコピーすることができますテストの文字列の名前を与える必要があることをテストする必要がありますので、デフォルトの動作thatsは、ボックスのテンプレートは、この後に削除されるテンプレートによって生成されます.
     // http://localhost:7071/api/slackhook?name=mohamad
    
    一旦ブラウザで実行すると、スラックでメッセージが得られます.
    Azureに配備し、ライブ環境から実行できるかどうかを確認します.VSコードを使用して、azure関数と呼ばれる拡張モジュールをインストールします.
    https://hooks.slack.com/services/xxxxxxx/xxxxxxxxx/xxxxx1iaQ4S2KvBbGdB
    それから、そのアイコンをクリックし、トップにアップロードボタンをクリックします

    アジュール関数拡張

    アップロードボタン
    一度アップロードをクリックするとウィザードが機能をアップロードします.
    その後、azureポータルに移動します⇒ 資源⇒ Youtube ⇒ アジュール関数⇒ プロジェクト⇒ 関数⇒ パイプライン

    そして、このURLをブラウザにコピーし、名前でテストします.

    今、我々はスラックをチェックすることができます、我々は我々がメッセージを得ているのを見ることができます.
    私たちの機能の中で私たちのスラック部分が構成され、完成されたので、私たちがしている最初のことはプッシュのWebHookドキュメントを見ていて、送られているオブジェクトをwhatsに見ることです.
    このリンクに行くことができます:https://xxxxxxxxxx.azurewebsites.net/api/slackhook?code=xxxxxxxxxxxxxxx//xxxxxx/8Emn/AAQ==?name=mohamad、我々はこのウェッフックが生産するペイロードをチェックすることができます.
    私たちがJSONペイロードを見ることができるように、それをCの角に変換して、私たちの関数に加えることができます、変換をするために、我々はサービスを使用しています.
    我々はボックスにJSONを貼り付け、提出をクリックし、秒以内に私たちの呼び出しを取得します.結果は複数のクラスで構成されていることがわかる.このクラスをコピーして、解決策に加えましょう.モデルと呼ばれるフォルダを作成し、内部でGithubhook
    public class Owner
        {
            public string name { get; set; }
            public string email { get; set; }
            public string login { get; set; }
            public int id { get; set; }
            public string node_id { get; set; }
            public string avatar_url { get; set; }
            public string gravatar_id { get; set; }
            public string url { get; set; }
            public string html_url { get; set; }
            public string followers_url { get; set; }
            public string following_url { get; set; }
            public string gists_url { get; set; }
            public string starred_url { get; set; }
            public string subscriptions_url { get; set; }
            public string organizations_url { get; set; }
            public string repos_url { get; set; }
            public string events_url { get; set; }
            public string received_events_url { get; set; }
            public string type { get; set; }
            public bool site_admin { get; set; }
        }
    
        public class License
        {
            public string key { get; set; }
            public string name { get; set; }
            public string spdx_id { get; set; }
            public string url { get; set; }
            public string node_id { get; set; }
        }
    
        public class Repository
        {
            public int id { get; set; }
            public string node_id { get; set; }
            public string name { get; set; }
            public string full_name { get; set; }
            //public bool private { get; set; }
            public Owner owner { get; set; }
            public string html_url { get; set; }
            public string description { get; set; }
            public bool fork { get; set; }
            public string url { get; set; }
            public string forks_url { get; set; }
            public string keys_url { get; set; }
            public string collaborators_url { get; set; }
            public string teams_url { get; set; }
            public string hooks_url { get; set; }
            public string issue_events_url { get; set; }
            public string events_url { get; set; }
            public string assignees_url { get; set; }
            public string branches_url { get; set; }
            public string tags_url { get; set; }
            public string blobs_url { get; set; }
            public string git_tags_url { get; set; }
            public string git_refs_url { get; set; }
            public string trees_url { get; set; }
            public string statuses_url { get; set; }
            public string languages_url { get; set; }
            public string stargazers_url { get; set; }
            public string contributors_url { get; set; }
            public string subscribers_url { get; set; }
            public string subscription_url { get; set; }
            public string commits_url { get; set; }
            public string git_commits_url { get; set; }
            public string comments_url { get; set; }
            public string issue_comment_url { get; set; }
            public string contents_url { get; set; }
            public string compare_url { get; set; }
            public string merges_url { get; set; }
            public string archive_url { get; set; }
            public string downloads_url { get; set; }
            public string issues_url { get; set; }
            public string pulls_url { get; set; }
            public string milestones_url { get; set; }
            public string notifications_url { get; set; }
            public string labels_url { get; set; }
            public string releases_url { get; set; }
            public string deployments_url { get; set; }
            public int created_at { get; set; }
            public DateTime updated_at { get; set; }
            public int pushed_at { get; set; }
            public string git_url { get; set; }
            public string ssh_url { get; set; }
            public string clone_url { get; set; }
            public string svn_url { get; set; }
            public object homepage { get; set; }
            public int size { get; set; }
            public int stargazers_count { get; set; }
            public int watchers_count { get; set; }
            public string language { get; set; }
            public bool has_issues { get; set; }
            public bool has_projects { get; set; }
            public bool has_downloads { get; set; }
            public bool has_wiki { get; set; }
            public bool has_pages { get; set; }
            public int forks_count { get; set; }
            public object mirror_url { get; set; }
            public bool archived { get; set; }
            public bool disabled { get; set; }
            public int open_issues_count { get; set; }
            public License license { get; set; }
            public int forks { get; set; }
            public int open_issues { get; set; }
            public int watchers { get; set; }
            public string default_branch { get; set; }
            public int stargazers { get; set; }
            public string master_branch { get; set; }
        }
    
        public class Pusher
        {
            public string name { get; set; }
            public string email { get; set; }
        }
    
        public class Sender
        {
            public string login { get; set; }
            public int id { get; set; }
            public string node_id { get; set; }
            public string avatar_url { get; set; }
            public string gravatar_id { get; set; }
            public string url { get; set; }
            public string html_url { get; set; }
            public string followers_url { get; set; }
            public string following_url { get; set; }
            public string gists_url { get; set; }
            public string starred_url { get; set; }
            public string subscriptions_url { get; set; }
            public string organizations_url { get; set; }
            public string repos_url { get; set; }
            public string events_url { get; set; }
            public string received_events_url { get; set; }
            public string type { get; set; }
            public bool site_admin { get; set; }
        }
    
        public class Author
        {
            public string name { get; set; }
            public string email { get; set; }
            public string username { get; set; }
        }
    
        public class Committer
        {
            public string name { get; set; }
            public string email { get; set; }
            public string username { get; set; }
        }
    
        public class Commit
        {
            public string id { get; set; }
            public string tree_id { get; set; }
            public bool distinct { get; set; }
            public string message { get; set; }
            public DateTime timestamp { get; set; }
            public string url { get; set; }
            public Author author { get; set; }
            public Committer committer { get; set; }
            public IList<string> added { get; set; }
            public IList<object> removed { get; set; }
            public IList<string> modified { get; set; }
        }
    
        public class HeadCommit
        {
            public string id { get; set; }
            public string tree_id { get; set; }
            public bool distinct { get; set; }
            public string message { get; set; }
            public DateTime timestamp { get; set; }
            public string url { get; set; }
            //public  author { get; set; }
            //public  committer { get; set; }
            public IList<string> added { get; set; }
            public IList<object> removed { get; set; }
            public IList<string> modified { get; set; }
        }
    
        public class GithubHook
        {
            //public string ref { get; set; }
            public string before { get; set; }
            public string after { get; set; }
            public Repository repository { get; set; }
            public Pusher pusher { get; set; }
            public Sender sender { get; set; }
            public bool created { get; set; }
            public bool deleted { get; set; }
            public bool forced { get; set; }
            public object base_ref { get; set; }
            public string compare { get; set; }
            public IList<Commit> commits { get; set; }
            public HeadCommit head_commit { get; set; }
        }
    
    それで、我々がGitTub Webhookに我々のために我々が倉庫を持っている必要があるならば、我々がそれに移動するならば、我々は行く必要があります
    リポジトリの選択⇒ 設定⇒ 網掛け⇒ webhookを加える
    以下の設定を追加する必要があります
  • Aquure関数URLを取得し、ペイロードURL
  • にそれを渡します
  • コンテンツタイプ
  • のアプリケーション/JSONを選択します
    をクリックしてウェブフック次に、ペイロードを使用するAzure関数を更新する必要があります.
    public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
                ILogger log)
    {
        log.LogInformation("Github-Slack pipeline has been initiated.");
    
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        var data = JsonConvert.DeserializeObject<GithubHook>(requestBody);
    
        var msg= $"New commit has been pushed. Id: {data.commits[0].id} Message: {data.commits[0].message}";
    
        // Trigger the Slack webhook
        await SendSlackMessage(msg);
    
        string commitList = "";
    
        foreach(var commit in data?.commits)
        {
            commitList += $"Commit Id: {commit.id} \n";
        }
    
        string responseMessage = $"Hello, these commits {commitList} has been pushed.";
        log.LogInformation("Github-Slack pipeline has been complete successfully.");
    
        return new OkObjectResult(responseMessage);
    }
    

    https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#push 注意:


    Azure関数は、Azure関数アプリケーションに置かれます.ここでは、複数の関数を相互に隣接して実行できます
    だから、どのような関数トリガされます:基本的には、そこにトリガの多くの種類が、我々はトリガの2種類に焦点を当てされますて
  • HTTPトリガ⇒ ウェブフックまたはAzure関数
  • を使用してREST APIを作成します
    HTTPATHを使用するとき、Azure関数は以下をカスタマイズできます
  • HTTPメソッドはGET/POST
  • に対応しますか
  • ルートは、我々は
  • に対応するために機能したい
  • 認証キーを使用したセキュリティレベルは、これらのキーに対して3つのレベルがあります.
  • 匿名:キーは、
  • を提供しません
  • 機能レベル:あらゆる呼び出しは、この機能
  • に特有のキーを持たなければなりません
  • 管理者レベル:キーは、我々の機能アプリ
  • の中でどんな機能ででも働くことができます