Bläddra i källkod

Update CI templates

Loris Leiva 1 år sedan
förälder
incheckning
4606c18455
2 ändrade filer med 227 tillägg och 121 borttagningar
  1. 98 12
      template/base/.github/actions/setup/action.yml.njk
  2. 129 109
      template/base/.github/workflows/main.yml.njk

+ 98 - 12
template/base/.github/actions/setup/action.yml.njk

@@ -3,41 +3,127 @@ name: Setup environment
 inputs:
 {% if programFramework === 'anchor' %}
   anchor:
-    description: The Anchor version to install
+    description: The Anchor version to install. Skips if not provided.
+    required: false
 {% endif %}
-  cache:
-    description: Enable caching
-    default: "true"
+  cargo-cache-key:
+    description: The key to cache cargo dependencies. Skips cargo caching if not provided.
+    required: false
+  cargo-cache-fallback-key:
+    description: The fallback key to use when caching cargo dependencies. Default to not using a fallback key.
+    required: false
+  cargo-cache-local-key:
+    description: The key to cache local cargo dependencies. Skips local cargo caching if not provided.
+    required: false
+  clippy:
+    description: Install Clippy if `true`. Defaults to `false`.
+    required: false
   node:
-    description: The Node.js version to install
+    description: The Node.js version to install. Required.
     required: true
+  rustfmt:
+    description: Install Rustfmt if `true`. Defaults to `false`.
+    required: false
   solana:
-    description: The Solana version to install
+    description: The Solana version to install. Skips if not provided.
+    required: false
 
 runs:
-  using: "composite"
+  using: 'composite'
   steps:
     - name: Setup pnpm
       uses: pnpm/action-setup@v3
+
     - name: Setup Node.js
       uses: actions/setup-node@v4
       with:
         node-version: {% raw %}${{ inputs.node }}{% endraw %}
-        cache: "pnpm"
-    - name: Install dependencies
+        cache: 'pnpm'
+
+    - name: Install Dependencies
       run: pnpm install --frozen-lockfile
       shell: bash
+
+    - name: Set Environment Variables
+      shell: bash
+      run: pnpm zx ./scripts/ci/set-env.mjs
+
+{% if solanaVersion === '2.0' %}
+    - name: Install Protobuf Compiler (Temporary Workaround for Solana 2.0)
+      if: {% raw %}${{ inputs.solana || inputs.rustfmt == 'true' || inputs.clippy == 'true' }}{% endraw %}
+      shell: bash
+      run: |
+        sudo apt-get update
+        sudo apt-get install -y protobuf-compiler
+{% endif %}
+
+    - name: Install Rustfmt
+      if: {% raw %}${{ inputs.rustfmt == 'true' }}{% endraw %}
+      uses: dtolnay/rust-toolchain@master
+      with:
+        toolchain: {% raw %}${{ env.RUSTFMT_NIGHTLY_VERSION }}{% endraw %}
+        components: rustfmt
+
+    - name: Install Clippy
+      if: {% raw %}${{ inputs.clippy == 'true' }}{% endraw %}
+      uses: dtolnay/rust-toolchain@master
+      with:
+        toolchain: {% raw %}${{ env.CLIPPY_NIGHTLY_VERSION }}{% endraw %}
+        components: clippy
+
     - name: Install Solana
-      if: {% raw %}${{ inputs.solana != '' }}{% endraw %}
+      if: {% raw %}${{ inputs.solana }}{% endraw %}
       uses: metaplex-foundation/actions/install-solana@v1
       with:
         version: {% raw %}${{ inputs.solana }}{% endraw %}
-        cache: {% raw %}${{ inputs.cache }}{% endraw %}
+        cache: true
+
 {% if programFramework === 'anchor' %}
     - name: Install Anchor
       if: {% raw %}${{ inputs.anchor != '' }}{% endraw %}
       uses: metaplex-foundation/actions/install-anchor-cli@v1
       with:
         version: {% raw %}${{ inputs.anchor }}{% endraw %}
-        cache: {% raw %}${{ inputs.cache }}{% endraw %}
+        cache: true
 {% endif %}
