[OCA] 파워플랫폼 챌린저스 - 3주차

오경찬·2022년 7월 30일
0

GitHub Action

이번주는 GitHub Action에 대해서 진행을 하였다.


두개를 잘깔아준후 github과 연동하여 하나를 새로 파준다.

연동시켜준 .github/workflows아래의 main.yml파일에 아래의 코드를 작성한다.

name: 'My First GitHub Actions Workflow'

on: push

jobs:
  fist-job:
    name: 'first Job'
    runs-on: 'ubuntu-latest'

    steps:
      - name: 'Say Hello World on step 1'
        shell: bash
        run: |
          echo "Hello World from Step 1"

      - name: 'Say Lorem Ipsum on step 2'
        shell: pwsh
        run: |
          echo "Lorem Ipsum from step 2"

작성후 깃허브에 Push를 하고 Actions를 보면 Fisrt Job이 실행되어 있다!

실행이 잘되어 보인다!

name: 'My First GitHub Actions Workflow'

on: push

env:
  WORKFLOW_LEVEL: 'This value comes fom the workflow level'

jobs:
  fist-job:
    name: 'first Job'
    runs-on: 'ubuntu-latest'

    env:
      JOB_LEVEL_1: 'This value comes from the job 1'
    steps:
      - name: 'Say Hello World from step 1'
        shell: bash
        env:
          STEP_LEVEL_1: 'This value comes fom the step 1'
        run: |
          echo "Hello World from Step 1"
          echo "$WORKFLOW_LEVEL"
          echo "$JOB_LEVEL_1"
          echo "$JOB_LEVEL_2"
          echo "$STEP_LEVEL_1"
          echo "$STEP_LEVEL_2"

      - name: 'Say Lorem Ipsum on step 2'
        shell: pwsh
        env:
          STEP_LEVEL_2: 'This value comes from the step 2'
        run: |
          echo "Lorem Ipsum from step 2"
          echo "$env:WORKFLOW_LEVEL"
          echo "$env:JOB_LEVEL_1"
          echo "$env:JOB_LEVEL_2"
          echo "$env:STEP_LEVEL_1"
          echo "$env:STEP_LEVEL_2"

  second-job:
    name: 'Second Job'
    runs-on: 'ubuntu-latest'
    env:
      JOB_LEVEL_2: 'This value comes from the job 2'
    steps:
      - name: 'Say Hello World on step 1'
        shell: bash
        env:
          STEP_LEVEL_1: 'This value comes from the step 1'
        run: |
          echo "Hello World from Step 1"
          echo "$WORKFLOW_LEVEL"
          echo "$JOB_LEVEL_1"
          echo "$JOB_LEVEL_2"
          echo "$STEP_LEVEL_1"
          echo "$STEP_LEVEL_2"

      - name: 'Say Lorem Ipsum on step 2'
        shell: pwsh
        env:
          STEP_LEVEL_2: 'This value comes from the step 2'
        run: |
          echo "Lorem Ipsum on step 2"
          echo "$env:WORKFLOW_LEVEL"
          echo "$env:JOB_LEVEL_1"
          echo "$env:JOB_LEVEL_2"
          echo "$env:STEP_LEVEL_1"
          echo "$env:STEP_LEVEL_2"

으로 수정을 하여 푸쉬하게 되면

first Job에서 step1에서는 second Job이 안보이며 step2도 안보이게 된다.

step2에서는 마찬가지로 step1이 안보이게 된다

반대로 second Job에서는 first Job이 안보이게 된다 이렇게 환경변수의 위치가 중요하다!

name: 'My First GitHub Actions Workflow'

on: push

env:
  WORKFLOW_LEVEL: 'This value comes fom the workflow level'

