GitHub Actions 자습서 시작하기
GitHub Marketplace · 작업 흐름 개선을 위한 조치 · GitHub
개요
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 지속적 통합 및 지속적 배포(CI/CD) 플랫폼입니다. 리포지토리에서 각 풀 요청을 빌드 및 테스트하거나 병합된 풀 요청을 프로덕션에 배포하는 워크플로를 생성할 수 있습니다.
GitHub 작업 구성 요소
- 워크플로 워크플로
워크플로우는 하나 이상의 작업을 실행하는 구성 가능한 자동화 프로세스입니다. 워크플로우는 리포지토리에 체크인된 YAML 파일에 의해 정의되며 수동으로 또는 정의된 일정에 따라 리포지토리의 이벤트에 의해 트리거될 때 실행됩니다.
워크플로우는 .github/workflows
디렉토리에서 정의되며 리포지토리에는 각각 다른 작업 세트를 수행할 수 있는 여러 워크플로우가 있을 수 있습니다. 예를 들어 하나의 워크플로를 사용하여 풀 요청을 빌드하고 테스트하고, 다른 워크플로를 사용하여 릴리스가 생성될 때마다 애플리케이션을 배포하고, 다른 워크플로를 사용하여 새 문제를 열 때마다 태그를 추가할 수 있습니다.
- 이벤트
이벤트는 실행할 워크플로를 트리거하는 리포지토리의 특정 활동입니다. 예를 들어 활동은 GitHub에서 끌어오기 요청( pull request
)을 생성하거나 문제를 열거 open an issue
나( ) 리포지토리에 커밋( push an commit
)할 수 있습니다. REST API에 게시하거나 수동으로 예약된 워크플로를 트리거할 수도 있습니다.
- 직업
작업은 동일한 실행기에서 실행되는 워크플로의 일련의 단계입니다. 각 단계는 실행할 셸 스크립트이거나 실행할 작업입니다. 단계는 순차적으로 실행되며 서로 의존합니다. 각 단계는 동일한 러너에서 실행되므로 한 단계에서 다른 단계로 데이터를 공유할 수 있습니다. 예를 들어 애플리케이션을 생성하는 단계와 생성된 애플리케이션을 테스트하는 단계가 있을 수 있습니다.
- 행위
작업은 복잡하지만 종종 반복적인 작업을 수행하는 GitHub Actions 플랫폼의 사용자 지정 애플리케이션입니다. 작업을 사용하여 워크플로 파일에 작성하는 반복 코드의 양을 줄이는 데 도움이 됩니다. 작업은 GitHub에서 git 리포지토리를 가져오거나, 빌드 환경을 위한 올바른 도구 체인을 설정하거나, 클라우드 공급자에 대한 인증을 설정할 수 있습니다. o
- 러너
실행기는 트리거될 때 워크플로를 실행하는 서버입니다. 각 러너는 한 번에 하나의 작업을 실행할 수 있습니다. GitHub는 Ubuntu Linux, Microsoft Windows 및 macOS 실행기를 제공하여 워크플로를 실행하며, 각 워크플로 실행은 새로 구성한 새로운 가상 머신에서 실행됩니다. GitHub는 또한 더 큰 구성을 허용하는 더 큰 러너를 제공합니다.
컨텍스트 컨텍스트
자세한 내용은 컨텍스트 - GitHub Docs를 참조하세요.
개념
컨텍스트 컨텍스트는 워크플로의 각 단계에 대한 정보입니다. 예를 들어 env.sha
, 자신이 설정한 환경 변수에 있는 변수입니다 sha
.
컨텍스트의 컨텍스트 유형
컨텍스트 유형은 워크플로 단계와 연결됩니다.
다음과 같은 11가지 유형이 있습니다.
github、env、job、jobs、steps、runner、secrets、strategy、matrix、needs、inputs
액세스 컨텍스트
표현식 구문을 사용하여 컨텍스트에 액세스할 수 있습니다.
${
{ <context>.<attribute> }}
또는${
{ <context>[attribute]}}
secrets
문맥
secrets
창고의 설정 표시줄에 있는 조치 옵션을 통해 설정할 수 있습니다.
워크플로우 예시
1. 파일 디렉토리 생성
리포지토리에서 .github/workflow/
워크플로 파일을 저장할 디렉터리를 만듭니다.
[외부 링크 사진 전송 실패, 원본 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다(img-dTqkORYs-1672369344358)(file:///home/hhoa/document/blog/assets/2022-12-22-19-00-28-image.png?msec=1672369340086)]
2. 워크플로 파일 구성
기본 워크플로우 파일
트리거를 위한 작업 흐름, 아래의 재사용 가능한 작업 흐름 참조
배포 프로젝트.yml
# 工作流名称
name: Deploy Project
# 工作流触发设置
on:
# push进入仓库时触发
push:
# 分支条件设置
branches:
- main
# 工作流作业
jobs:
# 作业名称
deploy-project:
# 使用可复用工作流
# 也可以通过GitHub仓库引用自己或其他人的工作流
uses: ./.github/workflows/deploy.yml
# 使用策略复用工作流,例如它会并发执行project-name为vblog-server-admin、
# vblog-server-portal、vblog-server-search 的作业,
strategy:
# 矩阵,就是搭配出各种可能,依次复用,可以有多维矩阵
matrix:
# 矩阵的一行,行名称用于引用(可以有多行,多列)
project-name: [ vblog-server-admin, vblog-server-portal, vblog-server-search ]
# 发送过去的普通属性
with:
# 引用上面的矩阵
project-name: ${
{
matrix.project-name }}
# 秘密,秘密可以在仓库中设置,可复用工作流要获取秘密属性,只能通过这里传播过去之后获取
secrets:
# server-host是自定义的秘密名,后面为引用仓库的秘密
server-host: ${
{
secrets.SERVER_HOST }}
mysql-root-password: ${
{
secrets.MYSQL_ROOT_PASSWORD }}
jwt-secret: ${
{
secrets.JWT_SECRET }}
elastic-password: ${
{
secrets.ELASTIC_PASSWORD }}
docker-username: ${
{
secrets.DOCKER_USERNAME }}
docker-password: ${
{
secrets.DOCKER_PASSWORD }}
재사용 가능한 워크플로우 파일
재사용 가능한 워크플로우는 이름에서 알 수 있듯이 위의 기본 워크플로우와 비교하여 재사용 가능한 워크플로우입니다.
재사용 가능한 공식 워크플로우 플랫폼 https://github.com/marketplace/actions
플랫폼에서 재사용 가능한 워크플로를 사용할 수 있는 경우 플랫폼에서 재사용 가능한 워크플로를 사용하십시오.
배포.yml
# 工作流名称
name: Deploy
# 设置触发条件
on:
# 说明该工作流为可复用工作流(可被其他工作流引用)
workflow_call:
# 定义参数,就和函数参数一样
# function inputs(string project-name){}
inputs:
# 自定义参数名
project-name:
# 设置是否必须
required: true
# 类型(必要)
type: string
# 安全参数,只能
secrets:
# 自定义参数名
server-host:
# 是否必须
required: true
mysql-root-password:
required: true
jwt-secret:
required: true
elastic-password:
required: true
docker-username:
required: true
docker-password:
required: true
# 工作流作业
jobs:
# 自定义作业名称
check-update:
# 运行时名称
name: Check if the project is updated
# 运行的操作系统
runs-on: ubuntu-latest
# 其他作业能从该作业获取的变量设置
outputs:
# 自定义变量, 该变量为步骤2输出的 'is_update' 变量
is_update: ${
{
steps.step2.outputs.is_update }}
# 设置步骤名称
steps:
# 步骤 id 用于上面的outputs
- id: step1
# 步骤名
name: Check out the repository
# 复用其他仓库的工作流 "actions/checkout",该工作流的作用是拉取最近仓库的代码
uses: actions/checkout@v3
# 设置输入到复用工作流属性
with:
# 拉取仓库的深度,这是 "actions/checkout" 工作流规定的
fetch-depth: 2
# 步骤 id 用于上面的outputs
- id: step2
# 步骤名
name: Check out project update
# 在设置的操作系统的 shell 或 bash 上运行脚本,该脚本的功能是检测传入项目是否更新
run: |
if [ -n "$(git diff HEAD^ -- ${
{ inputs.project-name }})" ];
then
echo "is_update=true" >> $GITHUB_OUTPUT
fi
# 自定义作业名称
push-to-docker-registry:
# 依赖 check-update, 只有check-update 运行完才开始启动
needs: check-update
# 运行时名称
name: Build, test and push docker image to docker hub
# 运行的操作系统
runs-on: ubuntu-latest
# 运行条件,这里使用了上面作业输出的 is_update变量
if: ${
{
needs.check-update.outputs.is_update == 'true' }}
# 设置步骤名称
steps:
# 使用可复用工作流,拉取最新代码
- name: Check out the repo
uses: actions/checkout@v3
# 使用可复用工作流,安装JDK17
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
# 验证gradle包是否错误
- name: Checkout gradle
uses: gradle/wrapper-validation-action@v1
# 安装Gradle
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
# 运行Gradle进行构建
- name: Run build with Gradle wrapper
# 设置进行构建时的环境变量,环境变量会输入运行操作系统的环境变量中
env:
# 这里通过主工作流输入的秘密设置环境变量
SERVER_HOST: ${
{
secrets.server-host }}
MYSQL_ROOT_PASSWORD: ${
{
secrets.mysql-root-password }}
JWT_SECRET: ${
{
secrets.jwt-secret }}
ELASTIC_PASSWORD: ${
{
secrets.elastic-password }}
run: |
./gradlew :${
{ inputs.project-name }}:build;
# 上传构建完成后的报告
- name: Upload build reports
uses: actions/upload-artifact@v3
with:
name: build-reports
path: build/reports/
# 登陆Docker Hub
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${
{
secrets.docker-username }}
password: ${
{
secrets.docker-password }}
# 获取Docker tags和 labels
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: ${
{
secrets.docker-username }}/${
{
inputs.project-name }}
# 通过上面步骤获取的tags和labels构建docker 镜像
- name: Build and push Docker image
uses: docker/build-push-action@v3
with:
context: ./${
{
inputs.project-name }}
push: true
tags: ${
{
steps.meta.outputs.tags }}
labels: ${
{
steps.meta.outputs.labels }}
3. 코드를 누르면 워크플로가 자동으로 실행됩니다.
4. 워크플로 보기
워크플로가 트리거되면 워크플로를 실행하는 워크플로 실행이 생성됩니다. 워크플로 실행이 시작되면 실행 진행 상황을 시각화하고 GitHub에서 각 단계의 활동을 볼 수 있습니다.