+
+    - name: Cache Cargo Dependencies
+      if: {% raw %}${{ inputs.cargo-cache-key && !inputs.cargo-cache-fallback-key }}{% endraw %}
+      uses: actions/cache@v4
+      with:
+        path: |
+          ~/.cargo/bin/
+          ~/.cargo/registry/index/
+          ~/.cargo/registry/cache/
+          ~/.cargo/git/db/
+          target/
+        key: {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-key }}-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
+        restore-keys: {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-key }}{% endraw %}
+
+    - name: Cache Cargo Dependencies With Fallback
+      if: {% raw %}${{ inputs.cargo-cache-key && inputs.cargo-cache-fallback-key }}{% endraw %}
+      uses: actions/cache@v4
+      with:
+        path: |
+          ~/.cargo/bin/
+          ~/.cargo/registry/index/
+          ~/.cargo/registry/cache/
+          ~/.cargo/git/db/
+          target/
+        key: {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-key }}-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
+        restore-keys: |
+          {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-key }}{% endraw %}
+          {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-fallback-key }}-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
+          {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-fallback-key }}{% endraw %}
+
+    - name: Cache Local Cargo Dependencies
+      if: {% raw %}${{ inputs.cargo-cache-local-key }}{% endraw %}
+      uses: actions/cache@v4
+      with:
+        path: |
+          .cargo/bin/
+          .cargo/registry/index/
+          .cargo/registry/cache/
+          .cargo/git/db/
+        key: {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-local-key }}-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
+        restore-keys: {% raw %}${{ runner.os }}-${{ inputs.cargo-cache-local-key }}{% endraw %}

+ 129 - 109
template/base/.github/workflows/main.yml.njk

@@ -12,203 +12,223 @@ env:
 {% if programFramework === 'anchor' %}
   ANCHOR_VERSION: 0.30.0
 {% endif %}
-  CARGO_CACHE: |
-    ~/.cargo/bin/
-    ~/.cargo/registry/index/
-    ~/.cargo/registry/cache/
-    ~/.cargo/git/db/
-    target/
 
 jobs:
+  format_and_lint_programs:
+    name: Format & Lint Programs
+    runs-on: ubuntu-latest
+    steps:
+      - name: Git Checkout
+        uses: actions/checkout@v4
+
+      - name: Setup Environment
+        uses: ./.github/actions/setup
+        with:
+          clippy: true
+          node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
+          rustfmt: true
+
+      - name: Format Programs
+        run: pnpm programs:format
+
+      - name: Lint Programs
+        run: pnpm programs:lint
+
+{% if jsClient %}
+  format_and_lint_client_js:
+    name: Format & Lint Client JS
+    runs-on: ubuntu-latest
+    steps:
+      - name: Git Checkout
+        uses: actions/checkout@v4
+
+      - name: Setup Environment
+        uses: ./.github/actions/setup
+        with:
+          node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
+
+      - name: Format Client JS
+        run: pnpm clients:js:format
+
+      - name: Lint Client JS
+        run: pnpm clients:js:lint
+{% endif %}
+
+{% if rustClient %}
+  format_and_lint_client_rust:
+    name: Format & Lint Client Rust
+    runs-on: ubuntu-latest
+    steps:
+      - name: Git Checkout
+        uses: actions/checkout@v4
+
+      - name: Setup Environment
+        uses: ./.github/actions/setup
+        with:
+          clippy: true
+          node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
+          rustfmt: true
+
+      - name: Format Client Rust
+        run: pnpm clients:rust:format
+
+      - name: Lint Client Rust
+        run: pnpm clients:rust:lint
+{% endif %}
+
   build_programs:
     name: Build programs
     runs-on: ubuntu-latest
+    needs: format_and_lint_programs
     steps:
-      - name: Git checkout
+      - name: Git Checkout
         uses: actions/checkout@v4
-      - name: Setup environment
+
+      - name: Setup Environment
         uses: ./.github/actions/setup
         with:
+          cargo-cache-key: cargo-programs
           node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
           solana: {% raw %}${{ env.SOLANA_VERSION }}{% endraw %}
 {% if programFramework === 'anchor' %}
           anchor: {% raw %}${{ env.ANCHOR_VERSION }}{% endraw %}
 {% endif %}
