GiitHub Action의 일회용 DB 활용

13516 단어 GitHub ActionsCItech

개시하다


GiitHub Actions에서 테스트를 진행할 때 매번 일회용 DB를 설치해 이 DB를 이용한 테스트 방법을 조사한다.

컨디션


글을 쓸 때 만들어진 샘플 코드는 지티허브KentarouSuzuki/actions-service-container에 업로드됐으니 필요에 따라 참고하시기 바랍니다.
이번에는 Go로 구현했다.원래 Go에 테스트 코드를 쓸 때hoge_test.go라는 파일 이름을 썼는데 이번에cmd/sample/main.go에 코드를 썼다.
데이터베이스
PostgreSQL
언어
Go 1.14
마이그레이션 도구
rubenv/sql-migrate

테스트 순서


다음 순서에 따라 테스트를 진행한다.
  • GiitHub에서 소스 코드를 꺼냅니다.
  • DB 마이그레이션을 수행합니다.
  • Acount표 제작
  • 테스트 코드를 실행합니다.
  • 데이터 추가
  • 추가된 모든 데이터를 가져와 표준 출력에 표시
  • 모든 데이터 삭제
  • 서비스 컨테이너


    GiitHub Actions의 워크플로우에서 DB에 연결하여 테스트를 수행하려면 GiitHub Action서비스 컨테이너을 사용합니다.이 서비스 컨테이너의 진짜 모습은 Docker 컨테이너로 Docker Hub 이미지를 지정하고 만드는 것입니다.이 글은 PostgreSQL을 사용하거나 MySQL 등 다른 RDB, Redis,nginx를 사용할 수 있다.
    예를 들어, 작업을 수행할 때 PostgreSQL의 서비스 컨테이너를 준비하려면 다음과 같이 하십시오.
    jobs:
      my-job:
        runs-on: ubuntu-latest
        services:
          postgres:
            # Docker Hubのイメージ
            image: postgres
            # 動かすコンテナで使う環境変数
            # この場合はpostgresqlのパスワードを指定している。
            env:
              POSTGRES_PASSWORD: postgres
            options: >-
              --health-cmd pg_isready
              --health-interval 10s
              --health-timeout 5s
              --health-retries 5
    
    모든 작업의 바로 아래에 서비스 용기의 탭을 적으십시오. (이 예는postgres이지만 db도 가능합니다.) 아래로 이동할 Docker 이미지, 환경 변수, 건강 검사 설정을 지정합니다.

    서비스 컨테이너와 통신


    작업 절차에서 제작된 서비스 용기와 통신하는 방법은 임무를 수행하는 환경에 따라 다르다.따라서 먼저 임무를 수행하는 환경을 설명한다.이후 각자의 방법으로 서비스 용기에 통신하는 방법을 설명한다.

    GiitHub Actions에서 작업을 수행하는 환경


    GiitHub Actions에서는 다음 두 환경에서 작업을 수행할 수 있습니다.
  • 러너에서 직접 작업
  • 용기 내에서 작업 수행
  • 주루기에서 직접 임무를 집행하다


    단지 공식 문서와 Qita 등 글에서 봤을 뿐, 많은 경우에 이 방법으로 집행된다.공식 문서빠른 시작도 이런 방식으로 집행된다.
    이 방법은 다음과 같이 각 임무runs-on에서 지정한 기계 종류에서 임무를 수행한다.GiitHub Actions는 기본적으로 Windows, MacOS, Ubuntu 시스템을 제공합니다.임무에 정의된 stepsruns-on가 지정한 기계에서 실행됩니다.이 글처럼 서비스 용기를 실행하려면 GiitHub Action의 규격으로 Linux의 주자를 지정해야 한다.[1]
    jobs:
      my-job:
        runs-on: ubuntu-latest
        steps:
          - name: Hello, world
            run: |
              echo "Hello, world"
    

    컨테이너 내에서 작업 수행


    이 방법은 작업 바로 아래runs-on에 기계의 종류를 설정하고steps에 실행된 작업의 내용과 같다.단, 여기에 다시 설정container한다.이 항목은 작업이 실제로 실행되는 용기 설정을 지정합니다.이 예에서 go version 는 ubuntu로 이동하는 golang:1.14 용기에서 실행됩니다.
    이 방법도 아까 주루기에서 임무를 수행할 때와 마찬가지로 GiitHub Actions의 규격으로 리눅스의 주자를 지정해야 한다.[1:1]
    jobs:
      my-job:
        runs-on: ubuntu-latest
        container:
          # Docker Hubのイメージ
          image: golang:1.14
        steps:
          - name: Print Go version
            run: |
              go version
    

    서비스 용기와의 통신 방법


    주루기에서 운행하는 임무


    우선 주자 기기에서 이동하는 작업을 서비스 용기로 통신하는 방법을 설명한다.
    작업이 주루기에서 실행될 때, 서비스 용기는 주루원 기계에 대해 기본적으로 포트를 공개하지 않는다.따라서 GiitHub Actions에서 서비스 컨테이너를 정의할 때는 서비스 컨테이너와 주자기의 포트를 매핑해야 합니다.예를 들어 이 글을 제작할 때 실제 샘플은 PostgreSQL을 서비스 용기로 하기 때문에 지도상 유수기의 5432호 포트와 서비스 용기의 5432호 포트이다.실제 설정 파일은 다음과 같다.
    jobs:
      runner-job:
        runs-on: ubuntu-latest
        env:
          ENV: runner-job
        services:
          postgres:
            image: postgres
            env:
              POSTGRES_USER: sue
              POSTGRES_PASSWORD: postgres
              POSTGRES_DB: postgres
            options: >-
              --health-cmd pg_isready
              --health-interval 10s
              --health-timeout 5s
              --health-retries 5
            ports:
              - 5432:5432
    
    그리고 서비스 용기의 호스트는 local 또는 127.0.0.1로 설정되었다.따라서 방문localhost:5432하면 PostgreSQL과 통신할 수 있다.실제로 샘플이 주루기에서 작업을 수행할 때의 sql-migrate 설정은 다음과 같다localhost:5432.
    runner-job:
       dialect: postgres
       datasource: host=localhost dbname=postgres user=sue password=postgres sslmode=disable
       dir: migrations
       table: migrations
    

    컨테이너 안에서 이동하는 작업


    다음은 용기 안에서 이동하는 작업이 서비스 용기로 통신하는 방법을 설명한다.
    컨테이너 안에서 임무를 수행할 때 주루기에서 임무를 수행할 때보다 서비스 용기와 간단하게 통신할 수 있다.Docker의 사용자 정의 브리지 네트워크를 사용합니다.따라서 임의의 호스트 이름이 붙기 때문에 GiitHub Actions에서 서비스 용기의 탭 이름으로 접근할 수 있습니다.그리고 컨테이너가 서로 모든 포트를 공개했기 때문에 포트를 비출 필요가 없다.
    따라서 샘플이라도 서비스 용기를 정의할 때 다음과 같은 설정을 해야 한다
      container-job:
        runs-on: ubuntu-latest
        container:
          image: golang:1.14
        env:
          ENV: container-job
        services:
          postgres:
            image: postgres
            env:
              POSTGRES_USER: sue
              POSTGRES_PASSWORD: postgres
              POSTGRES_DB: postgres
            options: >-
              --health-cmd pg_isready
              --health-interval 10s
              --health-timeout 5s
              --health-retries 5
    
    sql-migrate를 통해 DB 이전할 때의 설정
    설정
    container-job:
        dialect: postgres
        datasource: host=postgres dbname=postgres user=sue password=postgres sslmode=disable
        dir: migrations
        table: migrations
    
    , 방문postgres:5432.
    각주
    공식 문서이 부분에 언급되었다.↩︎ ↩︎

    좋은 웹페이지 즐겨찾기