Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

블로그 글 1,500 돌파 기념 이벤트

2014년에 1,000번째 글을 올리면서 기록을 남겼는데 어느새 이 글의 번호가 1,511이 되었다. 중간에 여러 사정으로 쓰다가 없어진 번호가 있어서 정확한 글 개수는 1,489개이다. 매번 숫자를 확인하는 건 아니라서 모르고 있다가 며칠 전에 1,500이 넘었다는 걸 깨달았다. 물론 글 개수가 1,500이 넘은 건 아니었지만 7년 만에 1,000개의 글을 쓰고 예전보단 글을 좀 적게 써서 6년 만에 500개 가까운 글을 썼다.

SNS에서 글이 1,500개가 넘었네.. 하고(정확히는 안 넘었지만...) 글을 쓰다 보니 누가 이벤트를 하면 후원해주겠다고 해서 농담으로 댓글 달다 보니까 정말 후원을 해주셔서 갑자기 1,500 이벤트를 하게 되었다. 실제 글 개수가 1,500이 되려면 12월이나 내년 1월이 되어야 하겠지만 시퀀스가 1,500이 넘었으니 크게 중요하진 않을 테고 후원을 받은 관계로 이 블로그에서 한 번도 하지 않았던 1,500 이벤트를 하게 되었다.

전혀 계획에 없었지만, 이벤트 상품을 후원받게 되어 이벤트를 하게 되었다. 어떤 이벤트를 해야 하나 고민을 많이 하다가 블로그가 더 발전하는 방향으로 이벤트를 해야겠다는 생각이 들어서 아래와 같은 이벤트 기획을 하게 되었다.

1,500 이벤트

이 글의 댓글로 블로그에서 개선했으면 하는 내용을 댓글로 남겨주세요. 댓글은 utterances를 쓰고 있음으로 GitHub 계정이 있어야 합니다. 개선하는 내용은 아무거나 상관없습니다. 작성했으면 하는 글의 주제여도 되고 블로그 테마나 시스템에서 가독성이 안 좋다거나 어떤 기능이 있어야 한다거나 버그가 있다거나 어떤 개선 내용이어도 상관없습니다.

댓글을 남겨주신 분들을 추첨해서 상품을 드리겠습니다. 추첨은 공정성을 위해서 YouTube 채널에서(아직 YouTube를 제대로 운영하고 있지 않지만...) 진행하겠습니다. 오늘이 13일이니 일주일 후인 11월 20일 자정까지 남겨진 댓글을 대상으로 추첨에서 아래의 상품을 보내드리겠습니다.(얼마나 참가하실지는 저도 모르지만... ㅎㅎㅎ)

상품

상품 #1: B모 배달 서비스 만원 쿠폰 5명

Boot Spring Boot! 책의 저자이신 블로그를 운영하시는 허니몬님이 후원해 주신 B모 배달 서비스의 10,000원 쿠폰을 5분에게 드립니다.(이 상품이 이 이벤트의 시작!)

B모 배달 서비스 쿠폰


상품 #2: GitHub 스티커 팩 3명

GitHub Stars SWAG로 받은 스티커 팩입니다. GitHub에서 스티커 팩은 한 팩에 $5에 판매 중인데 여기서 스티커 사본지가 오래되어서 정확하진 않지만 판매하는 스티커 팩보다 한 팩에 많이 들어 있습니다. 한 팩에 대략 40개 정도의 GitHub 스티커가 들어있습니다. 3팩이 있습니다.

GitHub 스티커 팩


상품 #3: Outsider 스티커 10명

좀 민망한 상품이지만... 제 프로필 이미지 스티커 30매입니다. 참고로 제가 만든 건 아니고 선물 받은 거고 종이 스티커입니다. 어디다 쓰실진 저도 잘 모르겠지만 한 팩당 30장씩 묶어서 보내드리고 총 10분에게 보내드립니다.

Outsider 프로필 이미지 스티커


앞에서 말씀드린 대로 20일 자정까지 이 글의 댓글로 달린 분으로만 추첨할 계획이고 다음 주 주말(21~22일)에 YouTube로 방송해서 추첨할 생각이지만 아직 정확한 시간은 아직 정하지 않았습니다. 몇 분이나 참여하실지 모르기 때문에 추첨 이후 이메일이나 주소는 댓글을 통해서 요청하겠습니다.

추가로 이벤트 상품 후원을 해주고 싶으신 분은 저한테 연락해 주시면 추가해드리겠습니다. Twitteroutsideris@gmail.com으로 연락하시면 확인 후에 추가해 드리겠습니다.

2020/11/14 00:11 2020/11/14 00:11

GitHub Actions 워크플로우 사용하기

2018년에 GitHub Actions가 처음 발표되고 간단히 Actions를 사용하는 방법에 관해 글을 올렸다.

전체적인 배경이나 컨셉 등은 유지되었지만 일단 사용법이 완전히 달라졌다. 일단 GUI로 설정하는 부분이 사라졌고 HCL에서 YAML로 바뀌었다. 내가 좋아하던 HCL이 도입되어 좋아했지만 여러 상황에 한계를 느꼈는지 요즘 인프라스트럭처를 설정할 때 많이 사용하는 YAML로 바뀌었다. 그래서 혹 검색을 통해서 내 글에 유입될 사람들이 걱정만 하다가 YAML로 바뀐 지는 1년이 되었지만, GitHub Actions를 사용하는 글을 다시 정리한다.

GitHub Actions