-      - name: Cache cargo dependencies
-        uses: actions/cache@v4
-        with:
-          path: {% raw %}${{ env.CARGO_CACHE }}{% endraw %}
-          key: {% raw %}${{ runner.os }}-cargo-programs-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
-          restore-keys: {% raw %}${{ runner.os }}-cargo-programs{% endraw %}
-      - name: Build programs
+
+      - name: Build Programs
         run: pnpm programs:build
-      - name: Upload program builds
+
+      - name: Upload Program Builds
         uses: actions/upload-artifact@v4
         with:
           name: program-builds
           path: ./target/deploy/*.so
           if-no-files-found: error
-      - name: Save all builds for clients
+
+      - name: Save Program Builds For Client Jobs
         uses: actions/cache/save@v4
         with:
           path: ./**/*.so
           key: {% raw %}${{ runner.os }}-builds-${{ github.sha }}{% endraw %}
 
   test_programs:
-    name: Test programs
+    name: Test Progams
     runs-on: ubuntu-latest
+    needs: format_and_lint_programs
     steps:
-      - name: Git checkout
+      - name: Git Checkout
         uses: actions/checkout@v4
-      - name: Setup environment
+
+      - name: Setup Environment
         uses: ./.github/actions/setup
         with:
+          cargo-cache-key: cargo-program-tests
+          cargo-cache-fallback-key: cargo-programs
           node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
           solana: {% raw %}${{ env.SOLANA_VERSION }}{% endraw %}
 {% if programFramework === 'anchor' %}
           anchor: {% raw %}${{ env.ANCHOR_VERSION }}{% endraw %}
 {% endif %}
-      - name: Cache test cargo dependencies
-        uses: actions/cache@v4
-        with:
-          path: {% raw %}${{ env.CARGO_CACHE }}{% endraw %}
-          key: {% raw %}${{ runner.os }}-cargo-program-tests-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
-          restore-keys: |
-            {% raw %}${{ runner.os }}-cargo-program-tests{% endraw %}
-            {% raw %}${{ runner.os }}-cargo-programs-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
-            {% raw %}${{ runner.os }}-cargo-programs{% endraw %}
-      - name: Test programs
+
+      - name: Test Programs
         run: pnpm programs:test
 
   generate_idls:
-    name: Check IDL generation
-    needs: build_programs
+    name: Check IDL Generation
     runs-on: ubuntu-latest
+    needs: format_and_lint_programs
     steps:
-      - name: Git checkout
+      - name: Git Checkout
         uses: actions/checkout@v4
-      - name: Setup environment
+
+      - name: Setup Environment
         uses: ./.github/actions/setup
         with:
+          cargo-cache-key: cargo-programs
+          cargo-cache-local-key: cargo-local
           node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
-          solana: {% raw %}${{ env.SOLANA_VERSION }}{% endraw %}
 {% if programFramework === 'anchor' %}
           anchor: {% raw %}${{ env.ANCHOR_VERSION }}{% endraw %}
 {% endif %}
-      - name: Cache cargo dependencies
-        uses: actions/cache@v4
-        with:
-          path: {% raw %}${{ env.CARGO_CACHE }}{% endraw %}
-          key: {% raw %}${{ runner.os }}-cargo-programs-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
-          restore-keys: {% raw %}${{ runner.os }}-cargo-programs{% endraw %}
-      - name: Cache local cargo dependencies
-        uses: actions/cache@v4
-        with:
-          path: |
-            .cargo/bin/
-            .cargo/registry/index/
-            .cargo/registry/cache/
-            .cargo/git/db/
-          key: {% raw %}${{ runner.os }}-cargo-local-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
-          restore-keys: {% raw %}${{ runner.os }}-cargo-local{% endraw %}
+
       - name: Generate IDLs
         run: pnpm generate:idls
-      - name: Ensure working directory is clean
-        run: test -z "$(git status --porcelain)"
+
+      - name: Check Working Directory
+        run: |
+          git status --porcelain
+          test -z "$(git status --porcelain)"
 
 {% if clients.length > 0 %}
   generate_clients:
