Check! Terraform으로 GitHub에서 최근에 발표한 assets의 다운로드 URL을 얻습니다

Prologue


Infrastructure as Code로 자동화하면 GiitHub의 최신 발표에 추가된 assets의 URL이 무엇인지 알고 싶습니다.
자신의 경우 아주펀션의zip 프로그램(※)를 사용하고 싶어요!
구체적으로 GiitHub Actions를 통해 GiitHub이 관리하는FaaS의 코드 업데이트를 감지하여 자동으로 패키지화하여 발표에 추가한다.설계를 진행할 때 최신 버전에 추가된 패키지 파일을 참조하십시오.
그러나 여기서 곤란한 것은 발행된 페이지는 고정 URL/<repoisitory>/releases/latest을 통해 접근할 수 있지만 여기에 첨부된 파일의 URL<repository>/releases/download/v1.0.0/package.zip은 서명이 끼워져 있어 확정할 수 없습니다!
이 URL을 코드로 확인하려면 이렇게 처리해야 합니다.
예제
curl -s https://api.github.com/repos/<repository>/releases/latest | jq -r ".assets[0].browser_download_url"

https://github.com/<repository>/releases/download/v1.0.0/package.zip`
귀찮을 때,Terraform에GiitHub의 공급업체가 있는 것 같아,최신 발표된 정보를 끌어낼 수 있어!
https://registry.terraform.io/providers/integrations/github
와!
그래서 마침 지금 대응하는 프로젝트가 테라form을 도입하는 것이어서 사용해 봤습니다.편리합니다!!
※ Azure Function은 zip 파일로 코드를 확장할 수 있습니다.이것과매크로 패키지 파일에서 실행를 조합하면 자원 디버깅을 할 때 코드도 디자인할 수 있어 매우 편리합니다.구체적으로 코드를 압축한 zip 파일을 일반인이 접근할 수 있는 곳에 놓고 응용 프로그램 설정WEBSITE_RUN_FROM_PACKAGE에 이 URL을 지정한 후 디버깅할 때 가져오고 펼친다.

Terraform GiitHub 공급자의 준비 활용


GiitHub에 대한 인증 정보 설정(필요에 따라)