GitHub Actions는 CI/CD에 모두 사용할 수 있다. CI로 쓴다는 의미는 테스트 실행이나 빌드 검사, 컨벤션 검사를 통해 코드가 의도대로 동작하고 잘 작성되었는지를 확인할 수 있다는 의미이고 CD는 서버에 배포하거나 레지스트리에 발행하는 등의 행위를 할 수 있다는 의미이다. CI 서비스는 Travis CI, circleci, Azure DevOps등 많이 있지만, 설정을 대부분 비슷하기 때문에 CI 서비스 설정을 해봤다면 어렵지 않게 설정할 수 있다.

GitHub 문서에 잘 나와 있는데 언어별로 다 설정할 수는 없음으로 간단한 Node.js 프로젝트의 CI를 설정해 보자.

GitHub에서 제안하는 워크플로우 템플릿

저장소의 액션 메뉴에 들어가면 저장소 주 언어에 따라서 추천 템플릿을 제공한다. YAML 파일이므로 직접 작성해도 되지만 처음 사용한다면 템플릿을 기반으로 수정하는 게 좋다.

템플릿을 선택하니 보여주는 YAML 파일

템플릿을 선택하면 GitHub에서 제공하는 기본적인 CI가 설정된 파일을 제공하고 여기서 필요에 따라 수정하고 바로 커밋할 수 있다. 위에서 선택한 Node.js 템플릿 파일은 아래와 같이 생겼다.

# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: Node.js CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [10.x, 12.x, 14.x]

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

문법을 모두 설명하긴 어려우므로 위 예제 파일을 간단히 살펴보자.

name: Node.js CI

name은 이 워크플로우의 이름이다. GitHub Actions에서는 다수의 워크플로우를 설정할 수 있는데 파일마다 하나씩 설정할 수 있다. 이해하기 쉬운 이름을 주면 되고 Actions에서 아래처럼 표시가 된다.

workflow에 보이는 설정한 CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

on은 필수값으로 워크플로우가 어떤 이벤트에 대해서 실행될지를 지정할 수 있다. 위에서는 pushpull_reqeustmaster 브랜치에 대해서 설정한 것인데 간단하게 on: [push, pull_request]로 설정하는 것도 가능하다.

jobs:
  build:

jobs에서 위에서는 jobs.build로 되어 있는데 실제 문법은 jobs.<job_id>가 된다. build는 임의로 지정한 이름이고 아무 이름이나 지정할 수 있다. 여기서는 build라는 잡 하나만 있지만 이름처럼 여러 개의 잡을 설정할 수 있다는 의미이다.

runs-on: ubuntu-latest

runs-on은 잡을 실행할 운영체제로 Windows, Linux, macOS를 지정할 수 있고 노드를 직접 운영하는 경우에는 self-hosted를 지정할 수도 있다.

strategy:
  matrix:
    node-version: [10.x, 12.x, 14.x]

strategy는 위 설정처럼 같은 잡을 여러 버전의 환경에서 실행하고 싶을 때 행렬을 구성한다. 위에서는 Node.js 10, 12, 14버전에서만 실행했지만 os까지 지정하면 더 복잡한 행렬을 구성할 수도 있다.

steps:
  - uses: actions/checkout@v2
  - name: Use Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v1
    with:
      node-version: ${{ matrix.node-version }}
  - run: npm ci
  - run: npm run build --if-present
  - run: npm test

jobs.<job_id>.steps가 잡의 실제 동작을 정의하는 부분이다.

jobs.<job_id>.steps.uses는 각 스텝에서 사용할 액션을 지정한다. 액션은 Marketplace에서 찾을 수 있는데 이미 다른 회사나 사람들이 만들어서 올려둔 액션을 가져다가 설정만 해서 사용할 수 있다.

위에서는 Checkout 액션Setup Node.js environment 액션 사용한 것이다. 이름에서 알 수 있듯이 저장소의 소스 코드를 체크아웃해서 가져오고 원하는 Node.js 버전을 설정한 것이다.

jobs.<job_id>.steps.run은 시스템의 shell에 명령어를 실행하는 부분이다. - run: npm ci처럼 한 줄로 쓸 수 있지만, 다음처럼 이름을 지정할 수도 있다. 이는 UI에서 각 스텝에 표시되는 이름이므로 적절하게 사용하면 된다.

- name: Install Dependencies
  run: npm install

이렇게 설정한 스텝은 GitHub에서 다음과 같이 표시된다.

설정한 Job에서 실행된 step

Workflow syntax for GitHub Actions 문서를 참고하면 다양한 설정을 할 수 있다.

이 파일은 .github/workflows 아래 생성해서 넣으면 되는데 GitHub 사이트에서 직접 만들어도 되고 로컬에서 YAML 파일을 만들어서 올려도 된다. 워크플로우 파일이 생기면 자동으로 Actions이 설정되므로 쉽게 사용할 수 있다. 회사에서 Azure DevOps도 쓰고 있는데 분명 둘이 같은 시스템은 아닌데 쓰다 보면 묘하게 비슷하게 느껴지는 부분이 꽤 있다.

CI의 사용성은 보기에는 편해 보이지만 막상 쓰다 보면 불편하거나 설정이 어려운 부분이 생기고 이상한 문제를 만나서 시간을 꽤 허비하게 되는 게 어느 CI를 쓰거나 비슷하게 느껴지는 편이다. 그런데도 GitHub Actions의 가장 큰 장점은 GitHub에 붙어있다는 점이고 이 부분만으로도 다른 CI 서비스에 큰 위협이 될 만하다고 본다. 내가 쓰는 프로젝트도 점점 GitHub Actions로 넘어가고 있다.

마지막으로 GitHub Actions의 가격정책을 보면 공개 저장소에서는 무료로 사용할 수 있고 비공개 저장소에서는 매월 2,000분의 실행 시간까지는 무료로 사용할 수 있다.

2020/11/12 22:16 2020/11/12 22:16