From a9f4604bad53a5c225c696f62d11f8c5737c498b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20M=C5=82odzikowski?= Date: Fri, 14 Apr 2023 11:47:41 +0200 Subject: [PATCH] feat(governance,trading,explorer): pipelines improvements (#3422) --- .github/workflows/ci-cd-trigger.yml | 86 ++++++++++++++++++- .../workflows/{lint_pr.yml => lint-pr.yml} | 17 ++-- .github/workflows/publish-dist.yml | 65 ++++++++++++-- docker/dist.Dockerfile | 6 ++ docker-build.sh => docker/docker-build.sh | 0 Dockerfile => docker/ipfs.Dockerfile | 8 +- {nginx => docker}/nginx.conf | 0 7 files changed, 156 insertions(+), 26 deletions(-) rename .github/workflows/{lint_pr.yml => lint-pr.yml} (69%) create mode 100644 docker/dist.Dockerfile rename docker-build.sh => docker/docker-build.sh (100%) rename Dockerfile => docker/ipfs.Dockerfile (82%) rename {nginx => docker}/nginx.conf (100%) diff --git a/.github/workflows/ci-cd-trigger.yml b/.github/workflows/ci-cd-trigger.yml index 7e5b2ff16..c5e7733be 100644 --- a/.github/workflows/ci-cd-trigger.yml +++ b/.github/workflows/ci-cd-trigger.yml @@ -8,11 +8,49 @@ on: pull_request: types: - opened - - reopened - - synchronize - ready_for_review + - reopened + - edited + - synchronize jobs: + node-modules: + runs-on: ubuntu-22.04 + name: 'Cache yarn modules' + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache node modules + id: cache + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }} + # comment out "resotre-keys" if you need to rebuild yarn from 0 + restore-keys: | + ${{ runner.os }}-cache-node-modules- + + - name: Setup node + uses: actions/setup-node@v3 + if: steps.cache.outputs.cache-hit != 'true' + with: + node-version-file: '.nvmrc' + # https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions + cache: yarn + + - name: yarn install + if: steps.cache.outputs.cache-hit != 'true' + run: yarn install --pure-lockfile + + lint-pr-title: + needs: node-modules + name: Verify PR title + uses: ./.github/workflows/lint-pr.yml + secrets: inherit + lint-test-build: + timeout-minutes: 10 + needs: node-modules runs-on: ubuntu-22.04 name: '(CI) lint + unit test + build' steps: @@ -28,8 +66,11 @@ jobs: # https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions cache: yarn - - name: Install root dependencies - run: yarn install --frozen-lockfile + - name: Cache node modules + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }} - name: Derive appropriate SHAs for base and head for `nx affected` commands uses: nrwl/nx-set-shas@v3 @@ -96,6 +137,43 @@ jobs: with: projects: ${{ needs.lint-test-build.outputs.projects }} + dist-check: + runs-on: ubuntu-latest + needs: publish-dist + if: ${{ github.event_name == 'pull_request' }} + name: '(CD) comment preview links' + steps: + - name: Find Comment + uses: peter-evans/find-comment@v2 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + body-includes: Previews + + - name: Inject slug/short variables + if: ${{ steps.fc.outputs.comment-id == 0 }} + uses: rlespinasse/github-slug-action@v4 + with: + prefix: CI_ + + - name: Create comment + if: ${{ steps.fc.outputs.comment-id == 0 }} + uses: peter-evans/create-or-update-comment@v3 + with: + issue-number: ${{ github.event.pull_request.number }} + body: | + Previews + - explorer https://explorer.${{ env.CI_GITHUB_REF_NAME }}.vega.rocks + - trading https://trading.${{ env.CI_GITHUB_REF_NAME }}.vega.rocks + - governance https://governance.${{ env.CI_GITHUB_REF_NAME }}.vega.rocks + + cypress-check: + name: '(CI) cypress - check' + runs-on: ubuntu-latest + needs: cypress + steps: + - run: echo Done! + # Report single result at the end, to avoid mess with required checks in PR cypress-result: if: ${{ always() }} diff --git a/.github/workflows/lint_pr.yml b/.github/workflows/lint-pr.yml similarity index 69% rename from .github/workflows/lint_pr.yml rename to .github/workflows/lint-pr.yml index 06f7ca04d..c9133720c 100644 --- a/.github/workflows/lint_pr.yml +++ b/.github/workflows/lint-pr.yml @@ -2,15 +2,11 @@ name: Verify PR title on: - pull_request: - types: - - opened - - ready_for_review - - reopened - - edited - - synchronize + workflow_call: + jobs: lint_pr: + timeout-minutes: 10 runs-on: ubuntu-22.04 steps: - name: Checkout @@ -23,8 +19,11 @@ jobs: # https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions cache: yarn - - name: Install root dependencies - run: yarn install --frozen-lockfile + - name: Cache node modules + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }} - name: Check PR title run: echo "${{ github.event.pull_request.title }}" | npx commitlint --config ./commitlint.config-ci.js diff --git a/.github/workflows/publish-dist.yml b/.github/workflows/publish-dist.yml index 9098d6e64..4d8e270bc 100644 --- a/.github/workflows/publish-dist.yml +++ b/.github/workflows/publish-dist.yml @@ -15,6 +15,7 @@ jobs: app: ${{ fromJSON(inputs.projects) }} name: ${{ matrix.app }} runs-on: ubuntu-22.04 + timeout-minutes: 10 steps: - name: Check out code uses: actions/checkout@v3 @@ -36,48 +37,91 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + # https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions + cache: yarn + + - name: Cache node modules + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }} + # https://docs.github.com/en/actions/learn-github-actions/contexts - name: Define variables - id: tags run: | + envName='' + dockerfile="dist.Dockerfile" if [[ "${{ github.event_name }}" = "push" ]]; then domain="vega.rocks" if [[ "${{ github.ref }}" =~ .*release/.* ]]; then envName="$(echo ${{ github.ref }} | rev | cut -d '/' -f 1 | rev)" if [[ "${{ github.ref }}" =~ .*mainnet.* ]]; then domain="vega.community" + if [[ "${{ matrix.app }}" = "trading" ]]; then + dockerfile="ipfs.Dockerfile" + fi fi elif [[ "${{ github.ref }}" =~ .*develop$ ]]; then envName="stagnet3" fi bucketName="${{ matrix.app }}.${envName}.${domain}" - echo ::set-output name=bucketName::${bucketName} - echo ::set-output name=envName::${envName} + echo BUCKET_NAME=${bucketName} >> $GITHUB_ENV fi nodeVersion=$(cat .nvmrc | head -n 1) - echo ::set-output name=nodeVersion::${nodeVersion} + echo ENV_NAME=${envName} >> $GITHUB_ENV + echo NODE_VERSION=${nodeVersion} >> $GITHUB_ENV + echo DOCKERFILE=docker/${dockerfile} >> $GITHUB_ENV + + - name: Build local dist + if: ${{ env.DOCKERFILE != 'docker/ipfs.Dockerfile' }} + run: | + flags="" + if [[ ! -z "${{ env.ENV_NAME }}" ]]; then + if [[ "${{ env.ENV_NAME }}" != "ops-vega" ]]; then + flags="--env=${{ env.ENV_NAME }}" + fi + fi + + if [ "${{ matrix.app }}" = "trading" ]; then + yarn nx export trading $flags || (yarn install && yarn nx export trading $flags) + DIST_LOCATION=dist/apps/trading/exported + else + yarn nx build ${{ matrix.app }} $flags || (yarn install && yarn nx build ${{ matrix.app }} $flags) + DIST_LOCATION=dist/apps/${{ matrix.app }} + fi + mv $DIST_LOCATION dist-result + tree dist-result - name: Build and export to local Docker id: docker_build uses: docker/build-push-action@v3 with: + context: . + file: ${{ env.DOCKERFILE }} load: true build-args: | APP=${{ matrix.app }} - NODE_VERSION=${{ steps.tags.outputs.nodeVersion }} - ENV_NAME=${{ steps.tags.outputs.envName || '' }} + NODE_VERSION=${{ env.NODE_VERSION }} + ENV_NAME=${{ env.ENV_NAME }} tags: | ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local - name: Sanity check docker image run: | echo "Check ipfs-hash" - docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local cat ipfs-hash + if [[ "${{ env.DOCKERFILE }}" = "docker/ipfs.Dockerfile" ]]; then + docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local cat /ipfs-hash + fi echo "List html directory" docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local sh -c 'apk add --update tree; tree .' - name: Copy dist to local filesystem + if: ${{ env.DOCKERFILE != 'docker/ipfs.Dockerfile' }} run: | docker create --name=dist ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local docker cp dist:/usr/share/nginx/html dist @@ -89,10 +133,13 @@ jobs: uses: docker/build-push-action@v3 if: ${{ github.event_name == 'pull_request' }} with: + context: . + file: ${{ env.DOCKERFILE }} push: true build-args: | APP=${{ matrix.app }} - NODE_VERSION=${{ steps.tags.outputs.nodeVersion }} + NODE_VERSION=${{ env.NODE_VERSION }} + ENV_NAME=${{ env.ENV_NAME }} tags: | ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:${{ github.event.pull_request.head.sha || github.sha }} @@ -107,7 +154,7 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_REGION: 'eu-west-1' - SOURCE_DIR: 'dist/${{ matrix.app }}' + SOURCE_DIR: 'dist' - name: Add preview label uses: actions-ecosystem/action-add-labels@v1 diff --git a/docker/dist.Dockerfile b/docker/dist.Dockerfile new file mode 100644 index 000000000..1e44628a4 --- /dev/null +++ b/docker/dist.Dockerfile @@ -0,0 +1,6 @@ +FROM --platform=amd64 nginx:1.23-alpine@sha256:6318314189b40e73145a48060bff4783a116c34cc7241532d0d94198fb2c9629 +EXPOSE 80 +WORKDIR /usr/share/nginx/html +COPY docker/nginx.conf /etc/nginx/conf.d/default.conf +RUN rm -rf /usr/share/nginx/html/* +COPY ./dist-result/ /usr/share/nginx/html/ diff --git a/docker-build.sh b/docker/docker-build.sh similarity index 100% rename from docker-build.sh rename to docker/docker-build.sh diff --git a/Dockerfile b/docker/ipfs.Dockerfile similarity index 82% rename from Dockerfile rename to docker/ipfs.Dockerfile index 574d3b01d..c8c62332b 100644 --- a/Dockerfile +++ b/docker/ipfs.Dockerfile @@ -13,7 +13,7 @@ RUN apk add --update --no-cache \ COPY . ./ RUN yarn --network-timeout 100000 --pure-lockfile # work around for different build process in trading -RUN sh ./docker-build.sh +RUN sh docker/docker-build.sh # Server environment # if this fails you need to docker pull nginx:1.23-alpine and pin new SHA @@ -23,7 +23,7 @@ FROM --platform=amd64 nginx:1.23-alpine@sha256:6318314189b40e73145a48060bff4783a EXPOSE 80 # Copy dist WORKDIR /usr/share/nginx/html -COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf +COPY docker/nginx.conf /etc/nginx/conf.d/default.conf RUN rm -rf /usr/share/nginx/html/* -COPY --from=build /app/dist/apps/${APP} /usr/share/nginx/html -RUN apk add --no-cache go-ipfs; ipfs init && echo "$(ipfs add -rQ .)" > ipfs-hash; apk del go-ipfs +COPY --from=build /app/dist/apps/${APP}/* /usr/share/nginx/html +RUN apk add --no-cache go-ipfs; ipfs init && echo "$(ipfs add -rQ .)" > /ipfs-hash; apk del go-ipfs diff --git a/nginx/nginx.conf b/docker/nginx.conf similarity index 100% rename from nginx/nginx.conf rename to docker/nginx.conf