이번주는 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처럼 ***
로 나오게 된다
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)"
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를 설정하면
이런 형식으로 체이닝이 가능하다.