image: node:18

definitions:
  steps:
    - step: &install-test-runner-asg
        name: Install and Test
        image: node:20-alpine
        script:
          - printf "//`node -p \"require('url').parse('https://registry.npmjs.org').host\"`/:_authToken=${NPM_TOKEN}" > .npmrc
          - rm -f package-lock.json
          - npm install
          - npm run lint
        artifacts:
          - node_modules/**
    - step: &build-deploy-invalidate-cache-runner-asg
        name: Build, Deploy and Invalidate Cache
        image: node:20-alpine
        script:
          - export PACKAGE_JSON_VERSION=$(npm pkg get version --workspaces=false | tr -d \")
          - npm run build
          - mkdir lib/$PACKAGE_JSON_VERSION
          - mkdir lib/latest
          - cp lib/index.iife.js lib/$PACKAGE_JSON_VERSION/index.js && cp lib/index.iife.js lib/latest/index.js
          - rm lib/*.js && rm lib/*.map
          - apk add aws-cli
          - pipe: atlassian/aws-s3-deploy:2.0.1
            variables:
              AWS_ACCESS_KEY_ID: $BB_AWS_ACCESS_KEY_ID
              AWS_SECRET_ACCESS_KEY: $BB_AWS_SECRET_ACCESS_KEY
              AWS_DEFAULT_REGION: $REGION
              S3_BUCKET: "${S3_BUCKET}"
              LOCAL_PATH: "lib"
              ACL: "public-read"
          - aws configure set aws_access_key_id $BB_AWS_ACCESS_KEY_ID
          - aws configure set aws_secret_access_key $BB_AWS_SECRET_ACCESS_KEY
          - aws configure set default.region $REGION
          - aws cloudfront create-invalidation --distribution-id $DISTRIBUTION_ID --paths "/*"
        artifacts:
          - static/**
    - step: &build-runner-asg
        name: Build artifact
        image: node:20-alpine
        script:
          - export VERSION=$(grep '"version"' package.json | cut -d':' -f2 | cut -d'"' -f2)
          - export PACKAGE_JSON_VERSION=$(npm pkg get version --workspaces=false | tr -d \")
          - npm run build
          - mkdir lib/$PACKAGE_JSON_VERSION
          - mkdir lib/latest
          - cp lib/index.iife.js lib/$PACKAGE_JSON_VERSION/index.js && cp lib/index.iife.js lib/latest/index.js
          - rm lib/*.js && rm lib/*.map
          - tar -czf js-elements-lib_${VERSION}.tar.gz -C lib .
          - cp js-elements-lib_${VERSION}.tar.gz js-elements-lib_LATEST.tar.gz
          - mkdir -p js-elements-lib_${VERSION}
          - mkdir -p js-elements-lib_LATEST
          - cp js-elements-lib_${VERSION}.tar.gz ./js-elements-lib_${VERSION}
          - cp js-elements-lib_LATEST.tar.gz ./js-elements-lib_LATEST
          - pipe: atlassian/aws-s3-deploy:2.0.1
            variables:
              AWS_ACCESS_KEY_ID: $BB_AWS_ACCESS_KEY_ID
              AWS_SECRET_ACCESS_KEY: $BB_AWS_SECRET_ACCESS_KEY
              AWS_DEFAULT_REGION: $REGION
              S3_BUCKET: "odin-artifacts-${ENV_NAME}-${AWS_ACCOUNT_ID}/js-elements"
              LOCAL_PATH: "js-elements-lib_${VERSION}"
          - pipe: atlassian/aws-s3-deploy:2.0.1
            variables:
              AWS_ACCESS_KEY_ID: $BB_AWS_ACCESS_KEY_ID
              AWS_SECRET_ACCESS_KEY: $BB_AWS_SECRET_ACCESS_KEY
              AWS_DEFAULT_REGION: $REGION
              S3_BUCKET: "odin-artifacts-${ENV_NAME}-${AWS_ACCOUNT_ID}/js-elements"
              LOCAL_PATH: "js-elements-lib_LATEST"
        artifacts:
          - static/**
    - step: &install-test
        caches:
          - node
        name: Install and Test
        script:
          - printf "//`node -p \"require('url').parse('https://registry.npmjs.org').host\"`/:_authToken=${NPM_TOKEN}" > .npmrc
          - npm install
          - npm test
          - npm run lint
        artifacts:
          - node_modules/**

pipelines:
  default:
    - step:
        <<: *install-test
        image: node:20-alpine
  branches:
    develop:
      - stage:
          deployment: Dev
          name: Build and Deploy to DEV
          steps:
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.dev"
                <<: *install-test-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.dev"
                <<: *build-deploy-invalidate-cache-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.dev"
                name: Deploy Dev Test Page
                image: node:20-alpine
                script:
                  - npm run build:sample:dev
                  - apk add aws-cli
                  - pipe: atlassian/aws-s3-deploy:2.0.1
                    variables:
                      AWS_ACCESS_KEY_ID: $DEV_BB_AWS_ACCESS_KEY_ID
                      AWS_SECRET_ACCESS_KEY: $DEV_BB_AWS_SECRET_ACCESS_KEY
                      AWS_DEFAULT_REGION: "us-east-1"
                      S3_BUCKET: "ui-components.odin-dev.com/ui-elements/dev"
                      LOCAL_PATH: "static"
                      ACL: "public-read"
                  - aws configure set aws_access_key_id $DEV_BB_AWS_ACCESS_KEY_ID
                  - aws configure set aws_secret_access_key $DEV_BB_AWS_SECRET_ACCESS_KEY
                  - aws configure set default.region us-east-1
                  - aws cloudfront create-invalidation --distribution-id $DEV_UI_COMPONENTS_DISTRO --paths "/ui-elements/dev/*"
    release:
      - stage:
          deployment: Qa
          name: Build and Deploy to QA
          steps:
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.qa"
                <<: *install-test-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.qa"
                <<: *build-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.qa"
                <<: *build-deploy-invalidate-cache-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.qa"
                name: Deploy Test Page
                image: node:20-alpine
                script:
                  - npm run build:sample:qa
                  - apk add aws-cli
                  - pipe: atlassian/aws-s3-deploy:2.0.1
                    variables:
                      AWS_ACCESS_KEY_ID: $DEV_BB_AWS_ACCESS_KEY_ID
                      AWS_SECRET_ACCESS_KEY: $DEV_BB_AWS_SECRET_ACCESS_KEY
                      AWS_DEFAULT_REGION: "us-east-1"
                      S3_BUCKET: "ui-components.odin-dev.com/ui-elements/qa"
                      LOCAL_PATH: "static"
                      ACL: "public-read"
                  - aws configure set aws_access_key_id $DEV_BB_AWS_ACCESS_KEY_ID
                  - aws configure set aws_secret_access_key $DEV_BB_AWS_SECRET_ACCESS_KEY
                  - aws configure set default.region us-east-1
                  - aws cloudfront create-invalidation --distribution-id $DEV_UI_COMPONENTS_DISTRO --paths "/ui-elements/qa/*"
      - stage:
          deployment: Sandbox
          name: Build and Deploy to Sandbox
          trigger: manual
          steps:
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.qa"
                <<: *build-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.qa"
                <<: *build-deploy-invalidate-cache-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.qa"
                name: Create and Release Jira Version/Deploy to Sandbox
                image: node:20-alpine
                script:
                  - export JIRA_API_ENDPOINT=$JIRA_API_ENDPOINT
                  - export JIRA_API_TOKEN=$JIRA_API_TOKEN
                  - export JIRA_PROJECT_ID=$JIRA_PROJECT_ID
                  - export AWSTOOLING_AWS_REGION=$AWSTOOLING_AWS_REGION
                  - export AWSTOOLING_AWS_ACCESS_KEY_ID=$AWSTOOLING_AWS_ACCESS_KEY_ID
                  - export AWSTOOLING_AWS_SECRET_ACCESS_KEY=$AWSTOOLING_AWS_SECRET_ACCESS_KEY
                  - npm run create-version
                  - npm run release-version
                  - npm run build:sample:sandbox
                  - apk add aws-cli
                  - pipe: atlassian/aws-s3-deploy:2.0.1
                    variables:
                      AWS_ACCESS_KEY_ID: $DEV_BB_AWS_ACCESS_KEY_ID
                      AWS_SECRET_ACCESS_KEY: $DEV_BB_AWS_SECRET_ACCESS_KEY
                      AWS_DEFAULT_REGION: "us-east-1"
                      S3_BUCKET: "ui-components.odin-dev.com/ui-elements/sandbox"
                      LOCAL_PATH: "static"
                      ACL: "public-read"
                  - aws configure set aws_access_key_id $DEV_BB_AWS_ACCESS_KEY_ID
                  - aws configure set aws_secret_access_key $DEV_BB_AWS_SECRET_ACCESS_KEY
                  - aws configure set default.region us-east-1
                  - aws cloudfront create-invalidation --distribution-id $DEV_UI_COMPONENTS_DISTRO --paths "/ui-elements/sandbox/*"
    master:
      - stage:
          deployment: Production
          name: Build and Deploy to Production
          steps:
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.sandbox"
                <<: *install-test-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.sandbox"
                name: Publish to npm
                image: node:20-alpine
                script:
                  - printf "//`node -p \"require('url').parse('https://registry.npmjs.org').host\"`/:_authToken=${NPM_TOKEN_WRITE}" > .npmrc
                  - npm install
                  - npm run build
                  - npm publish --tag $TAG --access public
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.sandbox"
                <<: *build-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.sandbox"
                <<: *build-deploy-invalidate-cache-runner-asg
            - step:
                runs-on:
                  - "linux"
                  - "self.hosted"
                  - "k8s.runners.sandbox"
                name: Create and Release Jira Version/Deploy E2E test UI
                image: node:20-alpine
                script:
                  - export JIRA_API_ENDPOINT=$JIRA_API_ENDPOINT
                  - export JIRA_API_TOKEN=$JIRA_API_TOKEN
                  - export JIRA_PROJECT_ID=$JIRA_PROJECT_ID
                  - export AWSTOOLING_AWS_REGION=$AWSTOOLING_AWS_REGION
                  - export AWSTOOLING_AWS_ACCESS_KEY_ID=$AWSTOOLING_AWS_ACCESS_KEY_ID
                  - export AWSTOOLING_AWS_SECRET_ACCESS_KEY=$AWSTOOLING_AWS_SECRET_ACCESS_KEY
                  - npm run create-version
                  - npm run release-version
                  - npm run build:sample:prod
                  - apk add aws-cli
                  - pipe: atlassian/aws-s3-deploy:2.0.1
                    variables:
                      AWS_ACCESS_KEY_ID: $DEV_BB_AWS_ACCESS_KEY_ID
                      AWS_SECRET_ACCESS_KEY: $DEV_BB_AWS_SECRET_ACCESS_KEY
                      AWS_DEFAULT_REGION: "us-east-1"
                      S3_BUCKET: "ui-components.odin-dev.com/ui-elements/prod"
                      LOCAL_PATH: "static"
                      ACL: "public-read"
#                  TODO: Correct behavior where it uses primary access key instead of dev access key for invalidation
#                  - aws configure set aws_access_key_id $DEV_BB_AWS_ACCESS_KEY_ID
#                  - aws configure set aws_secret_access_key $DEV_BB_AWS_SECRET_ACCESS_KEY
#                  - aws configure set default.region us-east-1
#                  - aws cloudfront create-invalidation --distribution-id $DEV_UI_COMPONENTS_DISTRO --paths "/ui-elements/prod/*"
