초보자 친화적인 Github 운영 세션 4개
나는 단독 환매 협의를 만들어서 초기 PRs를 테스트함으로써 이 부분들을 검증했다.더 빈틈없는 개발 체험을 원한다면, 작업 흐름을 검증하기 위해nektos/act를 CLI로 사용하는 것을 권장합니다.
네크토스 / 비헤이비어
GitHub 작업을 로컬에서 실행🚀
개술
"Think globally, act
locally"
로컬에서 실행GitHub Actions!왜 이러는 거야?두 가지 이유:
"Think globally, act
locally"
빠른 피드백 - 파일에 대한 변경 사항을 항상 제출/푸시할 필요 없이
.github/workflows/
파일에서 수행한 변경 사항(또는 내장된 GitHub 작업에 대한 변경 사항)을 로컬에서 실행할 수 있습니다act
.environment variables 및 filesystem 모두 GitHub에서 제공하는 기능과 일치하도록 구성되었습니다.로컬 퀘스트 주자 - 사랑해요make.하지만 나도 나 자신을 되풀이하는 것을 싫어한다.
act
를 사용하면 .github/workflows/
에 정의된 GitHub 작업 교체Makefile
를 사용할 수 있습니다!그것은 어떻게 일합니까? act
를 실행하면 .github/workflows/
에서 GitHub 작업을 읽고 실행할 작업 세트를 결정합니다.Docker API를 사용하여 워크플로에 정의된 대로 필요한 이미지를 추출하거나 구성합니다.
View on GitHub
세션 목록
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 본문을 업데이트합니다.
Reference
이 문제에 관하여(초보자 친화적인 Github 운영 세션 4개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/pepperwood/4-beginner-friendly-github-actions-snippets-4n72
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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로 임시 스크립트를 작성하여 상하문 전환을 줄일 수 있다.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 본문을 업데이트합니다.
Reference
이 문제에 관하여(초보자 친화적인 Github 운영 세션 4개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/pepperwood/4-beginner-friendly-github-actions-snippets-4n72
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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 본문을 업데이트합니다.Reference
이 문제에 관하여(초보자 친화적인 Github 운영 세션 4개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pepperwood/4-beginner-friendly-github-actions-snippets-4n72텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)