Skip to content

Commit

Permalink
chore(ci): add test ci (#62)
Browse files Browse the repository at this point in the history
Signed-off-by: Kevin Cui <bh@bugs.cc>
  • Loading branch information
BlackHole1 authored Feb 22, 2024
1 parent f94128a commit 55b4e5c
Show file tree
Hide file tree
Showing 3 changed files with 218 additions and 1 deletion.
12 changes: 12 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## Description of Change

<!--- Describe your changes in detail -->

## Required to run CI

- [ ] applehv-rootfs-amd64
- [ ] applehv-rootfs-arm64
- [ ] initrd-amd64
- [ ] initrd-arm64
- [ ] kernel-amd64
- [ ] kernel-arm64
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ jobs:
run: make defconfig-${{ matrix.target }}-${{ matrix.arch }}

- name: Build
run: make build-${{ matrix.target }}-${{ matrix.arch }}
run: make build-${{ matrix.target }}-${{ matrix.arch }} -j$(nproc)

- name: Upload binaries
run: |
Expand Down
205 changes: 205 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
name: Test

on:
pull_request:
branches:
- main
types:
- opened
- synchronize
- reopened
- edited

permissions:
contents: read
pull-requests: write
issues: write

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
pre-test:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
need_to_run: ${{ steps.set-matrix.outputs.need_to_run }}

steps:
- name: generate matrix from PR body
id: set-matrix
env:
RAW_BODY: ${{ github.event.pull_request.body }}
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
script: |
const TASK_REGEXP = /- \[x\] (.*)/g;
const getTask = (text) => {
const result = [];
let match;
while ((match = TASK_REGEXP.exec(text)) !== null) {
result.push(match[1]);
}
return {
matrix: result,
need_to_run: result.length > 0
};
}
if (context.payload.action !== "edited") {
console.log("not edited event");
const { matrix, need_to_run } = getTask(process.env.RAW_BODY);
core.setOutput("matrix", matrix);
core.setOutput("need_to_run", need_to_run);
return;
}
const query = `query ($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
userContentEdits(first: 2) {
nodes {
diff
}
}
}
}
}`;
const variables = {
owner: context.repo.owner,
name: context.repo.repo,
number: context.issue.number
};
const history = await github.graphql(query, variables);
if (history.repository.pullRequest.userContentEdits.nodes.length !== 2) {
console.log("not enough history")
const { matrix, need_to_run } = getTask(process.env.RAW_BODY);
core.setOutput("matrix", matrix);
core.setOutput("need_to_run", need_to_run);
return;
}
const latestTasks = getTask(history.repository.pullRequest.userContentEdits.nodes[0].diff);
const previousTasks = getTask(history.repository.pullRequest.userContentEdits.nodes[1].diff);
const sortLatest = latestTasks.matrix.sort();
const sortPrevious = previousTasks.matrix.sort();
for (const [index, task] of sortPrevious.entries()) {
if (sortLatest[index] === undefined) {
console.log("latest task is less than previous, skip");
continue;
}
if (task !== sortLatest[index]) {
console.log(`has added ${task}, need to run`);
const { matrix, need_to_run } = latestTasks;
core.setOutput("matrix", matrix);
core.setOutput("need_to_run", need_to_run);
return;
}
}
console.log("no new task added, skip");
core.setOutput("matrix", []);
core.setOutput("need_to_run", false);
test:
runs-on: ubuntu-latest
needs: pre-test
if: ${{ needs.pre-test.outputs.need_to_run == 'true' }}

outputs:
matrix: ${{ needs.pre-test.outputs.matrix }}

strategy:
fail-fast: true
matrix:
target-arch: ${{ fromJSON(needs.pre-test.outputs.matrix) }}

steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

- name: Update kernel submodules
if: ${{ startsWith(matrix.target-arch, 'kernel') }}
run: git submodule update --init kernel

- name: Update buildroot submodules
if: ${{ !startsWith(matrix.target-arch, 'kernel') }}
run: git submodule update --init buildroot

- name: Install deps
run: sudo apt-get install -y build-essential flex bison libssl-dev libelf-dev bc

- name: Install kernel arm64 deps
if: ${{ matrix.target-arch == 'kernel-arm64' }}
run: sudo apt-get install -y gcc-aarch64-linux-gnu

- name: Defconfig
run: make defconfig-${{ matrix.target-arch }}

- name: Build
run: make build-${{ matrix.target-arch }} -j$(nproc)

- name: Get output file size
run: |
FILE_PATH=$(make print-outpath-${{ matrix.target-arch }})
SIZE_B=$(stat -c%s "$FILE_PATH")
SIZE_MB=$(echo $SIZE_B | awk '{ printf "%.4f", $1 / 1024 / 1024 }')
mkdir outputs-size
echo "${{ matrix.target-arch }} $SIZE_MB $SIZE_B" > outputs-size/${{ matrix.target-arch }}.txt
- uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: ${{ github.run_id }}-${{ github.run_number }}-${{ matrix.target-arch }}
path: outputs-size/*.txt
retention-days: 1

post-test:
runs-on: ubuntu-latest
needs:
- pre-test
- test
if: ${{ needs.pre-test.outputs.need_to_run == 'true' }}

steps:
- name: Load outputs-size
uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe # v4.1.2
with:
pattern: ${{ github.run_id }}-${{ github.run_number }}-*
path: outputs-size
merge-multiple: true

- name: Format outputs-size
id: size
run: |
cat > comment.md <<EOF
Build Output Summary
|Target|Size|
|-|-|
`sort outputs-size/*.txt | awk '{ printf "|**"$1"**|*"$2"MB ("$3" bytes)*|\n" }'`
EOF
- name: Find comment
uses: peter-evans/find-comment@d5fe37641ad8451bdd80312415672ba26c86575e # v3.0.0
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Build Output Summary

- name: Create or update comment
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body-path: ./comment.md
edit-mode: replace

0 comments on commit 55b4e5c

Please sign in to comment.