초보자 친화적인 Github 운영 세션 4개

35812 단어
Gitd는 CICD 파이프라인 구축에 관심이 많습니다.작업 흐름은 실현하기 쉬울 뿐만 아니라 기존 프로젝트와 연결하기도 쉽다.이것들은 내가 어떻게 이것들을 나의 환매 협의에 추가하고, 내 자신의 환매 협의를 개발하는지 이해하려고 할 때 유용한 부분 목록을 발견하는 것이다.
나는 단독 환매 협의를 만들어서 초기 PRs를 테스트함으로써 이 부분들을 검증했다.더 빈틈없는 개발 체험을 원한다면, 작업 흐름을 검증하기 위해nektos/act를 CLI로 사용하는 것을 권장합니다.

네크토스 / 비헤이비어


GitHub 작업을 로컬에서 실행🚀



개술


"Think globally, act locally"


로컬에서 실행GitHub Actions!왜 이러는 거야?두 가지 이유:

  • 빠른 피드백 - 파일에 대한 변경 사항을 항상 제출/푸시할 필요 없이.github/workflows/ 파일에서 수행한 변경 사항(또는 내장된 GitHub 작업에 대한 변경 사항)을 로컬에서 실행할 수 있습니다act.environment variablesfilesystem 모두 GitHub에서 제공하는 기능과 일치하도록 구성되었습니다.

  • 로컬 퀘스트 주자 - 사랑해요make.하지만 나도 나 자신을 되풀이하는 것을 싫어한다.act를 사용하면 .github/workflows/에 정의된 GitHub 작업 교체Makefile를 사용할 수 있습니다!
  • 그것은 어떻게 일합니까?

    act를 실행하면 .github/workflows/에서 GitHub 작업을 읽고 실행할 작업 세트를 결정합니다.Docker API를 사용하여 워크플로에 정의된 대로 필요한 이미지를 추출하거나 구성합니다.
    View on GitHub

    세션 목록

  • Post a comment automatically when a PR is opened
  • Run a PHP snippet
  • Open a Jira ticket when Dependabot opens a PR (for Hosted Jira instances)
  • Update empty PR body with a picture of Barney

  • PR 켜면 자동으로 댓글 올리기


    이 코드는 GitHub 작업 흐름의 구조를 이해하는 데 실제 생산 사용보다 더욱 유용하다.작업 할당량을 사용하지 않고 보다 신뢰할 수 있는 대안을 보려면 creating a pull request template for your repository 설명서를 참조하십시오.
    다음 파일을 .github/workflows/comment.yml 또는 귀하가 적절하다고 생각하는 다른 작업 흐름 이름으로 환매 협의에 추가합니다.
    name: Comment
    
    on:
      pull_request:
        types: [opened]
    
    jobs:
      version_comment:
        name: Comment on a new PR with reminder
        runs-on: ubuntu-latest
        steps:
        - name: Add PR Comment
          id: add_pr_comment
          uses: octokit/[email protected]
          with:
            route: POST /repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments
            body: "\"Change me to the comment you want to automatically put 🐶\""
          env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    

    PHP 코드 세그먼트 실행


    PHP에서 주로 개발팀을 운영하는 사람들(예를 들어 나)에게도 PHP로 임시 스크립트를 작성하여 상하문 전환을 줄일 수 있다.TEST ENV는 PR 메타데이터에 대한 정보를 스크립트에 전달해야 하는 경우 환경 변수의 예로 여기에 배치됩니다.
    다음 파일을 .github/workflows/php.yml 또는 귀하가 적절하다고 생각하는 다른 작업 흐름 이름으로 환매 협의에 추가합니다.
    name: Testing php scripts
    
    on:
      pull_request:
        types: [opened]
    
    jobs:
      version_comment:
        name: Comment on a new PR with reminder
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Setup PHP
          uses: shivammathur/setup-php@v2
          with:
            php-version: '7.3'
        - name: Check PHP version
          run: php --version
        - name: Run test.php
          env:
            TEST_ENV: "Hello from ENV"
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          run: php scripts/test.php
    
    다음 파일을 scripts/test.php 환매 협의에 추가합니다.
    <?php
    
    echo "Hello! This is scripts/test.php\n";
    
    $github_token = getenv('GITHUB_TOKEN');
    $test_env = getenv('TEST_ENV');
    
    echo "$github_token = " . $github_token . "\n";
    echo "$test_env = " . $test_env . "\n";
    

    Releadot에서 PR을 열 때 Jira 티켓을 엽니다(호스팅된 Jira 인스턴스의 경우).


    이 파일들의 작업은 GitHub actions에서 Python 스크립트를 실행하는 것입니다. 이 스크립트는 Jira 벌금 고지서의 생성을 시작합니다.
    이 스크립트는 클라우드 및 호스팅 기반 Jira 인스턴스에 적용됩니다.그러나 클라우드 기반의 실례를 사용하는 사람들에게 저는 Atlassian이 이미 제공한 Jira Create issue GitHub Action를 사용하도록 권장합니다.이것은 당신이 사용한 것이 최신식과 가장 좋은 것임을 확보할 것입니다.위탁 관리 실례를 가진 사용자는 이 기능을 사용할 수 없습니다.
    시작하기 전에 API 호출에 사용할 수 있는 사용자 이름과 암호를 가진 Jira 계정이 필요합니다.https://github.com/YOUR_USERNAME/YOUR_REPO/settings/secrets/actions로 이동하여 [새 저장소 기밀]을 선택합니다.Jira 계정의 사용자 이름JIRA_USER, Jira 계정의 비밀번호JIRA_PASS로 저장합니다.
    다음 파일을 .github/workflows/dependabot_to_jira.yml 또는 귀하가 적절하다고 생각하는 다른 작업 흐름 이름으로 환매 협의에 추가합니다.
    name: Dependabot Jira Sync
    
    on:
      pull_request:
        types: [opened]
    
    jobs:
      run_jira_ticket:
        name: Create Jira Ticket for Dependabot PR
        if: contains(github.event.pull_request.labels.*.name, 'Dependencies')
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Set up Python
          uses: actions/setup-python@v1
          with:
            python-version: '3.x'
        - name: Install dependencies
          run: |
            python -m pip install --upgrade pip
            pip install -r requirements.txt
        - name: Create Jira Ticket and Update PR Title
          env:
            GITHUB_JSON: ${{ toJson(github) }}
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            JIRA_USER: ${{ secrets.JIRA_USER }}
            JIRA_PASS: ${{ secrets.JIRA_PASS }}
          run: python3 scripts/jira_ticket.py
    
    다음 파일을 scripts/jira_ticket.py 환매 협의에 추가합니다.
    jiraUrl을 Jira 트랜잭션 인스턴스의 URL로 변경했는지 확인합니다.
    import os
    import json
    import requests
    
    # Get ENV variables.
    def getENV():
      githubJson = os.environ['GITHUB_JSON']
      githubToken = os.environ['GITHUB_TOKEN']
      github = json.loads(githubJson)
      jiraUser = os.environ['JIRA_USER']
      jiraPass = os.environ['JIRA_PASS']
      return github, githubToken, jiraUser, jiraPass
    
    def createJiraTicket(jiraUser, jiraPass, githubPRTitle, githubPRURL):
      jiraUrl = f"https://backlog.YOURINSTANCE.com/rest/api/2/issue"
      jiraHeaders = {"Content-Type": "application/json"}
      jiraBody = {
        "fields": {
          "project": {"key": "EEE"},
          "summary": f"{githubPRTitle}",
          "description": f"{githubPRURL} | {jiraUser}",
          "issuetype": {"name": "Ticket"}
        }
      }
      response = requests.post(jiraUrl, auth=(jiraUser, jiraPass), headers=jiraHeaders, json=jiraBody)
      print(response.status_code)
      if response.status_code == 201:
        jiraResponse = json.loads(response.text)
        return jiraResponse['key']
    
    # Make API call to GitHub to change PR title.
    def updateGithubPRTitle(githubToken, jiraKey, githubPRTitle, githubRepo, githubPRNum):
      githubHeaders = {"Authorization": f"token {githubToken}"}
      githubBody = {"title": f"{jiraKey} | {githubPRTitle}"}
      githubUrl = f"https://api.github.com/repos/{githubRepo}/pulls/{githubPRNum}"
      response = requests.patch(githubUrl, json=githubBody, headers=githubHeaders)
      print(response.status_code)
    
    if __name__ == "__main__":
      github, githubToken, jiraUser, jiraPass = getENV()
    
      githubRepo = github['repository']
      githubPRURL = github['event']['pull_request']['_links']['html']['href']
      githubPRTitle = github['event']['pull_request']['title']
      githubPRNum = github['event']['pull_request']['number']
    
      jiraKey = createJiraTicket(jiraUser, jiraPass, githubPRTitle, githubPRURL)
      print(jiraKey)
      updateGithubPRTitle(githubToken, jiraKey, githubPRTitle, githubRepo, githubPRNum)
    

    바니의 사진으로 빈 홍보 기구를 업데이트하다


    내 동료 한 명이 상당히 긴 시간 동안 시신이 없는 상태에서 공관이 열릴 때마다 자주 그랬다.이것은 흥미로운 GitHub 행동으로 팀과 함께 실시하여 GitHub 행동 개발 과정에 대한 더 많은 정보를 얻을 수 있다.
    이 부분은 다른 부분과 다르다. 왜냐하면 우리는 자신의 연결기를 구축하고 작업 흐름 파일과 함께 리포에 저장하기 때문이다.또는, 만약 당신이 이 일을 더욱 광범위하게 제공하기를 원한다면, 환매 협의를 이 단일한 행동에 전용하여 Marketplace에 발표할 수 있다.
    다음 파일을 .github/workflows/barney.yml 또는 귀하가 적절하다고 생각하는 다른 작업 흐름 이름으로 환매 협의에 추가합니다.
    name: Body by Barney
    
    on:
      pull_request:
        types: [opened]
    
    jobs:
      barney_job:
        runs-on: ubuntu-latest
        name: Barney is here
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        steps:
          # To use this repository's private action, you must check out the repository
          - name: Checkout
            uses: actions/checkout@v2
          - name: I love you
            uses: ./ # Uses an action in the root directory
            id: barney
    
    barney.yml는 작업이 있는 저장소의 루트를 가리키며 이 예에서 action.yml 파일이다.다음 파일을 action.yml 환매 협의에 추가합니다.
    name: 'Barney'
    description: 'Barney'
    runs:
      using: 'docker'
      image: 'Dockerfile'
    branding:
      icon: heart
      color: red
    
    action.yml 그런 다음 Dockerfile을 가리키며 재구매 계약의 루트 디렉토리에 있습니다.다음 파일을 Dockerfile 환매 협의에 추가합니다.
    FROM node:slim
    
    # A bunch of `LABEL` fields for GitHub to index
    LABEL "com.github.actions.name"="Body by Barney"
    LABEL "com.github.actions.description"="Auto-populate empty PR descriptions."
    LABEL "com.github.actions.icon"="edit"
    LABEL "com.github.actions.color"="purple"
    LABEL "repository"="http://github.com/YOUR_USERNAME/YOUR_REPO"
    LABEL "homepage"="http://github.com/YOUR_USERNAME/YOUR_REPO"
    LABEL "maintainer"="YOUR NAME (https://github.com/YOUR_USERNAME)"
    
    # install
    COPY package*.json ./
    RUN npm ci --only=production
    
    # start
    COPY . .
    ENTRYPOINT ["node", "/index.js"]
    
    Dockerfile 그리고 /index.js 이 동작의 나머지 부분에서 터치된 위치, 루트 디렉터리의 다른 파일을 가리킨다.다음 파일을 index.js 환매 협의에 추가합니다.여기서는 Barney가 새로 연 PRs에 적용되거나 필요한지 로그에 설명합니다.
    const { Toolkit } = require('actions-toolkit')
    const getPR = require('./lib/get-pr')
    const updatePR = require('./lib/update-pr')
    
    Toolkit.run(async tools => {
      const pr_result = await getPR(tools)
      tools.log.debug("PR_BODY=" + pr_result.data.body);
      if (!pr_result.data.body) {
        await updatePR(tools);
        tools.log.success('Barney has been applied.')
      } else {
        tools.log.success('No Barney needed.')
      }
    }, {
      event: ['pull_request.opened'],
      secrets: ['GITHUB_TOKEN']
    })
    
    index.js 현재 다른 파일이 있는 폴더lib/를 찾습니다.우리는 완전한 실현을 한 파일에 저장하지 않고, 이 조작의 구성 요소를 여러 부분으로 분리하여 코드가 다시 접근하고 재구성되지 않도록 한다.lib/는 두 개의 파일을 포함한다. get-pr.js는 PR 정보를 얻는 데 사용되고, update-pr.js는 API 호출을 보내는 데 사용되며, 설명에 Barney의 이미지가 포함되어 있다.
    다음 파일을 get-pr.js 환매 협의에 추가합니다.
    /**
     * Return the PR.
     * @param {import('actions-toolkit').Toolkit} tools
     */
    module.exports = async function getPR (tools) {
      return tools.github.pulls.get({
        ...tools.context.repo,
        pull_number: tools.context.payload.pull_request.number,
      })
    }
    
    다음 파일을 update-pr.js 환매 협의에 추가합니다.
    /**
     * Update the PR body with Barney.
     * @param {import('actions-toolkit').Toolkit} tools
     */
    module.exports = async function updatePR (tools) {
      const barney_img = 'https://user-images.githubusercontent.com/1390106/66919899-3a406900-eff0-11e9-83ba-4e6c4c3dbfaf.jpg';
      return tools.github.pulls.update({
        ...tools.context.repo,
        pull_number: tools.context.payload.pull_request.number,
        body: '![image](' + barney_img + ')'
      })
    }
    
    여기 있다!너는 네가 적절하다고 생각하는 어떤 내용으로도 확장할 수 있다. update-pr.js이 코드는 다음 그림에서 빈 PR 본문을 업데이트합니다.

    좋은 웹페이지 즐겨찾기