AppStore ConnectAPI를 사용하여 Provisioning Profile 자동 다운로드

개시하다
개발자 경험: DX의 완전한 개선 스토리 Advent Calendar 2021 22일째!
이것은 우리 회사가 제작한 효율을 높이는 도구의 이야기이다
날과 씨
구문 정보
회사는 유니티가 만든 모바일 애플리케이션을 개발했지만 빌딩 전체를 제인킨스 기계로 자동화했다.
최근에는 대오 규모 확대 등의 이유로 청사기계 1대 등에서 대기가 발생해 청사기계 2대가 추가돼 맥미니 3대를 구성했다.
기계의 증가로 인한 문제
기계가 증가하여 고속으로 구축하여 문제를 해결할 수 있습니다!그렇게 생각하지만 생각지도 못한 곳에서 골치 아픈 일이 생겼어요.
ProvisioningProfile 업데이트
당사는 추가 구성원의 새로운 연결·업무위탁 구성원, 기존 구성원의 기종 변경 등 시기에 Provisioning Profile에 새로운 단말기를 추가하여 온정이 있는 수작업으로 DL, Xcode에 추가하였습니다

터미널의 추가와 Provisioning Profile 자체의 터미널 목록 업데이트는 단 한 번뿐이지만 당사가 개발한 프로그램은 10여 개의 Provisioning Profile가 있습니다. MacMini 3대로 Apple Developer를 열고 하나씩 Provisioning Profile를 다운로드합니다.클릭하여 Xcode에 로그인하면 간단하고 번거로우며 기묘한 신경 조작이 발생합니다

솔직히 엔지니어 이외에도 할 수 있는 일이야!그렇게 생각하지만 엔지니어 이외의 사람이 애플 Developer를 만지작거리면 사건이 발생할 수 있기 때문에 다른 사람에게 부탁하기 어렵다
원래는 부탁받은 다른 사람만 아프기 때문에 부정적인 연쇄다.
자동화야!
찾아보니 AppStore Connect에서 작동할 수 있는 API, AppStore ConnectAPI(전체 이름) 가 있습니다.
https://developer.apple.com/jp/app-store-connect/api/
참고자료를 봤는데 Provisioning Profile은 다운로드할 수 있는 분위기가 있어요.

이걸 사용하면 Provisioning Profile을 모두 다운로드할 수 있습니다. 자동으로 열리는 조개 스크립트를 제작하면 업무 효율화 등이 대단합니다!
바로 해보도록 하겠습니다.
AppStore ConnectAPI를 사용하려면 3가지 Key 두드리기 API가 필요합니다.
- Issuer ID
- 키 ID
- 기밀 키 파일(p8 파일)
AppStore Connect 사용자 및 액세스 → 키 → AppStore ConnectAPI 를 통해 릴리즈할 수 있으므로 먼저 릴리즈하십시오.
만약 표시되지 않으면 계정의 권한이 부족할 수 있으니 상사에게 따로 의뢰하세요.

바로 해볼게요.
이번에는 파이톤으로 실제 API 두드리기, 파일 저장 처리를 써봤어요.
AppStore ConnectAPI를 두드리는 샘플로 여기를 참고했습니다.
https://gist.github.com/corrieriluca/3c9f062401582dad83013d7363741b0c
import os
import base64
import requests,time
from authlib.jose import jwt

KEY_ID = ""
ISSUER_ID = ""
#通信有効期限は20分程度なのです。
EXPAIR_TIME = int(round(time.time() + (20.0 * 60.0)))

P8_FILE = ".p8 filepath."
KEY_ID = "hogehoge"
ISSUER_ID = "fugafugafuga"


#認証ファイル
with open(P8_FILE, "r") as file:
    private_key = file.read()

header = {
    "alg" : "ES256",
    "kid" : KEY_ID,
    "typ" : "JWT"
}

payload = {
    "iss" : ISSUER_ID,
    "exp" : EXPAIR_TIME,
    "aud" : "appstoreconnect-v1"
}

