Skip to content

Commit 7d65ccc

Browse files
committed
Use self-hosted arm64 runner from Huawei Cloud
1 parent b0db1a1 commit 7d65ccc

11 files changed

+1198
-161
lines changed

.github/generate-workflows.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python3
2+
import os
3+
import json
4+
import itertools
5+
6+
7+
def chunked_iter(iterable, size):
8+
it = iter(iterable)
9+
while True:
10+
chunk = tuple(itertools.islice(it, size))
11+
if not chunk:
12+
break
13+
yield chunk
14+
15+
16+
def main():
17+
current_dir = os.path.abspath(os.path.dirname(__file__))
18+
tpl_file = os.path.join(current_dir, 'workflow.yml.template')
19+
with open(tpl_file, encoding='utf-8') as f:
20+
template = f.read()
21+
targets_file = os.path.join(current_dir, 'targets.json')
22+
with open(targets_file) as f:
23+
all_targets = json.load(f)
24+
for targets in chunked_iter(all_targets, 2):
25+
target_name = ','.join(x['IMAGE_TAG'] for x in targets)
26+
target_env = json.dumps(targets)
27+
content = template.replace('#TARGETNAME#', target_name).replace('#ENV#', target_env)
28+
workflow_file = os.path.join(current_dir, 'workflows', f'{target_name.replace(",", "_")}.yml')
29+
with open(workflow_file, 'w', encoding='utf-8') as f:
30+
f.write(content)
31+
32+
33+
if __name__ == '__main__':
34+
main()

.github/targets.json

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
[
2+
{
3+
"IMAGE_TAG": "aarch64-musl",
4+
"TARGET": "aarch64-unknown-linux-musl",
5+
"OPENSSL_ARCH": "linux-aarch64",
6+
"RUST_MUSL_MAKE_CONFIG": "config.mak",
7+
"TOOLCHAIN": "stable"
8+
},
9+
{
10+
"IMAGE_TAG": "arm-musleabi",
11+
"TARGET": "arm-unknown-linux-musleabi",
12+
"OPENSSL_ARCH": "linux-armv4",
13+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
14+
"TOOLCHAIN": "stable"
15+
},
16+
{
17+
"IMAGE_TAG": "arm-musleabihf",
18+
"TARGET": "arm-unknown-linux-musleabihf",
19+
"OPENSSL_ARCH": "linux-armv4",
20+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
21+
"TOOLCHAIN": "stable"
22+
},
23+
{
24+
"IMAGE_TAG": "armv5te-musleabi",
25+
"TARGET": "armv5te-unknown-linux-musleabi",
26+
"OPENSSL_ARCH": "linux-armv4",
27+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
28+
"TOOLCHAIN": "stable"
29+
},
30+
{
31+
"IMAGE_TAG": "armv7-musleabi",
32+
"TARGET": "armv7-unknown-linux-musleabi",
33+
"OPENSSL_ARCH": "linux-armv4",
34+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
35+
"TOOLCHAIN": "stable"
36+
},
37+
{
38+
"IMAGE_TAG": "armv7-musleabihf",
39+
"TARGET": "armv7-unknown-linux-musleabihf",
40+
"OPENSSL_ARCH": "linux-armv4",
41+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
42+
"TOOLCHAIN": "stable"
43+
},
44+
{
45+
"IMAGE_TAG": "i586-musl",
46+
"TARGET": "i586-unknown-linux-musl",
47+
"OPENSSL_ARCH": "linux-elf",
48+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
49+
"TOOLCHAIN": "stable"
50+
},
51+
{
52+
"IMAGE_TAG": "i686-musl",
53+
"TARGET": "i686-unknown-linux-musl",
54+
"OPENSSL_ARCH": "linux-elf",
55+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
56+
"TOOLCHAIN": "stable"
57+
},
58+
{
59+
"IMAGE_TAG": "mips-musl",
60+
"TARGET": "mips-unknown-linux-musl",
61+
"OPENSSL_ARCH": "linux-mips32",
62+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
63+
"TOOLCHAIN": "stable"
64+
},
65+
{
66+
"IMAGE_TAG": "mips64-muslabi64",
67+
"TARGET": "mips64-unknown-linux-muslabi64",
68+
"OPENSSL_ARCH": "linux64-mips64",
69+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
70+
"TOOLCHAIN": "stable"
71+
},
72+
{
73+
"IMAGE_TAG": "mips64el-muslabi64",
74+
"TARGET": "mips64el-unknown-linux-muslabi64",
75+
"OPENSSL_ARCH": "linux64-mips64",
76+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
77+
"TOOLCHAIN": "stable"
78+
},
79+
{
80+
"IMAGE_TAG": "mipsel-musl",
81+
"TARGET": "mipsel-unknown-linux-musl",
82+
"OPENSSL_ARCH": "linux-mips32",
83+
"RUST_MUSL_MAKE_CONFIG": "config.mak.32",
84+
"TOOLCHAIN": "stable"
85+
},
86+
{
87+
"IMAGE_TAG": "powerpc64le-musl",
88+
"TARGET": "powerpc64le-unknown-linux-musl",
89+
"OPENSSL_ARCH": "linux-ppc64le",
90+
"RUST_MUSL_MAKE_CONFIG": "config.mak",
91+
"TOOLCHAIN": "nightly"
92+
},
93+
{
94+
"IMAGE_TAG": "x86_64-musl",
95+
"TARGET": "x86_64-unknown-linux-musl",
96+
"OPENSSL_ARCH": "linux-x86_64",
97+
"RUST_MUSL_MAKE_CONFIG": "config.mak",
98+
"TOOLCHAIN": "stable"
99+
}
100+
]