GiitHub 공급자를 사용할 때 자원을 만들거나 비공개 정보를 얻기 위해서는 GiitHub의 인증 정보를 설정해야 한다.(※ 공용 창고의 게시 정보는 얻을 필요가 없습니다.)
  • 접속 영패
  • 사용자 이름(※ 조직 또는 기업판 사용 시 별도로 문서를 확인하십시오.)
  • 우선 방문 영패를 만듭니다.
    https://docs.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token
    그리고 인증 정보를 제출하는 방법은 두 가지가 있다.
  • 환경 변수로 전송
  • 스크립트 변수로 전송
  • 환경 변수로 인증 정보 전달


    terraform 명령을 실행하기 전에 다음 환경 변수를 지정합니다.
    환경 변수
    설명GITHUB_TOKEN획득한 방문 영패 지정GITHUB_OWNER사용자 이름 지정

    인증 정보를 스크립트 변수로 전달


    스크립트 변수에 전달하려면 공급자 설정에서 다음과 같이 설명하십시오.
    예제
    # 中略
    
    provider "github" {
      token = "${var.github_token}"
      owner = "${var.github_owner}"
    }
    
    # 中略
    

    데이터 "github release" 최신 게시에 첨부된 특정 파일의 다운로드 URL 얻기


    그러면 바로 최신 발표에 추가된 목적인 asset의 URL을 가져옵니다!
    판본 등은 집필 시간의 물건이다.문서를 적당히 확인하세요.
    예제
    terraform {
      required_providers {
        github = {
          source  = "integrations/github"
          version = "4.3.0"
        }
      }
    }
    
    variable "repo" {
      type = string
    }
    
    variable "owner" {
      type = string
    }
    
    variable "asset_name" {
      type = string
    }
    
    data "github_release" "latest" {
      repository  = var.repo  # リリース情報を取得する対象のリポジトリ
      owner       = var.owner # リリース情報を取得する対象のオーナー名
      retrieve_by = "latest"
    }
    
    data "http" "get_assets" {
      url = data.github_release.latest.asserts_url
    
      request_headers = {
        Accept = "application/vnd.github.v3+json"
      }
    }
    
    output "download_url" {
      value = [for asset in jsondecode(data.http.get_assets.body) : asset if lookup(asset, "name") == var.asset_name][0].browser_download_url
    }
    
    여기서 다음 공용 창고의 매개 변수를 참고하십시오:.
    .auto.tfvars
    repo       = "learn-azure-functions-with-network-options"
    owner      = "dzeyelid"
    asset_name = "functions.zip"
    
    terraform init
    terraform plan
    terraform apply
    
    apply의 결과는 다음과 같다.목적을 얻을 수 있는 다운로드 URL!
    Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    download_url = "https://github.com/dzeyelid/learn-azure-functions-with-network-options/releases/download/v0.1.0/functions.zip"
    

    해설

    data "github_release" REST API/repos/{owner}/{repo}/releases/latest의 실행 결과를 반환합니다.
  • 참조: Get the latest release - REST API Reference Repositories | GitHub Docs
  • 여기서 assets_url는 객체가 보유한 assets 정보를 게시하는 데 사용되는 URL입니다.이 assets의 정보를 얻기 위해서 data "http" 을 이용하여 이 URL의 응답을 얻습니다.
    결과는 아래와 같은 데이터로 되돌아온다.
    예제
    [
      {
        "browser_download_url" = "https://github.com/dzeyelid/learn-azure-functions-with-network-options/releases/download/v0.1.0/functions.zip"
        "content_type" = "application/zip"
        "created_at" = "2021-01-18T10:12:00Z"
        "download_count" = 0
        "id" = 3.0850289e+07
        "label" = ""
        "name" = "functions.zip"
        "node_id" = "MDEyOlJlbGVhc2VBc3NldDMwODUwMjg5"
        "size" = 297996
        "state" = "uploaded"
        "updated_at" = "2021-01-18T10:12:00Z"
        "uploader" = {
          "avatar_url" = "https://avatars2.githubusercontent.com/in/15368?v=4"
          "events_url" = "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}"
          "followers_url" = "https://api.github.com/users/github-actions%5Bbot%5D/followers"
          "following_url" = "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}"
          "gists_url" = "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}"
          "gravatar_id" = ""
          "html_url" = "https://github.com/apps/github-actions"
          "id" = 4.1898282e+07
          "login" = "github-actions[bot]"
          "node_id" = "MDM6Qm90NDE4OTgyODI="
          "organizations_url" = "https://api.github.com/users/github-actions%5Bbot%5D/orgs"
          "received_events_url" = "https://api.github.com/users/github-actions%5Bbot%5D/received_events"
          "repos_url" = "https://api.github.com/users/github-actions%5Bbot%5D/repos"
          "site_admin" = false
          "starred_url" = "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}"
          "subscriptions_url" = "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions"
          "type" = "Bot"
          "url" = "https://api.github.com/users/github-actions%5Bbot%5D"
        }
        "url" = "https://api.github.com/repos/dzeyelid/learn-azure-functions-with-network-options/releases/assets/30850289"
      },
    ]
    
    수조라 그 중 일부를 이용하려면 적절히 검색한다.이 예에서는 name에 지정된 asset 이름과 일치하는 객체를 추출하여 URL을 결정합니다.
    발췌하다
    [for asset in jsondecode(data.http.get_assets.body) : asset if lookup(asset, "name") == var.asset_name][0].browser_download_url
    

    Epilogue


    Terraform은 네트워크 주위에 편리한 함수가 있습니다. 위와 같이 다양한 공급자가 있어서 복잡한 일을 하고 싶을 때 편리할 때가 있습니다!

    좋은 웹페이지 즐겨찾기