Earthly로 CI 파이프라인 컨테이너화

저는 오픈 소스 항목에서 CI 파이프라인을 실행하는 GitHub Actions의 열렬한 팬이었습니다. 다른 벤더와 비교하면 정말 잘했습니다. 편집하기 쉽고 잘 문서화되어 있으며 재사용할 수 있는 수많은 작업이 있습니다. 반면에 Github Actions 벤더는 우리 프로젝트를 잠급니다. 우리는 ❤️ GitHub이지만 벤더 잠금은 불타는 문제여야 합니다.

Earthly에 뛰어들기 전에 우주에서 가장 큰 경쟁자인 Dagger에 대해 쓰고 싶습니다. Dagger는 로컬에서 재현 가능한 컨테이너화된 CI 파이프라인을 대상으로 하는 Docker Inc.(실제로 부르는 이름이 무엇이든)의 새로운 프로젝트입니다. 한 가지 점을 제외하고는 멋지게 들립니다. CUE 언어를 사용하여 작업을 정의합니다. 이유가 있는 것 같지만 빌드 작업을 만들기 위해 언어를 배우고 싶지는 않습니다. 말도 안 돼요, 죄송합니다.

그것이 Earthly 이 그림에 들어오는 곳입니다. Makefile과 Dockerfile 구문을 결합하므로 학습 곡선이 거의 제로에 가깝습니다 👏. 캐싱, 재사용성, 라이브 디버깅, 비밀 관리 등과 같은 많은 기능이 있습니다. 자세한 목록은 설명서를 참조하십시오(문서의 경우 +100).

그것은 공예 시간 아기입니다!



간단한 Go lint 작업으로 시작하여 먼저 Docker In Docker에 대해 알아봅시다.

# cat Earthfile
VERSION 0.6

lint:
    FROM earthly/dind:alpine
    WORKDIR /workdir
    COPY . ./
    WITH DOCKER --pull golangci/golangci-lint:v1.49.0
        RUN docker run -w $PWD -v $PWD:$PWD golangci/golangci-lint:v1.49.0 golangci-lint run --timeout 240s
    END


작업을 실행하려면 Earthly를 설치해야 합니다.

# cat Makefile
BIN_PATH = $(shell pwd)/bin
$(shell mkdir $(BIN_PATH) &>/dev/null)

EARTHLY = $(BIN_PATH)/earthly
earthly:
ifeq (,$(wildcard $(EARTHLY)))
    curl -L https://github.com/earthly/earthly/releases/download/v0.6.23/earthly-linux-amd64 -o $(EARTHLY)
    chmod +x $(EARTHLY)
endif



make earthly && ./bin/earthly --allow-privileged +lint


이보다 더 간단할 수는 없다고 생각합니다.

빌드 및 캐시 종속성




# cat Earthfile
VERSION 0.6
FROM golang:1.18.0
WORKDIR /workdir

deps:
    COPY go.mod go.sum ./
    RUN go mod tidy
    RUN go mod download
    SAVE ARTIFACT go.mod AS LOCAL go.mod
    SAVE ARTIFACT go.sum AS LOCAL go.sum

test:
    FROM +deps
    COPY . ./
    RUN make _test


여기에 무언가를 쓰고 싶지만 코드가 모든 것을 설명합니다. 작업을 가동하려면 이번에는 --allow-privileged 없이 다음 명령을 실행해야 합니다.

./bin/earthly +test


자동화, 자동화, 자동화, ...



먼저 변경 사항을 원격 Git에 푸시하기 전에 작업을 실행하고 싶습니다. Husky은 Git 후크를 관리하는 매우 편리한 도구처럼 보입니다.

허스키 다운로드:

# cat Makefile
husky:
    GOBIN=$(BIN_PATH) go install github.com/automation-co/[email protected]



make husky && ./bin/husky init


후크 파일 편집:

# cat .husky/hooks/pre-commit
#!/bin/bash

husky install



# cat .husky/hooks/pre-push
#!/bin/bash

if [[ "$SKIP_GIT_PUSH_HOOK" ]]; then exit 0; fi

set -e

if git status --short | grep -qv "??"; then
    git stash
    function unstash() {
        git reset --hard
        git stash pop
    }
    trap unstash EXIT
fi

make lint test

git diff --exit-code --quiet || (git status && exit 1)


후크 설치:

./bin/husky install


Makefile 대상 만들기:

# cat Makefile
lint: earthly
    $(EARTHLY) -P +lint

test: earthly
    $(EARTHLY) +test


그리고 GitHub Action 통합도 여전히 중앙 위치에서 작업을 실행해야 합니다.

name: Lint and test
on: [push]
jobs:
  lint:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: make lint

  go-test:
    name: go tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: make test


즐기세요 🎉



이런 식으로 각 커밋 전에 Husky는 최신 버전의 후크를 설치한 다음 푸시 전에 모든 작업을 실행합니다. GitHub는 푸시 후 작업을 실행하므로 고품질 소프트웨어를 제공하기 위해 최선을 다했습니다.

좋은 웹페이지 즐겨찾기