-
Notifications
You must be signed in to change notification settings - Fork 0
159 lines (141 loc) · 5.26 KB
/
wsl-docker.yml
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: Build Ubuntu WSL Docker image
on:
schedule:
# update once a week
- cron: "0 0 * * SUN"
push:
branches:
- main
paths:
- .github/workflows/wsl-docker.yml
pull_request:
branches:
- main
paths:
- .github/workflows/wsl-docker.yml
workflow_dispatch:
permissions: {}
defaults:
run:
shell: bash
jobs:
build-wsl:
runs-on: ubuntu-24.04
timeout-minutes: 10
permissions:
packages: write # for GitHub Package Registry
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}/wsl
steps:
- name: Install mise
uses: jdx/mise-action@53d027c2e96fed8f955f5d95bff910a3e031cc58 # v2.1.6
with:
version: 2024.11.11
# cspell:ignore kellyjonbrazil
mise_toml: |
[tools]
"ubi:kellyjonbrazil/jc" = "latest"
- run: echo $PATH
- run: mise ls
- run: ls -ahl ~/.local/share/mise/shims
- run: jc --version
- name: Get latest Ubuntu version
id: version
run: |
today=$(date --utc --iso-8601)
read -r version series < <(
curl --fail-with-body --location https://debian.pages.debian.net/distro-info-data/ubuntu.csv \
| jc --csv \
| jq --arg today "${today}" -r '
[ .[]
| select(.version | contains("LTS"))
| select(.release <= $today)
| {series, version: (.version | sub(" LTS"; ""))}
]
| sort_by(.release)
| reverse
| .[0]
| "\(.version) \(.series)"
'
)
echo "version=${version}" >> "${GITHUB_OUTPUT}"
echo "series=${series}" >> "${GITHUB_OUTPUT}"
- name: Get Ubuntu WSL build info
id: build-info
run: |
serial=$(curl --fail-with-body --location https://cloud-images.ubuntu.com/wsl/${{ steps.version.outputs.series }}/current/unpacked/build-info.txt \
| grep --only-matching --perl-regexp 'SERIAL=\K\d+')
if [[ -z "${serial}" ]]; then
echo "Failed to get the serial" >&2
exit 1
fi
# + cannot be used in the tag, so use - instead
echo "tag=${{ steps.version.outputs.version }}-${serial}" >> "${GITHUB_OUTPUT}"
- name: Get latest Ubuntu WSL image tag
id: latest-tag
# %2F is the URL-encoded form of /
# get the tag of the latest image
# cspell:ignore fwsl
run: |
latest_tag=$(gh api --header "Accept: application/vnd.github+json" --header "X-GitHub-Api-Version: 2022-11-28" \
/user/packages/container/${{ github.event.repository.name }}%2Fwsl/versions \
--jq '.[] | select(.metadata.container.tags | contains(["latest"])) | .metadata.container.tags[] | select(. != "latest")')
echo "latest_tag=${latest_tag}" >> "${GITHUB_OUTPUT}"
env:
GITHUB_TOKEN: ${{ github.token }}
# 404 error for the first run
continue-on-error: true
# cspell:ignore rootfs
- name: Download Ubuntu WSL rootfs
id: rootfs
# skip if the latest image is already created
if: ${{ github.event_name == 'pull_request' || steps.build-info.outputs.tag != steps.latest-tag.outputs.latest_tag }}
run: |
curl --fail-with-body --location --output ubuntu.tar.gz \
https://cloud-images.ubuntu.com/wsl/${{ steps.version.outputs.series }}/current/ubuntu-${{ steps.version.outputs.series }}-wsl-amd64-ubuntu.rootfs.tar.gz
- name: Create Dockerfile
if: ${{ steps.rootfs.outcome != 'skipped' }}
run: |
cat <<EOF > Dockerfile
FROM scratch
ADD ubuntu.tar.gz /
EOF
- name: Login to GitHub Container Registry
if: ${{ steps.rootfs.outcome != 'skipped' }}
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ github.token }}
# cspell:ignore buildx
- name: Setup Buildx
if: ${{ steps.rootfs.outcome != 'skipped' }}
uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1
- name: Build and push Docker image
id: push
if: ${{ steps.rootfs.outcome != 'skipped' }}
uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
# avoid image without manifest created
# ref: https://github.com/docker/build-push-action/issues/900
provenance: false
tags: |
ghcr.io/${{ env.IMAGE_NAME }}:${{ steps.build-info.outputs.tag }}
ghcr.io/${{ env.IMAGE_NAME }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
actions-timeline:
needs:
- build-wsl
if: ${{ !cancelled() }}
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
actions: read # for actions-timeline
steps:
- name: actions-timeline
# cspell:ignore kesin
uses: Kesin11/actions-timeline@3046833d9aacfd7745c5264b7f3af851c3e2a619 # v2.2.1