jobs:
  fist-job:
    name: 'first Job'
    runs-on: 'ubuntu-latest'

    steps:
      - name: 'Set environment variable 1'
        shell: bash
        run: |
          echo $GITHUB_ENV
          echo "STEP_1='This value comes from the step 1'" >> $GITHUB_ENV

      - name: 'Set environment variable 2'
        shell: pwsh
        run: |
          echo "STEP_2='This value comes from the step 2'" `
          | Out-File -FilePath $env:GITHUB_ENV -Encoding utf-8 -Append

      - name: 'Get environment variables'
        shell: bash
        run: |
          echo "WORKFLOW: ${{ env.WORKFLOW_LEVEL }}"
          echo "STEP 1: ${{ env.STEP_1 }}"
          echo "STEP 2: ${{ env.STEP_2 }}"

위의 코드대로 환경변수를 github에 저장할수 있다 아래의 사진을 보자

power shell과 bash는 변수 가져오는 방식이 다름
github atcion은 ${{}} 형식으로 쓴다
위 사진과 같이 데이터 들이 전부 잘나오는것을 알수가 있다

name: 'My First GitHub Actions Workflow'

on: push

env:
  WORKFLOW_LEVEL: 'This value comes fom the workflow level'

jobs:
  fist-job:
    name: 'first Job'
    runs-on: 'ubuntu-latest'

    steps:
      - name: 'Set output value 1'
        id: step1
        shell: bash
        run: |
          STEP_1='This value comes from the step 1'

          echo "::add-mask::$STEP_1"
          echo "::set-output name=value1::$STEP_1"

      - name: 'Set output value 2'
        id: step2
        shell: pwsh
        run: |
          $STEP_2='This value comes from the step 2'

          echo "::set-output name=value2::$STEP_2"

      - name: 'Get output values'
        shell: bash
        run: |
          echo "STEP 1: ${{ steps.step1.outputs.value1 }}"
          echo "STEP 2: ${{ steps.step2.outputs.value2 }}"

위코드를 사용하면 아래 사진과 같은 값이 나오는데

output value 1의 값을 step1에 할당한다.
set-output이라는것이 다른 step에서 참조할수 있게 만들어준다,
add-mask를 적용하면 참조하는 값이 ***으로 변환되어 나오게 된다

GitHub설정에서 Actions secrets를 설정해줄수 있는데 SECRET_1을 Hello World로 설정해주도록 합니다.

설정해주면 이렇게 생성되었다고 나오게 되는데


이렇게 시크릿 값도 나오게 된다 시크릿 값이기 때문에 add-mask처럼 ***로 나오게 된다

다른 OS

name: 'My First GitHub Actions Workflow'

on: push

jobs:
  fist-job:
    name: 'first Job'
    strategy:
      matrix:
        os: ['windows-latest', 'ubuntu-latest', 'macos-latest']

    runs-on: ${{ matrix.os }}

    steps:
      - name: 'Say Hello on ${{ matrix.os }}'
        shell: bash
        run: |
          echo "Hello from ${{ matrix.os }}"

os부분에서 windows, ubuntu, macos를 각각 넣어줘서 총 3번이 다른 os에서 실행되게 해주는것이다.


사진을 보면 first Job이 3개 생기고 모두 다른 os 인것을 확인할수 있다.

노드 버전이 까지 돌리게 하면

name: 'My First GitHub Actions Workflow'

on: push

jobs:
  fist-job:
    name: 'first Job'
    strategy:
      matrix:
        os: ['windows-latest', 'ubuntu-latest', 'macos-latest']
        nodejs: ['14.x', '16.x']
    runs-on: ${{ matrix.os }}

    steps:
      - name: 'Setup node.js version'
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.nodejs }}

      - name: 'Check node.js version on ${{ matrix.os }}'
        shell: bash
        run: |
          echo "nodejs version: $(node --version)"


14.x와 16.x를 해주면 총 3x2=6번을 돌리는걸 확인할수 있다.

name: 'My First GitHub Actions Workflow'

on: push

jobs:
  fist-job:
    name: 'first Job'
    strategy:
      matrix:
        os: ['windows-latest', 'ubuntu-latest', 'macos-latest']
        nodejs: ['14.x', '16.x']
    runs-on: ${{ matrix.os }}

    steps:
      - name: 'Setup node.js version'
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.nodejs }}

      - name: 'Run only on Windows'
        if: matrix.os == 'windows-latest'
        shell: bash
        run: |
          echo "Windows Only"

      - name: 'Run not on Windows'
        if: matrix.os != 'windows-latest'
        shell: bash
        run: |
          echo "Not Windows"

      - name: 'Check node.js version on ${{ matrix.os }}'
        shell: bash
        run: |
          echo "nodejs version: $(node --version)"

조건에따라 action을 실행

name: 'My First GitHub Actions Workflow'

on: push

jobs:
  fist-job:
    name: 'first Job'
    if: github.event_name == 'pull_request'
    strategy:
      matrix:
        os: ['windows-latest', 'ubuntu-latest', 'macos-latest']
        nodejs: ['14.x', '16.x']
    runs-on: ${{ matrix.os }}

    steps:
      - name: 'Setup node.js version'
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.nodejs }}

      - name: 'Run only on Windows'
        if: matrix.os == 'windows-latest'
        shell: bash
        run: |
          echo "Windows Only"

      - name: 'Run not on Windows'
        if: matrix.os != 'windows-latest'
        shell: bash
        run: |
          echo "Not Windows"

      - name: 'Check node.js version on ${{ matrix.os }}'
        shell: bash
        run: |
          echo "nodejs version: $(node --version)"

같은 코드에서 if를 걸어 pull_request에만 실행되게 할수있다.

push에 동작 되어있기 때문에 actions가 비활성화 된것을 볼수 있다.

순서 설정

name: 'My First GitHub Actions Workflow'

on: push

jobs:
  build-job:
    name: 'build Job'

    runs-on: ubuntu-latest

    steps:
      - name: 'Say Hello'
        shell: bash
        run: |
          echo "Hello World"

  deploy-to-dev-job:
    name: 'Deployment Job to DEV'
    needs:
      - build-job

    runs-on: ubuntu-latest

    steps:
      - name: 'Say DEV'
        shell: bash
        run: |
          echo "DEVELOPERS"
  deploy-to-prod-job:
    name: 'Deployment Job to PROD'
    needs:
      - build-job

    runs-on: ubuntu-latest

    steps:
      - name: 'Say PROD'
        shell: bash
        run: |
          echo "PRODUCTION"


needs를 적용하여 build-job작업이 끝난 이후에 나머지 작업이 실행되는것을 볼수 있다.

name: 'My First GitHub Actions Workflow'

on: push

jobs:
  build-job:
    name: 'build Job'

    runs-on: ubuntu-latest

    steps:
      - name: 'Say Hello'
        shell: bash
        run: |
          echo "Hello World"

  deploy-to-dev-job:
    name: 'Deployment Job to DEV'
    needs:
      - build-job

    runs-on: ubuntu-latest

    steps:
      - name: 'Say DEV'
        shell: bash
        run: |
          echo "DEVELOPERS"
  deploy-to-qa1-job:
    name: 'Deployment Job to QA1'
    needs:
      - deploy-to-dev-job

    runs-on: ubuntu-latest

    steps:
      - name: 'Say DEV'
        shell: bash
        run: |
          echo "DEVELOPERS"
  deploy-to-qa2-job:
    name: 'Deployment Job to QA2'
    needs:
      - deploy-to-dev-job

    runs-on: ubuntu-latest

    steps:
      - name: 'Say DEV'
        shell: bash
        run: |
          echo "DEVELOPERS"

이런식으로 needs를 설정하면


이런 형식으로 체이닝이 가능하다.

https://github.com/dhrudcks01/GitHub-Action

profile
코린이 입니당 :)

0개의 댓글