diff --git a/.github/workflows/deploy-wallet-get-starknet.yml b/.github/workflows/deploy-wallet-get-starknet.yml new file mode 100644 index 00000000..d93aef66 --- /dev/null +++ b/.github/workflows/deploy-wallet-get-starknet.yml @@ -0,0 +1,208 @@ +name: Deploy Wallet-UI and Get-starknet + +on: + workflow_dispatch: + inputs: + environment: + description: 'Environment to deploy' + type: environment + required: true +jobs: + prepare-deployment: + environment: ${{ inputs.environment }} + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + - name: Prepare Parameters + id: prepare_parameters + run: | + BASE=$(node -p "require('./packages/starknet-snap/package.json').version") + HASH=$(git rev-parse --short HEAD) + DATE=$(date +%Y%m%d) + ENV=${{ inputs.environment }} + + { + echo "AWS_CLOUDFRONT_DISTRIBUTIONS_ID=${{ vars.AWS_CLOUDFRONT_DISTRIBUTIONS_ID }}" + echo "AWS_S3_GET_STARKNET_URL=${{ vars.AWS_S3_GET_STARKNET_URL }}" + echo "AWS_S3_URL=${{ vars.AWS_S3_URL }}" + echo "GET_STARKNET_PUBLIC_PATH=${{ vars.GET_STARKNET_PUBLIC_PATH }}" + } >> "$GITHUB_OUTPUT" + + if [[ $ENV == "dev" ]]; then + { + echo "VERSION=${BASE}-dev-${HASH}-${DATE}" + echo "TAG=dev" + echo "ENV=dev" + echo "LOG_LEVEL=6" + } >> "$GITHUB_OUTPUT" + elif [[ $ENV == "staging" ]]; then + { + echo "VERSION=${BASE}-staging" + echo "TAG=staging" + echo "ENV=staging" + echo "LOG_LEVEL=0" + } >> "$GITHUB_OUTPUT" + elif [[ $ENV == "production" ]]; then + { + echo "VERSION=${BASE}" + echo "TAG=latest" + echo "ENV=prod" + echo "LOG_LEVEL=0" + } >> "$GITHUB_OUTPUT" + else + echo "Invalid environment" + exit 1 + fi + outputs: + VERSION: ${{ steps.prepare_parameters.outputs.VERSION }} + TAG: ${{ steps.prepare_parameters.outputs.TAG }} + ENV: ${{ steps.prepare_parameters.outputs.ENV }} + AWS_S3_GET_STARKNET_URL: ${{ steps.prepare_parameters.outputs.AWS_S3_GET_STARKNET_URL }} + AWS_CLOUDFRONT_DISTRIBUTIONS_ID: ${{ steps.prepare_parameters.outputs.AWS_CLOUDFRONT_DISTRIBUTIONS_ID }} + AWS_S3_URL: ${{ steps.prepare_parameters.outputs.AWS_S3_URL }} + GET_STARKNET_PUBLIC_PATH: ${{ steps.prepare_parameters.outputs.GET_STARKNET_PUBLIC_PATH }} + CACHE_KEY: ${{ github.sha }}-${{ steps.prepare_parameters.outputs.ENV }} + LOG_LEVEL: ${{ steps.prepare_parameters.outputs.LOG_LEVEL }} + + install-build: + needs: + - prepare-deployment + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + - name: Install + run: | + yarn --no-immutable + yarn allow-scripts + - name: Build Snap + run: | + echo "Building UI with version $VERSION" + + REACT_APP_SNAP_VERSION="${VERSION}" yarn workspace wallet-ui build + + echo "Building Get Starknet with GET_STARKNET_PUBLIC_PATH=$GET_STARKNET_PUBLIC_PATH" + + GET_STARKNET_PUBLIC_PATH=$GET_STARKNET_PUBLIC_PATH yarn workspace @consensys/get-starknet build + env: + SNAP_ENV: ${{ needs.prepare-deployment.outputs.ENV }} + VERSION: ${{ needs.prepare-deployment.outputs.VERSION }} + VOYAGER_API_KEY: ${{ secrets.VOYAGER_API_KEY }} + ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }} + GET_STARKNET_PUBLIC_PATH: ${{ needs.prepare-deployment.outputs.GET_STARKNET_PUBLIC_PATH }} + LOG_LEVEL: ${{ needs.prepare-deployment.outputs.LOG_LEVEL }} + - name: Cache Build + uses: actions/cache@v3 + id: cache + with: + path: | + ./packages/get-starknet/dist/webpack + ./packages/wallet-ui/build + ./node_modules/.yarn-state.yml + key: ${{ needs.prepare-deployment.outputs.CACHE_KEY }} + + deploy-wallet-ui: + runs-on: ubuntu-latest + needs: + - prepare-deployment + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: eu-central-1 + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - name: Restore Cached Build + uses: actions/cache@v3 + id: restore-build + with: + path: | + ./packages/get-starknet/dist/webpack + ./packages/wallet-ui/build + ./packages/starknet-snap/package.json + ./packages/starknet-snap/dist + ./packages/starknet-snap/snap.manifest.json + ./node_modules/.yarn-state.yml + key: ${{ needs.prepare-deployment.outputs.CACHE_KEY }} + - name: Deploy to AWS + run: | + echo "Deployed Dapp to : $AWS_S3_URL" + aws s3 sync ./packages/wallet-ui/build "$AWS_S3_URL" + env: + AWS_S3_URL: ${{ needs.prepare-deployment.outputs.AWS_S3_URL }} + + deploy-get-starknet: + runs-on: ubuntu-latest + needs: + - prepare-deployment + - install-build + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: eu-central-1 + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - name: Restore Cached Build + uses: actions/cache@v3 + id: restore-build + with: + path: | + ./packages/get-starknet/dist/webpack + ./packages/wallet-ui/build + ./node_modules/.yarn-state.yml + key: ${{ needs.prepare-deployment.outputs.CACHE_KEY }} + - name: Deploy to AWS + run: | + echo "Deployed get Starknet to : $AWS_S3_GET_STARKNET_URL" + aws s3 sync ./packages/get-starknet/dist/webpack "$AWS_S3_GET_STARKNET_URL" + env: + AWS_S3_GET_STARKNET_URL: ${{ needs.prepare-deployment.outputs.AWS_S3_GET_STARKNET_URL }} + + invalid-aws-cdn-cache: + runs-on: ubuntu-latest + needs: + - deploy-wallet-ui + - deploy-get-starknet + - prepare-deployment + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: eu-central-1 + - name: Invalid AWS CDN Cache + run: | + echo "Distribution ID : $AWS_CLOUDFRONT_DISTRIBUTIONS_ID" + echo "$AWS_CLOUDFRONT_DISTRIBUTIONS_ID" | tr ',' '\n' | while read -r DISTRIBUTIONS_ID + do + echo "Processing Distribution ID : $DISTRIBUTIONS_ID" + INVALIDED_ID="$(aws cloudfront create-invalidation --distribution-id "$DISTRIBUTIONS_ID" --paths "/starknet/*" | grep Id | awk -F'"' '{ print $4}')" + echo "Waiting for invalidation $INVALIDED_ID" + aws cloudfront wait invalidation-completed --id "$INVALIDED_ID" --distribution-id "$DISTRIBUTIONS_ID" + echo "Invalidation $INVALIDED_ID completed" + done + env: + AWS_CLOUDFRONT_DISTRIBUTIONS_ID: ${{ needs.prepare-deployment.outputs.AWS_CLOUDFRONT_DISTRIBUTIONS_ID }} \ No newline at end of file diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml new file mode 100644 index 00000000..2167d01d --- /dev/null +++ b/.github/workflows/publish-npm.yml @@ -0,0 +1,172 @@ +name: Publish NPM + +on: + workflow_dispatch: + inputs: + environment: + description: 'Environment to deploy' + type: environment + required: true +jobs: + prepare-deployment: + environment: ${{ inputs.environment }} + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + - name: Prepare Parameters + id: prepare_parameters + run: | + BASE=$(node -p "require('./packages/starknet-snap/package.json').version") + HASH=$(git rev-parse --short HEAD) + DATE=$(date +%Y%m%d) + ENV=${{ inputs.environment }} + + if [[ $ENV == "dev" ]]; then + { + echo "VERSION=${BASE}-dev-${HASH}-${DATE}" + echo "TAG=dev" + echo "ENV=dev" + echo "LOG_LEVEL=6" + } >> "$GITHUB_OUTPUT" + elif [[ $ENV == "staging" ]]; then + { + echo "VERSION=${BASE}-staging" + echo "TAG=staging" + echo "ENV=staging" + echo "LOG_LEVEL=0" + } >> "$GITHUB_OUTPUT" + elif [[ $ENV == "production" ]]; then + { + echo "VERSION=${BASE}" + echo "TAG=latest" + echo "ENV=prod" + echo "LOG_LEVEL=0" + } >> "$GITHUB_OUTPUT" + else + echo "Invalid environment" + exit 1 + fi + outputs: + VERSION: ${{ steps.prepare_parameters.outputs.VERSION }} + TAG: ${{ steps.prepare_parameters.outputs.TAG }} + ENV: ${{ steps.prepare_parameters.outputs.ENV }} + CACHE_KEY: ${{ github.sha }}-${{ steps.prepare_parameters.outputs.ENV }}-npm + LOG_LEVEL: ${{ steps.prepare_parameters.outputs.LOG_LEVEL }} + + install-build: + needs: + - prepare-deployment + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + - name: Install + run: | + yarn --no-immutable + yarn allow-scripts + - name: Build Snap + run: | + echo "Building Snap with version $VERSION" + + npm --prefix ./packages/starknet-snap version --new-version "$VERSION" --no-git-tag-version --allow-same-version + + yarn workspace @consensys/starknet-snap build + + BUILD_VERSION=$(node -p "require('./packages/starknet-snap/package.json').version") + + if [[ "$VERSION" != "$BUILD_VERSION" ]]; then + echo "Version mismatch" + exit 1 + fi + env: + SNAP_ENV: ${{ needs.prepare-deployment.outputs.ENV }} + VERSION: ${{ needs.prepare-deployment.outputs.VERSION }} + LOG_LEVEL: ${{ needs.prepare-deployment.outputs.LOG_LEVEL }} + - name: Cache Build + uses: actions/cache@v3 + id: cache + with: + path: | + ./packages/starknet-snap/package.json + ./packages/starknet-snap/dist + ./packages/starknet-snap/snap.manifest.json + ./node_modules/.yarn-state.yml + key: ${{ needs.prepare-deployment.outputs.CACHE_KEY }} + + publish-npm-dry-run: + runs-on: ubuntu-latest + needs: + - prepare-deployment + - install-build + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + - name: Restore Cached Build + uses: actions/cache@v3 + id: restore-build + with: + # add /packages/snap/snap.manifest.json to include an updated shasum from build due to version update in auto PR + path: | + ./packages/starknet-snap/package.json + ./packages/starknet-snap/dist + ./packages/starknet-snap/snap.manifest.json + ./node_modules/.yarn-state.yml + key: ${{ needs.prepare-deployment.outputs.CACHE_KEY }} + - name: Dry Run Publish + run: | + npm pack ./packages/starknet-snap --tag "$TAG" --access public + env: + TAG: ${{ needs.prepare-deployment.outputs.TAG }} + + publish-npm: + runs-on: ubuntu-latest + needs: + - publish-npm-dry-run + - prepare-deployment + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.sha }} + - uses: actions/setup-node@v3 + with: + node-version: '20.x' + registry-url: 'https://registry.npmjs.org' + - name: Restore Cached Build + uses: actions/cache@v3 + id: restore-build + with: + # add /packages/snap/snap.manifest.json to include an updated shasum from build due to version update in auto PR + path: | + ./packages/get-starknet/dist/webpack + ./packages/wallet-ui/build + ./packages/starknet-snap/package.json + ./packages/starknet-snap/dist + ./packages/starknet-snap/snap.manifest.json + ./node_modules/.yarn-state.yml + key: ${{ needs.prepare-deployment.outputs.CACHE_KEY }} + - name: Run Publish + run: | + npm publish ./packages/starknet-snap --tag "$TAG" --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + TAG: ${{ needs.prepare-deployment.outputs.TAG }} \ No newline at end of file