2017-03-28 18 views
2

私はgitlabに 'n'個のプロジェクトを持っています。各プロジェクトごとに、私は各gitlabプロジェクトに「n」個のブランチを持っています。ブランチの最後のコミットの状態がgitlab APIを使って成功か失敗かを知る必要があります。私は、以下のリンク gitlabプロジェクトのブランチで最後にコミットステータスを取得するには?

https://gitlab.com/gitlab-org/gitlab-ce/issues/20277

https://docs.gitlab.com/ce/api/pipelines.html

を言及している。しかし、私は、最後の分岐が詳細をコミットすることができませんでした。誰も私にこれを助けてくれませんか?

+0

意味するかの各プロジェクト?または、他の何か? – ojrask

+0

@ojrask、任意のブランチまたは開発ブランチでのみ。何でもOKです。 – Karthi

+0

@All、誰でもこの提案をしていただけますか? – Karthi

答えて

2

あなたがこれを行うにはGitlab APIを使用することができます。

  • List repository branches APIと、すべての枝を取得し、各プロジェクトのためにList projects API
  • ですべてのプロジェクトを取得します。後者の要求は、各ブランチに対して最新のコミットを提供します。 、あなたはbashのではこれらのコミットの各

jqため

  • コールCommit Status API次の操作を実行できます。あなたは絶対に最新の_commit_は(それがどのブランチにも)欲しい

    #!/bin/bash 
    
    # edit this if needed 
    GITLAB_DOMAIN=gitlab.com 
    GITLAB_PORT=443 
    GITLAB_BASE_URL=https://$GITLAB_DOMAIN:$GITLAB_PORT 
    PER_PAGE=1000 
    
    # edit this 
    PRIVATE_TOKEN=YOUR_PRIVATE_TOKEN 
    
    echo "GET /projects" 
    
    projects=$(curl -s "$GITLAB_BASE_URL/api/v4/projects?private_token=$PRIVATE_TOKEN&page=1&per_page=$PER_PAGE" | \ 
        jq -r '. | map([.name, .id|tostring ] | join("|")) | join("\n")') 
    
    echo "$projects" 
    
    while read -r project; do 
    
        IFS='|' read -ra project_t <<< "$project" 
    
        # project name : ${project_t[0]} 
        # project id : ${project_t[1]} 
    
        echo "GET /projects/${project_t[1]}/repository/branches for project ${project_t[0]}" 
    
        commits=$(curl -s "$GITLAB_BASE_URL/api/v4/projects/${project_t[1]}/repository/branches?private_token=$PRIVATE_TOKEN&page=1&per_page=$PER_PAGE" | \ 
         jq -r '. | map([ .name , .commit.id|tostring ] | join("|")) | join("\n")') 
    
        while read -r commit; do 
    
         IFS='|' read -ra commits_t <<< "$commit" 
    
         # branch name : ${commits_t[0]} 
         # last commit sha for this branch : ${commits_t[1]} 
    
         echo "GET /projects/${project_t[1]}/repository/commits/${commits_t[1]}/statuses" 
    
         statuses=$(curl -s "$GITLAB_BASE_URL/api/v4/projects/${project_t[1]}/repository/commits/${commits_t[1]}/statuses?private_token=$PRIVATE_TOKEN" | \ 
          jq -r '. | map([.status, .name] | join("|")) | join("\n")') 
    
         if [ ! -z "$statuses" ]; then 
          while read -r status; do 
    
           IFS='|' read -ra status_t <<< "$status" 
    
           # status value : ${status_t[0]} 
           # status name : ${status_t[1]} 
    
           echo "[PROJECT ${project_t[0]}] [BRANCH ${commits_t[0]}] [COMMIT ${commits_t[1]}] [STATUS ${status_t[1]}] : ${status_t[0]}" 
          done <<< "$statuses" 
         else 
          echo "[PROJECT ${project_t[0]}] [BRANCH ${commits_t[0]}] [COMMIT ${commits_t[1]}] : no status found" 
         fi 
    
        done <<< "$commits" 
    
        echo "------" 
    
    done <<< "$projects" 
    
  • +1

    スクリプトをありがとう!ちょっとマイナーなコメント:私の場合は、私の** private **プロジェクトを取得するために、このようなプロジェクトに '/ users//projects'を問い合わせなければなりませんでした。さもなければ、それは公共のものだけをリストするでしょう。 –

    関連する問題