aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/check-kernel-patches.yml
blob: 274bae367ded566683afc5f6d377ef9192de36e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
name: Refresh kernel for target

on:
  workflow_call:
    inputs:
      target:
        required: true
        type: string
      testing:
        type: boolean
      use_openwrt_container:
        type: boolean
        default: true

permissions:
  contents: read

jobs:
  setup_build:
    name: Setup build
    runs-on: ubuntu-latest
    outputs:
      owner_lc: ${{ steps.lower_owner.outputs.owner_lc }}
      container_tag: ${{ steps.determine_tools_container.outputs.container_tag }}

    steps:
      - name: Set lower case owner name
        id: lower_owner
        run: |
          OWNER_LC=$(echo "${{ github.repository_owner }}" \
            | tr '[:upper:]' '[:lower:]')

          if [ ${{ inputs.use_openwrt_container }} == "true" ]; then
            OWNER_LC=openwrt
          fi

          echo "owner_lc=$OWNER_LC" >> $GITHUB_OUTPUT

      # Per branch tools container tag
      # By default stick to latest
      # For official test targetting openwrt stable branch
      # Get the branch or parse the tag and push dedicated tools containers
      # For local test to use the correct container for stable release testing
      # you need to use for the branch name a prefix of openwrt-[0-9][0-9].[0-9][0-9]-
      - name: Determine tools container tag
        id: determine_tools_container
        run: |
          CONTAINER_TAG=latest
          if [ -n "${{ github.base_ref }}" ]; then
            if echo "${{ github.base_ref }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]$'; then
              CONTAINER_TAG="${{ github.base_ref }}"
            fi
          elif [ ${{ github.ref_type }} == "branch" ]; then
            if echo "${{ github.ref_name }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]$'; then
              CONTAINER_TAG=${{ github.ref_name }}
            elif echo "${{ github.ref_name }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]-'; then
              CONTAINER_TAG="$(echo ${{ github.ref_name }} | sed 's/^\(openwrt-[0-9][0-9]\.[0-9][0-9]\)-.*/\1/')"
            fi
          elif [ ${{ github.ref_type }} == "tag" ]; then
            if echo "${{ github.ref_name }}" | grep -q -E '^v[0-9][0-9]\.[0-9][0-9]\..+'; then
              CONTAINER_TAG=openwrt-"$(echo ${{ github.ref_name }} | sed 's/^v\([0-9][0-9]\.[0-9][0-9]\)\..\+/\1/')"
            fi
          fi
          echo "Tools container to use tools:$CONTAINER_TAG"
          echo "container_tag=$CONTAINER_TAG" >> $GITHUB_OUTPUT

  check-patch:
    name: Check Kernel patches
    needs: setup_build
    runs-on: ubuntu-latest

    container: ghcr.io/${{ needs.setup_build.outputs.owner_lc }}/tools:${{ needs.setup_build.outputs.container_tag }}

    permissions:
      contents: read
      packages: read

    steps:
      - name: Checkout master directory
        uses: actions/checkout@v3
        with:
          path: openwrt

      - name: Fix permission
        run: |
          chown -R buildbot:buildbot openwrt

      - name: Initialization environment
        run: |
          TARGET=$(echo ${{ inputs.target }} | cut -d "/" -f 1)
          SUBTARGET=$(echo ${{ inputs.target }} | cut -d "/" -f 2)
          echo "TARGET=$TARGET" >> "$GITHUB_ENV"
          echo "SUBTARGET=$SUBTARGET" >> "$GITHUB_ENV"

      - name: Prepare prebuilt tools
        shell: su buildbot -c "sh -e {0}"
        working-directory: openwrt
        run: |
          mkdir -p staging_dir build_dir
          ln -sf /prebuilt_tools/staging_dir/host staging_dir/host
          ln -sf /prebuilt_tools/build_dir/host build_dir/host

          ./scripts/ext-tools.sh --refresh

      - name: Configure testing kernel
        if: inputs.testing == true
        shell: su buildbot -c "sh -e {0}"
        working-directory: openwrt
        run: |
          echo CONFIG_TESTING_KERNEL=y >> .config

      - name: Configure system
        shell: su buildbot -c "sh -e {0}"
        working-directory: openwrt
        run: |
          echo CONFIG_ALL_KMODS=y >> .config
          echo CONFIG_DEVEL=y >> .config
          echo CONFIG_AUTOREMOVE=y >> .config
          echo CONFIG_CCACHE=y >> .config

          echo "CONFIG_TARGET_${{ env.TARGET }}=y" >> .config
          echo "CONFIG_TARGET_${{ env.TARGET }}_${{ env.SUBTARGET }}=y" >> .config

          make defconfig

      - name: Build tools
        shell: su buildbot -c "sh -e {0}"
        working-directory: openwrt
        run: make tools/quilt/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh

      - name: Refresh Kernel patches
        shell: su buildbot -c "sh -e {0}"
        working-directory: openwrt
        run: make target/linux/refresh V=s

      - name: Validate Refreshed Kernel Patches
        shell: su buildbot -c "sh -e {0}"
        working-directory: openwrt
        run: |
          . .github/workflows/scripts/ci_helpers.sh

          if git diff --name-only --exit-code; then
            success "Kernel patches for ${{ env.TARGET }}/${{ env.SUBTARGET }} seems ok"
          else
            err "Kernel patches for ${{ env.TARGET }}/${{ env.SUBTARGET }} require refresh. (run 'make target/linux/refresh' and force push this pr)"
            err "You can also check the provided artifacts with the refreshed patch from this CI run."
            mkdir ${{ env.TARGET }}-${{ env.SUBTARGET }}-refreshed
            for f in $(git diff --name-only); do
              cp --parents $f ${{ env.TARGET }}-${{ env.SUBTARGET }}-refreshed/
            done
            exit 1
          fi

      - name: Upload Refreshed Patches
        if: failure()
        uses: actions/upload-artifact@v3
        with:
          name: ${{ env.TARGET }}-${{ env.SUBTARGET }}-refreshed
          path: openwrt/${{ env.TARGET }}-${{ env.SUBTARGET }}-refreshed