GitHub Actions 자습서 시작하기

GitHub Actions 자습서 시작하기

GitHub Marketplace · 작업 흐름 개선을 위한 조치 · GitHub

개요

GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 지속적 통합 및 지속적 배포(CI/CD) 플랫폼입니다. 리포지토리에서 각 풀 요청을 빌드 및 테스트하거나 병합된 풀 요청을 프로덕션에 배포하는 워크플로를 생성할 수 있습니다.

GitHub 작업 구성 요소

  1. 워크플로 워크플로

워크플로우는 하나 이상의 작업을 실행하는 구성 가능한 자동화 프로세스입니다. 워크플로우는 리포지토리에 체크인된 YAML 파일에 의해 정의되며 수동으로 또는 정의된 일정에 따라 리포지토리의 이벤트에 의해 트리거될 때 실행됩니다.

워크플로우는 .github/workflows디렉토리에서 정의되며 리포지토리에는 각각 다른 작업 세트를 수행할 수 있는 여러 워크플로우가 있을 수 있습니다. 예를 들어 하나의 워크플로를 사용하여 풀 요청을 빌드하고 테스트하고, 다른 워크플로를 사용하여 릴리스가 생성될 때마다 애플리케이션을 배포하고, 다른 워크플로를 사용하여 새 문제를 열 ​​때마다 태그를 추가할 수 있습니다.

  1. 이벤트

이벤트는 실행할 워크플로를 트리거하는 리포지토리의 특정 활동입니다. 예를 들어 활동은 GitHub에서 끌어오기 요청( pull request)을 생성하거나 문제를 열거 open an issue나( ) 리포지토리에 커밋( push an commit)할 수 있습니다. REST API에 게시하거나 수동으로 예약된 워크플로를 트리거할 수도 있습니다.

  1. 직업

작업은 동일한 실행기에서 실행되는 워크플로의 일련의 단계입니다. 각 단계는 실행할 셸 스크립트이거나 실행할 작업입니다. 단계는 순차적으로 실행되며 서로 의존합니다. 각 단계는 동일한 러너에서 실행되므로 한 단계에서 다른 단계로 데이터를 공유할 수 있습니다. 예를 들어 애플리케이션을 생성하는 단계와 생성된 애플리케이션을 테스트하는 단계가 있을 수 있습니다.

  1. 행위

작업은 복잡하지만 종종 반복적인 작업을 수행하는 GitHub Actions 플랫폼의 사용자 지정 애플리케이션입니다. 작업을 사용하여 워크플로 파일에 작성하는 반복 코드의 양을 줄이는 데 도움이 됩니다. 작업은 GitHub에서 git 리포지토리를 가져오거나, 빌드 환경을 위한 올바른 도구 체인을 설정하거나, 클라우드 공급자에 대한 인증을 설정할 수 있습니다. o

  1. 러너

실행기는 트리거될 때 워크플로를 실행하는 서버입니다. 각 러너는 한 번에 하나의 작업을 실행할 수 있습니다. 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에서 각 단계의 활동을 볼 수 있습니다.
사진 설명을 추가해주세요

사진 설명을 추가해주세요

사진 설명을 추가해주세요

참고

  1. GitHub 작업 설명서 - GitHub Docs

  2. GitHub Marketplace · 작업 흐름 개선을 위한 조치 · GitHub

Guess you like

Origin blog.csdn.net/HHoao/article/details/128492750