name: CI # main push와 PR에서 같은 검증을 돌린다. 이 워크플로는 배포하지 않는다. on: push: branches: - main pull_request: env: # 빌드·렌더링 도구는 러너에 설치하지 않고 컨테이너로 가져온다. # 러너에 JDK나 helm이 깔려 있는지에 파이프라인이 의존하지 않게 하기 위해서다. # 러너가 host 모드(docker가 러너 호스트에서 직접 도는 구성)라는 전제다. # 현재 .gitea/workflows/deploy.yaml이 호스트의 docker compose 스크립트를 부르므로 그 전제가 성립한다. JDK_IMAGE: eclipse-temurin:21-jdk HELM_IMAGE: alpine/helm:3.14.4 jobs: verify: runs-on: ubuntu steps: - uses: actions/checkout@v4 # 컨테이너를 러너 사용자로 돌린다. root로 돌면 build/ 산출물이 root 소유가 되어 # 다음 실행의 checkout이 그 디렉터리를 지우지 못한다. # ideaFormatCheck는 IDEA_FORMATTER가 없으면 경고만 남기고 건너뛴다. # 들여쓰기·줄바꿈은 CI에서 검증되지 않는다는 뜻이다(README). - name: Gradle check run: | docker run --rm \ --user "$(id -u):$(id -g)" \ -v "$PWD":/workspace -w /workspace \ -e GRADLE_USER_HOME=/workspace/.gradle/ci-home \ "$JDK_IMAGE" ./gradlew check --no-daemon # HelmDeploymentContractTest는 values와 template의 정적 규칙만 본다. # helper 오류와 조건 분기 실수는 실제로 렌더링해야 드러난다. - name: Helm lint and template run: | docker run --rm \ --user "$(id -u):$(id -g)" \ -v "$PWD":/workspace -w /workspace \ --entrypoint sh \ "$HELM_IMAGE" deploy/ci/render-manifests.sh # GitOps 저장소가 생기기 전까지, 이 산출물이 "무엇이 배포되는가"를 확인할 수 있는 유일한 형태다. - name: Upload rendered manifests uses: actions/upload-artifact@v3 with: name: rendered-manifests path: build/rendered image: runs-on: ubuntu needs: verify if: github.event_name == 'push' steps: - uses: actions/checkout@v4 - name: Build image run: docker build -t "ax-hub-mcp-server:${{ github.sha }}" . # registry가 아직 확정되지 않았으면 빌드까지만 하고 멈춘다. # 없는 secret 때문에 파이프라인 전체가 실패로 보이는 것을 막는다. # TODO: 사내 registry 확정 시 저장소 secret에 REGISTRY_HOST·REGISTRY_USER·REGISTRY_PASSWORD·IMAGE_REPOSITORY를 등록한다. - name: Push image env: REGISTRY_HOST: ${{ secrets.REGISTRY_HOST }} REGISTRY_USER: ${{ secrets.REGISTRY_USER }} REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} IMAGE_REPOSITORY: ${{ secrets.IMAGE_REPOSITORY }} IMAGE_TAG: ${{ github.sha }} run: | if [ -z "$REGISTRY_HOST" ] || [ -z "$IMAGE_REPOSITORY" ]; then echo "REGISTRY_HOST 또는 IMAGE_REPOSITORY secret이 없어 push를 건너뛴다." echo "이미지는 러너 로컬에만 있다: ax-hub-mcp-server:$IMAGE_TAG" exit 0 fi echo "$REGISTRY_PASSWORD" | docker login "$REGISTRY_HOST" -u "$REGISTRY_USER" --password-stdin docker tag "ax-hub-mcp-server:$IMAGE_TAG" "$IMAGE_REPOSITORY:$IMAGE_TAG" docker push "$IMAGE_REPOSITORY:$IMAGE_TAG" echo "배포에 쓸 tag: $IMAGE_TAG"