Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Github Actions 로 Android 팀의 효율성 극대화

Github Actions 로 Android 팀의 효율성 극대화

Google I/O extended Android 2024 때 발표한 자료 입니다.

Harada Ha

July 21, 2024
Tweet

More Decks by Harada Ha

Other Decks in Technology

Transcript

  1. H사 2 ~ 3명 Section 1 # 소통의 용이함 #

    자원 부족 # 단순한 관리
  2. B사 5 ~ 8명 Section 1 # 소통의 복잡성 증가

    # 복잡한 워크플로우 # 안정된 운영
  3. Event Runner 1 Runner 2 Job 1 Job 2 Runner

    1 Runner 2 Step 1 : Run action Step 2 : Run script Step 1 : Run action Section 1
  4. Event Runner 1 Runner 2 Job 1 Job 2 Runner

    1 Runner 2 Step 1 : Run action Step 2 : Run script Step 1 : Run action Section 1
  5. Event Runner 1 Runner 2 Job 1 Job 2 Runner

    1 Runner 2 Step 1 : Run action Step 2 : Run script Step 1 : Run action Section 1
  6. Job 을 구성하는 작은 단계 Actions steps : # 체크아웃

    액션: 저장소의 코드를 체크아웃 - - name : Check out Code uses : actions/checkout@v3 # 액션: 코드 컴파일 - name : Build the project run : ./gradlew assembleDebug Section 1
  7. Event Runner 1 Runner 2 Job 1 Job 2 Runner

    1 Runner 2 Step 1 : Run action Step 2 : Run script Step 1 : Run action Section 1
  8. - Ts : 수동으로 카드 하나를 생성하는 데 걸리는 시간

    = 20초 - R : PR 당 리뷰어의 수 = 2명 - P : PR의 수 = 3개 - C : 총 생성해야 하는 카드의 수 = R×P = 6개 Total_s = C×Ts = 6×20 = 2분 PR 카드 생성 시간 Section 2 Section 2
  9. PR 카드 생성 시간 Section 2 1일 기준 = 2분

    × 5명 = 10분 근무 21일 기준 = 210분 = 3.5시간
  10. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  11. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  12. Jobs Section 2 jobs : pr_comment : if : github.event.issue.pull_request

    && startsWith(github.event.comment.body, '/review' ) steps : - name : Dispatch . . .
  13. https://github.com/actions/github-script Actions steps : # PR comment 분석하여 리뷰어 추출

    후, review-pr-card 워크 플로우 트리거 - - name : Dispatch uses : actions/github-script@v7 with : github-token : ${{ secrets.GITHUB_TOKEN }} script : | Section 1 Section 2
  14. - name : dispatch uses : actions/github-script@v7 with : github-token

    : ${{ secrets.GITHUB_TOKEN }} script : | const[ , …reviewParameters] = '${{ github.event.comment.body }}'.trim().split(' ') . . . await github.rest.actions.createWorkflowDispatch({ . . .context.repo, workflow_id : 'action-pipelines-review-pr-card.yml', ref : context.ref, inputs : { pr_number: `${ context.issue.number }`, . . . } });
  15. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-automation column_id find-card set-reviewers create-card move-card outputs
  16. - name : dispatch . . . with : script

    : | . . . await github.rest.actions.createWorkflowDispatch({ . . .context.repo, workflow_id : 'action-pipelines-review-pr-card.yml', ref : context.ref, inputs : { pr_number: `${ context.issue.number }`, pr_assignee: `${ commentUser }`, pr_reviewers = `${ notifiers.join() }` } });
  17. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  18. on : workflow_dispatch : inputs : pr_number : description :

    'PR number' required : true default : ' ' pr_assignee : . . . pr_reviewers : . . . jobs : prepare : runs-on : [self-hosted, amd64, small, spot] steps : . . .
  19. prepare : steps : - name : get-pr-data uses :

    actions/github-script@v7 id : pr_data with : script : | . . . return pr_data - name : get-pr-url . . . script : | const prData = ${{ steps.pr_data.outputs.result }} return prData.html_url result-encoding : string
  20. prepare : steps : - name : get-pr-data uses :

    actions/github-script@v7 id : pr_data with : script : | . . . return pr_data - name : get-pr-url . . . script : | const prData = ${{ steps.pr_data.outputs.result }} return prData.html_url result-encoding : string
  21. prepare : steps : . . . - name :

    checkout uses : actions/checkout@v3 - name : pr-assignee-to-project-column-id run : chmod +x ./column.sh result=$(./column.sh "${{ github.event.inputs.pr_assignee }}") echo "result=${result}" >> $GITHUB_OUTPUT . . .
  22. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  23. jobs : prepare : steps : - name : get-pr-data

    - name : get-pr-url . . . outputs : pr_html_url : ${{ steps.pr_html_url.outputs.result }} pr_title : ${{ steps.pr_title_url.outputs.result }} pr_assignee_column_id : ${{ steps.pr-assignee-to-project-column-id.outputs.result }} . . . pr-automation : . . .
  24. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  25. jobs : prepare : steps : - name : get-pr-data

    - name : get-pr-url . . . pr-review : needs : [ prepare ] steps : - name : find-card - name : set-reviewers - name : create-card - name : move-card
  26. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  27. - name : find-card uses : actions/github-script@v7 id : find_card

    with : github-token : ${{ secrets.GITHUB_TOKEN }} script : | const { data: listCards } = await github.rest.projects.listCards({ column_id : columnId, }); . . . if (card) { return card.id } else { return 0 }
  28. - name : find-card uses : actions/github-script@v7 id : find_card

    with : github-token : ${{ secrets.GITHUB_TOKEN }} script : | const { data: listCards } = await github.rest.projects.listCards({ column_id : colinmId, }); . . . if (card) { return card.id } else { return 0 }
  29. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  30. - name : set-reviewers if : steps.find_card.outputs.result == 0 uses

    : actions/github-script@v7 with : github-token : ${{ secrets.GITHUB_TOKEN }} script : | const { data: requestedReviewers } = await github.rest.pulls.listRequestedReviewers({ column_id : colinmId, }); . . . if (requestedReviewers.users.length === 0) { await github.rest.pulls.requestReviewers({ . . . }} }
  31. - name : set-reviewers if : steps.find_card.outputs.result == 0 uses

    : actions/github-script@v7 with : github-token : ${{ secrets.GITHUB_TOKEN }} script : | const { data: requestedReviewers } = await github.rest.pulls.listRequestedReviewers({ column_id : colinmId, }); . . . if (requestedReviewers.users.length === 0) { await github.rest.pulls.requestReviewers({ . . . }} }
  32. - name : set-reviewers if : steps.find_card.outputs.result == 0 uses

    : actions/github-script@v7 with : github-token : ${{ secrets.GITHUB_TOKEN }} script : | const { data: requestedReviewers } = await github.rest.pulls.listRequestedReviewers({ column_id : colinmId, }); . . . if (requestedReviewers.users.length === 0) { await github.rest.pulls.requestReviewers({ . . . }} }
  33. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  34. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data review-pr-card

    pr-review column_id find-card set-reviewers create-card move-card outputs
  35. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data pr-review

    github_username set-reviewers notify-reviewers send-dm-for- reviewer outputs notify-pr-reviewer pr_title pr_url pr_assignee pr_reviewer
  36. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data pr-review

    github_username set-reviewers notify-reviewers send-dm-for- reviewer outputs notify-pr-reviewer pr_title pr_url pr_assignee pr_reviewer
  37. - name : notify-reviewers uses : actions/github-script@v7 with : github-token

    : ${{ secrets.GITHUB_TOKEN }} script : | . . . for (const reviewer of selectedReviewers) { await github.rest.actions.createWorkflowDispatch({ . . . context.repo, workflow_id : 'action-pipelines-notify-pr-reviewer.yml', inputs: { . . . } } }
  38. pr_comment prepare /review @notifier, @notifier pr_number pr_assignee pr_reviewers pr_data pr-review

    github_username set-reviewers notify-reviewers send-dm-for- reviewer outputs notify-pr-reviewer pr_title pr_url pr_assignee pr_reviewer
  39. - name : send-dm-for-reviewer uses : slackapi/[email protected] env : SLACK_BOT_TOKEN

    : ${{ secrets.SLACK_ANDROID_PR_BOT_TOKEN }} with : channel-id : ${{ steps.pr_reviewer_slack_mention_token.outputs.result }} payload : | { "blocks" : [ { "type" : "header", "text" : { "type" : "plain_text", "text" : "PR 리뷰 부탁드립니다 :pray:", "emoji" : true } . . .
  40. - name : send-dm-for-reviewer uses : slackapi/[email protected] env : SLACK_BOT_TOKEN

    : ${{ secrets.SLACK_ANDROID_PR_BOT_TOKEN }} with : channel-id : ${{ steps.pr_reviewer_slack_mention_token.outputs.result }} payload : | { "blocks" : [ { "type" : "header", "text" : { "type" : "plain_text", "text" : "PR 리뷰 부탁드립니다 :pray:", "emoji" : true } . . .
  41. - name : send-dm-for-reviewer uses : slackapi/[email protected] env : SLACK_BOT_TOKEN

    : ${{ secrets.SLACK_ANDROID_PR_BOT_TOKEN }} with : channel-id : ${{ steps.pr_reviewer_slack_mention_token.outputs.result }} payload : | { "blocks" : [ { "type" : "header", "text" : { "type" : "plain_text", "text" : "PR 리뷰 부탁드립니다 :pray:", "emoji" : true } . . .
  42. - name : send-dm-for-reviewer uses : slackapi/[email protected] env : SLACK_BOT_TOKEN

    : ${{ secrets.SLACK_ANDROID_PR_BOT_TOKEN }} with : channel-id : ${{ steps.pr_reviewer_slack_mention_token.outputs.result }} payload : | { "blocks" : [ { "type" : "header", "text" : { "type" : "plain_text", "text" : "PR 리뷰 부탁드립니다 :pray:", "emoji" : true } . . .
  43. - name : send-dm-for-reviewer uses : slackapi/[email protected] env : SLACK_BOT_TOKEN

    : ${{ secrets.SLACK_ANDROID_PR_BOT_TOKEN }} with : channel-id : ${{ steps.pr_reviewer_slack_mention_token.outputs.result }} payload : | { "blocks" : [ { "type" : "header", "text" : { "type" : "plain_text", "text" : "PR 리뷰 부탁드립니다 :pray:", "emoji" : true } . . .
  44. PR Review Reminder Section 2 Slack DM으로 PR 메시지가 오는데

    자꾸 까먹네... PR을 잘 볼 수 있는 방법 없을까?
  45. on : schedule : # 평일 13시 실행 cron :

    '0 4 * * 1-5' workflow_dispatch : jobs : pr-remind : . . . steps : - name : find-open-pr - name : prepare-slack-message . . .
  46. - name : find-open-pr . . . script : |

    const { data : pullRequests } = await github.rest.pulls.list({ . . . }); const filteredPullRequests = pullRequests.filter(pr => pr.requested_reviewers.length !=0 && !pr.draft ); return filteredPullRequests
  47. - name : find-open-pr . . . script : |

    const { data : pullRequests } = await github.rest.pulls.list({ . . . }); const filteredPullRequests = pullRequests.filter(pr => pr.requested_reviewers.length !=0 && !pr.draft ); return filteredPullRequests
  48. - name : prepare-slack-message . . . script : |

    . . . const payload = { blocks : [ . . . ] } await github.rest.actions.createWorkflowDispatch({ . . . inputs : { payload : JSON.stringfy(payload), pr_reviewer : `${ reviewer }` } })
  49. - name : prepare-slack-message . . . script : |

    . . . const payload = { blocks : [ . . . ] } await github.rest.actions.createWorkflowDispatch({ . . . inputs : { payload : JSON.stringfy(payload), pr_reviewer : `${ reviewer }` } })