token = jwt.encode(header,payload,private_key)

JWT = "Bearer " + token.decode()
URL = "https://api.appstoreconnect.apple.com/v1/profiles"
HEAD = {"Authorization": JWT}

#API叩いてProvisioningを取得
#もう使ってない(必要ない)Profile落とさないように検索をかける
res = requests.get(URL,params={"filter[name]": "検索したいProvisioningProfileの名前","limit": 50},headers=HEAD)

os.makedirs("provisioning", exist_ok=True)

json = res.json()
#jsonにしてdataの配列を回す
data_array = json["data"]
for data in data_array:
    attr = data["attributes"]
    #無効はSkip
    if attr["profileState"] == "INVALID":
        continue

    name = attr["name"]
    #profileContentがファイルの中身なのでこれをDecodeしたものをファイルとして保存してやる
    content = attr["profileContent"]
    write_file = open("provisioning/" + name + ".mobileprovision","bw")
    write_file.write(base64.b64decode(content))
    write_file.close()

중요한 곳으로 삼다
res = requests.get(URL,params={"filter[name]": "検索したいProvisioningProfileの名前","limit": 50},headers=HEAD)
여기서 API 두드려.Filter[name]로 Provisioning Profile을 얻을 때 이름으로 필터합니다.
당사는 개발 중인 제품의 Provisioning Profile만 낮추려고 사용하고 있습니다
for data in data_array:
    attr = data["attributes"]
    #無効はSkip
    if attr["profileState"] == "INVALID":
        continue

여기서 얻은 Provisioning을 for로 회전하면서 검사하기
인증서 만료와 같은 일부 원인으로 인해 Provisioning Profile이 무효일 경우, 떨어져도 의미가 없기 때문에 건너뛰기
[소개 State]에 VAID, INVAID 수치가 있습니다. 확인하고 튕기십시오.
실제로 보존한 것은 이 일대의 처리이다
name = attr["name"]
#profileContentがファイルの中身なのでこれをDecodeしたものをファイルとして保存してやる
content = attr["profileContent"]
write_file = open("provisioning/" + name + ".mobileprovision","bw")
write_file.write(base64.b64decode(content))
write_file.close()
바이너리 파일로 저장되기 때문에 오픈할 때 모드가 bw죠 (1패)
이python 파일을 실행하면 이런 결과가 나타납니다
$ python main.py
スクリーンショット 2021-12-22 16.png
폴더 생성 및 대량 다운로드 Provisioning Profile🎉🎉🎉
바로 해봐 (조개 스크립트 편)
마지막으로 이python 파일을 실행하고 Provisioning Profile만 열 케이스를 만듭니다
이렇게 말하지만 매우 간단하다
shell run.sh
python3 main.py
for file in provisioning/*; do
echo $file
open $file
done
for로 파일 이름을 회전시키고 오픈 명령으로 열 수 있는 간단한 것들입니다.
이후 필요한 시기에 이 셸을 두드리면 로컬 Provisioning Profile가 최신 상태가 됩니다!
해보도록 하겠습니다.
오래전부터 자동화하고 싶었는데 실제로 해보니까 그 편의성 때문에 울었다(진짜)
휴대전화를 바꾸는 사람이 생기거나 인증 단말기를 늘릴 때 애플 Developer로 Provisioning Profile을 업데이트하면 SSH 같은 방법으로만 각 빌딩 기계에 들어가 셸을 두드리기 때문에 수시간 단위로 업무시간을 삭감한다🎉
그리고 인간적인 일이 되기 쉬우나 조개껍질 스크립트를 두드리는 사람이라면 누구나 할 수 있다(즉 엔지니어라면 모두 할 수 있다는 뜻)는 것은 인간화 방지와도 관련이 있다(애플 디벨로퍼 주위 사람들이 사람을 선택하기 때문이다.)

슬랙 좋아하시는 분.

좋은 웹페이지 즐겨찾기