diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..1882d9346 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,137 @@ +stages: + - build + - release + +variables: + DOCKER_ALLTOOLS_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME-alltools + DOCKER_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME + DOCKER_PLATFORMS: linux/amd64,linux/arm64 + +compile binaries: + stage: build + image: golang:latest + variables: + CGO_CFLAGS: -O2 -D__BLST_PORTABLE__ + GO_FLAGS: -trimpath + rules: + # manual only for non-tagged commits, auto for tags + - if: $CI_COMMIT_TAG == null + when: manual + - if: $CI_COMMIT_TAG != null + before_script: + # writing COMPILE_JOB_ID var to environment file, passed as artifact to downstream jobs + # see: https://docs.gitlab.com/ee/ci/variables/#pass-an-environment-variable-to-another-job + - echo COMPILE_JOB_ID=$CI_JOB_ID >> build.env + script: + - GOOS=linux GARCH=amd64 go build $GO_FLAGS -o _build/linux/geth-amd64 ./cmd/geth + - GOOS=linux GARCH=arm64 go build $GO_FLAGS -o _build/linux/geth-arm64 ./cmd/geth + - GOOS=windows GARCH=amd64 go build $GO_FLAGS -o _build/windows/geth-amd64.exe ./cmd/geth + - GOOS=windows GARCH=arm64 go build $GO_FLAGS -o _build/windows/geth-arm64.exe ./cmd/geth + artifacts: + paths: + - _build/ + reports: + # pass the generated env to downstream jobs + dotenv: build.env + +docker build: + stage: build + image: docker:cli + rules: + # manual only for non-tagged commits, auto for tags + - if: $CI_COMMIT_TAG == null + when: manual + - if: $CI_COMMIT_TAG != null + services: + - docker:dind + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + script: + - docker context create ctx + - docker buildx create --use ctx + - docker buildx build + --tag "$DOCKER_IMAGE_NAME" + --platform "$DOCKER_PLATFORMS" + --provenance=false + --build-arg "COMMIT=$CI_COMMIT_SHA" + --build-arg "VERSION=$CI_COMMIT_REF_NAME" + --build-arg "BUILDNUM=$CI_JOB_ID" + --pull --push . + - docker manifest inspect "$DOCKER_IMAGE_NAME" + +docker build alltools: + stage: build + image: docker:cli + rules: + # manual only for non-tagged commits, auto for tags + - if: $CI_COMMIT_TAG == null + when: manual + - if: $CI_COMMIT_TAG != null + services: + - docker:dind + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + script: + - docker context create ctx + - docker buildx create --use ctx + - docker buildx build + --file Dockerfile.alltools + --tag "$DOCKER_ALLTOOLS_IMAGE_NAME" + --platform "$DOCKER_PLATFORMS" + --provenance=false + --build-arg "COMMIT=$CI_COMMIT_SHA" + --build-arg "VERSION=$CI_COMMIT_REF_NAME" + --build-arg "BUILDNUM=$CI_JOB_ID" + --pull --push . + - docker manifest inspect "$DOCKER_ALLTOOLS_IMAGE_NAME" + +release: + stage: release + image: registry.gitlab.com/gitlab-org/release-cli:latest + script: + - echo "Releasing with artifacts from job $CI_PROJECT_URL/-/jobs/$COMPILE_JOB_ID" + rules: + - if: $CI_COMMIT_TAG != null + when: manual + variables: + ARTIFACT_URL: "$CI_PROJECT_URL/-/jobs/$COMPILE_JOB_ID/artifacts/raw" + release: + name: "$CI_COMMIT_TAG" + description: | + **Docker Images** + - geth multi-arch (amd64/arm64): \`$DOCKER_IMAGE_NAME\` + - alltools multi-arch (amd64/arm64): \`$DOCKER_ALLTOOLS_IMAGE_NAME\` + + ## Release Notes + _Release created by pipeline (pending release notes)._ + tag_name: "$CI_COMMIT_TAG" + assets: + links: + - name: "Linux Intel/AMD64 Executable" + link_type: package + url: "$ARTIFACT_URL/_build/linux/geth-amd64" + - name: "Linux ARM64 Executable" + link_type: package + url: "$ARTIFACT_URL/_build/linux/geth-arm64" + - name: "Windows Intel/AMD64 Executable" + link_type: package + url: "$ARTIFACT_URL/_build/windows/geth-amd64.exe" + - name: "Windows ARM64 Executable" + link_type: package + url: "$ARTIFACT_URL/_build/windows/geth-arm64.exe" + +docker tag latest: + stage: release + image: docker:cli + rules: + - if: $CI_COMMIT_TAG != null + # run automatically, but only if a release has been created + needs: + - release + services: + - docker:dind + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + script: + - docker buildx imagetools create -t "$CI_REGISTRY_IMAGE:latest" "$DOCKER_IMAGE_NAME" + - docker buildx imagetools create -t "$CI_REGISTRY_IMAGE:latest-alltools" "$DOCKER_ALLTOOLS_IMAGE_NAME"