-    name: Check client generation
-    needs: build_programs
+    name: Check Client Generation
     runs-on: ubuntu-latest
+    needs: format_and_lint_programs
     steps:
-      - name: Git checkout
+      - name: Git Checkout
         uses: actions/checkout@v4
-      - name: Setup environment
+
+      - name: Setup Environment
         uses: ./.github/actions/setup
         with:
           node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
-          solana: {% raw %}${{ env.SOLANA_VERSION }}{% endraw %}
-      - name: Generate clients
+          rustfmt: true
+
+      - name: Generate Clients
         run: pnpm generate:clients
-      - name: Ensure working directory is clean
-        run: test -z "$(git status --porcelain)"
+
+      - name: Check Working Directory
+        run: |
+          git status --porcelain
+          test -z "$(git status --porcelain)"
 {% endif %}
 
 {% if jsClient %}
-  test_js:
-    name: Test JS client
-    needs: build_programs
+  test_client_js:
+    name: Test Client JS
     runs-on: ubuntu-latest
+    needs: build_programs
     steps:
-      - name: Git checkout
+      - name: Git Checkout
         uses: actions/checkout@v4
-      - name: Setup environment
+
+      - name: Setup Environment
         uses: ./.github/actions/setup
         with:
           node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
           solana: {% raw %}${{ env.SOLANA_VERSION }}{% endraw %}
-      - name: Restore all builds
+
+      - name: Restore Program Builds
         uses: actions/cache/restore@v4
         with:
           path: ./**/*.so
           key: {% raw %}${{ runner.os }}-builds-${{ github.sha }}{% endraw %}
-      - name: Test JS client
-        run: pnpm clients:js:test
 
-  lint_js:
-    name: Lint JS client
-    needs: build_programs
-    runs-on: ubuntu-latest
-    steps:
-      - name: Git checkout
-        uses: actions/checkout@v4
-      - name: Setup environment
-        uses: ./.github/actions/setup
-        with:
-          node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
-      - name: Lint JS client
-        run: pnpm clients:js:lint
+      - name: Test Client JS
+        run: pnpm clients:js:test
 {% endif %}
 
 {% if rustClient %}
-  test_rust:
-    name: Test Rust client
-    needs: build_programs
+  test_client_rust:
+    name: Test Client Rust
     runs-on: ubuntu-latest
+    needs: build_programs
     steps:
-      - name: Git checkout
+      - name: Git Checkout
         uses: actions/checkout@v4
-      - name: Setup environment
+
+      - name: Setup Environment
         uses: ./.github/actions/setup
         with:
+          cargo-cache-key: cargo-rust-client
           node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
           solana: {% raw %}${{ env.SOLANA_VERSION }}{% endraw %}
-      - name: Cache Rust client dependencies
-        uses: actions/cache@v4
-        with:
-          path: {% raw %}${{ env.CARGO_CACHE }}{% endraw %}
-          key: {% raw %}${{ runner.os }}-cargo-rust-client-${{ hashFiles('**/Cargo.lock') }}{% endraw %}
-          restore-keys: {% raw %}${{ runner.os }}-cargo-rust-client{% endraw %}
-      - name: Restore all builds
+
+      - name: Restore Program Builds
         uses: actions/cache/restore@v4
         with:
           path: ./**/*.so
           key: {% raw %}${{ runner.os }}-builds-${{ github.sha }}{% endraw %}
-      - name: Test Rust client
-        run: pnpm clients:rust:test
 
-  lint_rust:
-    name: Lint Rust client
-    needs: build_programs
-    runs-on: ubuntu-latest
-    steps:
-      - name: Git checkout
-        uses: actions/checkout@v4
-      - name: Setup environment
-        uses: ./.github/actions/setup
-        with:
-          node: {% raw %}${{ env.NODE_VERSION }}{% endraw %}
-      - name: Lint Rust client
-        run: pnpm clients:rust:lint
+      - name: Test Client Rust
+        run: pnpm clients:rust:test
 {% endif %}