C#을 사용하여 GitHub 리포지토리에 파일 업로드

23375 단어 csharpgithub
github.com에서 GitHubyou can do it easily에 파일을 업로드해야 하는 경우. 그러나 그것은 확장되지 않습니다. 반복적으로 수행하거나 자동화를 용이하게 하려면 프로그래밍 방식을 사용하는 것이 좋습니다. GitHubdoes have a REST API , C# 개발자는 the Octokit library 을 활용할 수 있습니다. 이 라이브러리를 사용하면 많은 시간을 절약할 수 있습니다. 동적 유형 지정을 활용하고 데이터 모델을 자동으로 가져올 수 있으며 HttpClient 호출을 직접 구성할 필요가 없습니다.

이 게시물에서는 Octokit 라이브러리를 사용하여 Markdown 파일을 GitHub 리포지토리에 업로드하는 방법을 보여줍니다.

시작하기 전에 NuGet에서 Octokit 라이브러리를 다운로드합니다. 여러 가지 방법으로 이 작업을 수행할 수 있지만 가장 간단한 방법은 dotnet CLI를 사용하는 것입니다. 프로젝트 경로에서 즐겨찾는 터미널에서 다음을 실행합니다.

dotnet add package Octokit


클라이언트 만들기



시작하려면 Octokit이 GitHub에 연결할 수 있도록 클라이언트를 생성해야 합니다. 이를 위해 새 GitHubClient 를 인스턴스화할 수 있습니다. GitHubClientProductHeaderValue 를 취하는데, 어떤 문자열이든 될 수 있습니다. 이를 통해 GitHub에서 애플리케이션을 식별할 수 있습니다. GitHub는 User-Agent 헤더가 없는 API 요청을 허용하지 않으며 Octokit은 이 값을 사용하여 하나를 채웁니다.

//using Octokit;

var gitHubClient = new GitHubClient(new ProductHeaderValue("MyCoolApp"));


이 한 줄의 코드로 이제 공개 GitHub 정보에 액세스할 수 있습니다. 예를 들어 웹 브라우저를 사용하여 사용자의 세부 정보를 얻을 수 있습니다. api.github.com/users/daveabrock에 대한 내용은 다음과 같습니다.

{
    "login": "daveabrock",
    "id": 275862,
    "node_id": "MDQ6VXNlcjI3NTg2Mg==",
    "avatar_url": "https://avatars.githubusercontent.com/u/275862?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/daveabrock",
    "html_url": "https://github.com/daveabrock",
    "followers_url": "https://api.github.com/users/daveabrock/followers",
    "following_url": "https://api.github.com/users/daveabrock/following{/other_user}",
    "gists_url": "https://api.github.com/users/daveabrock/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/daveabrock/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/daveabrock/subscriptions",
    "organizations_url": "https://api.github.com/users/daveabrock/orgs",
    "repos_url": "https://api.github.com/users/daveabrock/repos",
    "events_url": "https://api.github.com/users/daveabrock/events{/privacy}",
    "received_events_url": "https://api.github.com/users/daveabrock/received_events",
    "type": "User",
    "site_admin": false,
    "name": "Dave Brock",
    "company": null,
    "blog": "daveabrock.com",
    "location": "Madison, WI",
    "email": null,
    "hireable": null,
    "bio": "Software engineer, Microsoft MVP, speaker, blogger",
    "twitter_username": "daveabrock",
    "public_repos": 55,
    "public_gists": 2,
    "followers": 63,
    "following": 12,
    "created_at": "2010-05-13T20:05:05Z",
    "updated_at": "2021-03-13T19:05:32Z"
}


(재미있는 사실: id 값을 보고 사용자가 GitHub에 얼마나 오래 있었는지 확인하는 것은 재미있습니다. 저는 GitHub co-founder Tom Preston-Warner 몇 년 후 275,862번째로 등록된 사용자였습니다. ) .)

이 정보를 프로그래밍 방식으로 가져오려면 id 객체를 사용할 수 있습니다.

//using Octokit;

var gitHubClient = new GitHubClient(new ProductHeaderValue("MyCoolApp"));
var user = await gitHubClient.User.Get("daveabrock");
Console.WriteLine($"Woah! Dave has {user.PublicRepos} public repositories.");


빠르고 쉬웠지만 그다지 재미는 없었습니다. 저장소에서 무엇이든 수정하려면 인증이 필요합니다.

API에 인증



기본 사용자 이름/암호 쌍 또는 OAuth 흐름의 두 가지 방법 중 하나를 사용하여 API에 인증할 수 있습니다. (생성된 개인 액세스 토큰에서) OAuth를 사용하는 것이 코드에 암호를 저장할 필요가 없고 필요에 따라 취소할 수 있으므로 거의 항상 더 나은 접근 방식입니다. 암호가 변경되면 어떻게 됩니까? 나쁘다, 나쁘다, 나쁘다.