.github/workflow.yml.template

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
on:
2+
push:
3+
pull_request:
4+
schedule:
5+
- cron: '0 0 * * 2'
6+
7+
name: Build - #TARGETNAME#
8+
9+
jobs:
10+
start-runner:
11+
name: Start self-hosted ECS runner
12+
runs-on: ubuntu-latest
13+
outputs:
14+
label: ${{ steps.start-ecs-runner.outputs.label }}
15+
ecs-instance-id: ${{ steps.start-ecs-runner.outputs.ecs-instance-id }}
16+
steps:
17+
- uses: actions/checkout@v2
18+
- name: Start ECS runner
19+
id: start-ecs-runner
20+
uses: messense/huaweicloud-github-runner@main
21+
with:
22+
mode: start
23+
github-token: ${{ secrets.GH_PAT }}
24+
huawei-cloud-ak: ${{ secrets.HUAWEI_CLOUD_AK }}
25+
huawei-cloud-sk: ${{ secrets.HUAWEI_CLOUD_SK }}
26+
project-id: ${{ secrets.PROJECT_ID }}
27+
availability-zone: ap-southeast-1b
28+
ecs-image-id: 93b1fc8d-ee4e-4126-950e-8f4404408acc
29+
ecs-instance-type: kc1.large.2
30+
vpc-id: ${{ secrets.VPC_ID }}
31+
subnet-id: ${{ secrets.SUBNET_ID }}
32+
security-group-id: ${{ secrets.SECURITY_GROUP_ID }}
33+
34+
build:
35+
name: Build - ${{ matrix.os.arch }} - ${{ matrix.env.IMAGE_TAG }}
36+
needs: start-runner
37+
runs-on: ${{ matrix.os.label }}
38+
strategy:
39+
matrix:
40+
os:
41+
- arch: 'amd64'
42+
label: ['ubuntu-latest']
43+
- arch: 'arm64'
44+
label: ${{ needs.start-runner.outputs.label }}
45+
env: #ENV#
46+
env: ${{ matrix.env }}
47+
steps:
48+
- uses: actions/checkout@v2
49+
- name: Setup Docker Buildx
50+
uses: docker/setup-buildx-action@v1
51+
- name: Login to DockerHub
52+
uses: docker/login-action@v1
53+
with:
54+
username: ${{ secrets.DOCKER_USERNAME }}
55+
password: ${{ secrets.DOCKER_TOKEN }}
56+
- name: Cache Docker layers
57+
uses: actions/cache@v2
58+
with:
59+
path: /tmp/.buildx-cache
60+
key: ${{ runner.os }}-${{ matrix.os.arch }}-${{ matrix.env.TARGET }}-buildx-${{ github.sha }}
61+
restore-keys: |
62+
${{ runner.os }}-${{ matrix.os.arch }}-${{ matrix.env.TARGET }}-buildx-
63+
- name: Clean Docker cache
64+
if: "contains(github.event.head_commit.message, '[clean cache]')"
65+
continue-on-error: true
66+
run: |
67+
rm -rf /tmp/.buildx-cache
68+
- name: docker build
69+
uses: docker/build-push-action@v2
70+
with:
71+
platforms: linux/${{ matrix.os.arch }}
72+
build-args: |
73+
TARGET=${{ matrix.env.TARGET }}
74+
OPENSSL_ARCH=${{ matrix.env.OPENSSL_ARCH }}
75+
RUST_MUSL_MAKE_CONFIG=${{ matrix.env.RUST_MUSL_MAKE_CONFIG }}
76+
TOOLCHAIN=${{ matrix.env.TOOLCHAIN }}
77+
tags: messense/rust-musl-cross:${{ matrix.env.IMAGE_TAG }}-${{ matrix.os.arch }}
78+
load: true
79+
cache-from: type=local,src=/tmp/.buildx-cache
80+
cache-to: type=local,dest=/tmp/.buildx-cache-new
81+
- name: Move cache
82+
run: |
83+
# Temp fix
84+
# https://github.com/docker/build-push-action/issues/252
85+
# https://github.com/moby/buildkit/issues/1896
86+
rm -rf /tmp/.buildx-cache
87+
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
88+
- name: Test Docker cargo build
89+
run: |
90+
docker run --rm \
91+
-v "$(pwd)/tests":/home/rust/src \
92+
messense/rust-musl-cross:$IMAGE_TAG-${{ matrix.os.arch }} bash -c "cargo build; cargo clean"
93+
- name: Build and push multiarch image
94+
if: github.ref == 'refs/heads/master'
95+
run: |
96+
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
97+
docker push messense/rust-musl-cross:$IMAGE_TAG-${{ matrix.os.arch }}
98+
99+
echo "image: messense/rust-musl-cross:$IMAGE_TAG
100+
manifests:
101+
- image: messense/rust-musl-cross:$IMAGE_TAG-amd64
102+
platform:
103+
architecture: amd64
104+
os: linux
105+
- image: messense/rust-musl-cross:$IMAGE_TAG-arm64
106+
platform:
107+
architecture: arm64
108+
os: linux
109+
" > manifest.yaml
110+
111+
curl -sqL -o manifest-tool https://github.com/estesp/manifest-tool/releases/download/v1.0.3/manifest-tool-linux-${{ matrix.os.arch }}
112+
chmod +x manifest-tool
113+
./manifest-tool push from-spec manifest.yaml
114+
115+
stop-runner:
116+
name: Stop self-hosted ECS runner
117+
needs: [start-runner, build]
118+
runs-on: ubuntu-latest
119+
if: ${{ always() }}
120+
steps:
121+
- uses: actions/checkout@v2
122+
- name: Stop ECS runner
123+
if: ${{ needs.start-runner.outputs.ecs-instance-id }}
124+
uses: messense/huaweicloud-github-runner@main
125+
with:
126+
mode: stop
127+
github-token: ${{ secrets.GH_PAT }}
128+
huawei-cloud-ak: ${{ secrets.HUAWEI_CLOUD_AK }}
129+
huawei-cloud-sk: ${{ secrets.HUAWEI_CLOUD_SK }}
130+
project-id: ${{ secrets.PROJECT_ID }}
131+
availability-zone: ap-southeast-1b
132+
label: ${{ needs.start-runner.outputs.label }}
133+
ecs-instance-id: ${{ needs.start-runner.outputs.ecs-instance-id }}

0 commit comments

Comments
 (0)