대신 passing in a personal access token (PAT)으로 연결하십시오. 프로필 세부 정보에서 개발자 설정 > 개인용 액세스 토큰으로 이동하여 하나를 만듭니다. 1 권한을 포함하고 싶을 것입니다. 만든 후 토큰을 복사하여 어딘가에 붙여넣습니다. 곧 필요합니다.



생성된 PAT를 사용하여 API에 인증하는 방법은 다음과 같습니다. (참고: 토큰에 주의하십시오. 실제 시나리오에서는 토큰을 안전한 곳에 저장하고 구성에서 액세스해야 합니다.)

//using Octokit;

var gitHubClient = new GitHubClient(new ProductHeaderValue("MyCoolApp"));
gitHubClient.Credentials = new Credentials("my-new-personal-access-token");


저장소에 새 파일 추가



그런 다음 User를 사용하여 간단한 Markdown 파일을 만듭니다. 지금까지 내가 가진 것은 다음과 같습니다.

//using Octokit;

var gitHubClient = new GitHubClient(new ProductHeaderValue("MyCoolApp"));
gitHubClient.Credentials = new Credentials("my-new-personal-access-token");

var sb = new StringBuilder("---");
sb.AppendLine();
sb.AppendLine($"date: \"2021-05-01\"");
sb.AppendLine($"title: \"My new fancy post\"");
sb.AppendLine("tags: [csharp, azure, dotnet]");
sb.AppendLine("---");
sb.AppendLine();

sb.AppendLine("# The heading for my first post");
sb.AppendLine();


파일을 생성하려면 문자열을 전달해야 하므로 repo 를 사용하여 전달합니다. 이제 StringBuilder 메서드를 호출하여 파일을 업로드할 수 있습니다.

//using Octokit;

var gitHubClient = new GitHubClient(new ProductHeaderValue("MyCoolApp"));
gitHubClient.Credentials = new Credentials("my-new-personal-access-token");

var sb = new StringBuilder("---");
sb.AppendLine();
sb.AppendLine($"date: \"2021-05-01\"");
sb.AppendLine($"title: \"My new fancy updated post\"");
sb.AppendLine("tags: [csharp, azure, dotnet]");
sb.AppendLine("---");
sb.AppendLine();

sb.AppendLine("The heading for my first post");
sb.AppendLine();

var (owner, repoName, filePath, branch) = ("daveabrock", "daveabrock.github.io", 
        "_posts/2021-05-02-my-new-post.markdown", "main");

await gitHubClient.Repository.Content.CreateFile(
     owner, repoName, filePath,
     new CreateFileRequest($"First commit for {filePath}", sb.ToString(), branch));    


많은 경우 실행하고 잊어버릴 수 있지만 이 메서드는 커밋 및 콘텐츠 세부 정보를 반환하는 sb.ToString()를 반환한다는 점에 유의하는 것이 좋습니다.

기존 파일 업데이트



기존 파일에서 실행CreateFile을 시도하면 커밋에 대한 SHA가 존재하지 않는다는 오류가 발생합니다. 먼저 결과에서 SHA를 가져와야 합니다.

var sha = result.Commit.Sha;

await gitHubClient.Repository.Content.UpdateFile(owner, repoName, filePath,
    new UpdateFileRequest("My updated file", sb.ToString(), sha));


많은 시나리오에서 파일을 만든 직후에 파일을 편집하지 않습니다. 이러한 경우 먼저 파일 세부 정보를 가져옵니다.

var fileDetails = await gitHubClient.Repository.Content.GetAllContentsByRef(owner, repoName,
    filePath, branch);

var updateResult = await gitHubClient.Repository.Content.UpdateFile(owner, repoName, filePath,
    new UpdateFileRequest("My updated file", sb.ToString(), fileDetails.First().Sha));


Base64는 어떻습니까?



원하는 경우 Task<RepositoryChangeSet> 호출에는 CreateFile 부울 플래그도 있습니다. 예를 들어 이미지의 base64 문자열을 전달하고 CreateFileconvertContentToBase64로 설정할 수 있습니다.

string imagePath = @"C:\pics\headshot.jpg";
string base64String = GetImageBase64String(imagePath);

var result = await gitHubClient.Repository.Content.CreateFile(
     owner, repoName, filePath,
     new CreateFileRequest($"First commit for {filePath}", base64String, branch, true));

static string GetImageBase64String(string imgPath)
{
    byte[] imageBytes = System.IO.File.ReadAllBytes(imgPath);
    return Convert.ToBase64String(imageBytes);
}


마무리



이 게시물에서는 Octokit C# 라이브러리를 사용하여 GitHub에 새 파일을 업로드하는 방법을 보여 드렸습니다. 또한 기존 파일을 업데이트하고 base64 문자열을 GitHub에 전달하는 방법에 대해서도 논의했습니다. 읽어주셔서 감사합니다.

좋은 웹페이지 즐겨찾기