mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 16:37:34 +00:00
fix(ci): harden publishing and validate examples
This commit is contained in:
@@ -6,46 +6,71 @@ on:
|
||||
- 'v*'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
release:
|
||||
build:
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check project rules
|
||||
run: python3 check_project_rules.py
|
||||
- name: Install locked Node dependencies
|
||||
env:
|
||||
PUPPETEER_SKIP_DOWNLOAD: "true"
|
||||
run: npm ci
|
||||
|
||||
- name: Check release metadata
|
||||
run: npm test
|
||||
- name: Check project rules and metadata
|
||||
run: |
|
||||
python3 check_project_rules.py
|
||||
npm test
|
||||
|
||||
- name: Install Chromium and CJK fonts
|
||||
- name: Install Chromium, CJK fonts, and PDF inspection tools
|
||||
id: setupchrome
|
||||
uses: browser-actions/setup-chrome@v2
|
||||
uses: browser-actions/setup-chrome@2e1d749697dd1612b833dba4a722266286fbefcd # v2.1.2
|
||||
with:
|
||||
chrome-version: stable
|
||||
- name: Install CJK fonts
|
||||
|
||||
- name: Install CJK fonts and PDF inspection tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra
|
||||
sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra poppler-utils
|
||||
|
||||
- name: Install mdpress 0.7.10
|
||||
- name: Install mdPress 0.7.10
|
||||
env:
|
||||
MDPRESS_VERSION: "0.7.10"
|
||||
MDPRESS_SHA256: "17e53e455996940bbbce64c69c43b3fb543f1501e03b74cf0434074efebd2db4"
|
||||
run: |
|
||||
archive="/tmp/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz"
|
||||
echo "Installing mdpress ${MDPRESS_VERSION}"
|
||||
curl -fsSL "https://github.com/yeasy/mdPress/releases/download/v${MDPRESS_VERSION}/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz" -o "$archive"
|
||||
archive="$RUNNER_TEMP/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz"
|
||||
curl -fsSL --retry 3 \
|
||||
"https://github.com/yeasy/mdPress/releases/download/v${MDPRESS_VERSION}/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz" \
|
||||
-o "$archive"
|
||||
echo "${MDPRESS_SHA256} $archive" | sha256sum -c -
|
||||
tar xzf "$archive" -C /tmp mdpress
|
||||
sudo mv /tmp/mdpress /usr/local/bin/
|
||||
mdpress --version
|
||||
tar xzf "$archive" -C "$RUNNER_TEMP" mdpress
|
||||
mkdir -p "$RUNNER_TEMP/bin"
|
||||
install -m 0755 "$RUNNER_TEMP/mdpress" "$RUNNER_TEMP/bin/mdpress"
|
||||
echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Extract tag name
|
||||
- name: Install Pandoc 3.5
|
||||
env:
|
||||
PANDOC_VERSION: "3.5"
|
||||
PANDOC_SHA256: "4f41d817d262ef3d17953a3e6e0fefddb971aa4f2f121544a9a86db449d945e1"
|
||||
run: |
|
||||
package="$RUNNER_TEMP/pandoc-${PANDOC_VERSION}-1-amd64.deb"
|
||||
curl -fsSL --retry 3 \
|
||||
"https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-1-amd64.deb" \
|
||||
-o "$package"
|
||||
echo "${PANDOC_SHA256} $package" | sha256sum -c -
|
||||
sudo dpkg -i "$package"
|
||||
pandoc --version | head -1
|
||||
|
||||
- name: Extract safe tag name
|
||||
id: tag
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ "$GITHUB_REF" == refs/tags/* ]]; then
|
||||
tag_name="${GITHUB_REF#refs/tags/}"
|
||||
@@ -61,49 +86,69 @@ jobs:
|
||||
run: python3 tools/prepare_pdf_sources.py --book-dir . --out "$RUNNER_TEMP/docker_practice-pdf-src"
|
||||
|
||||
- name: Build PDF
|
||||
env:
|
||||
SAFE_TAG_NAME: ${{ steps.tag.outputs.SAFE_TAG_NAME }}
|
||||
working-directory: ${{ runner.temp }}/docker_practice-pdf-src
|
||||
run: mdpress build --format pdf --output "${GITHUB_WORKSPACE}/docker_practice-${{ steps.tag.outputs.SAFE_TAG_NAME || 'latest' }}.pdf"
|
||||
|
||||
- name: Create Release with PDF
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: softprops/action-gh-release@v3
|
||||
with:
|
||||
generate_release_notes: true
|
||||
files: docker_practice-${{ steps.tag.outputs.SAFE_TAG_NAME }}.pdf
|
||||
|
||||
- name: Upload PDF as artifact
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: docker_practice-pdf
|
||||
path: "docker_practice-*.pdf"
|
||||
run: |
|
||||
mkdir -p "$GITHUB_WORKSPACE/dist"
|
||||
mdpress build --format pdf \
|
||||
--output "$GITHUB_WORKSPACE/dist/docker_practice-${SAFE_TAG_NAME}.pdf"
|
||||
|
||||
- name: Build HTML reader
|
||||
id: htmlreader
|
||||
continue-on-error: true
|
||||
env:
|
||||
CHROME_BIN: ${{ steps.setupchrome.outputs.chrome-path }}
|
||||
SAFE_TAG_NAME: ${{ steps.tag.outputs.SAFE_TAG_NAME }}
|
||||
run: |
|
||||
# recent pandoc (apt's is too old for --embed-resources); + mermaid-cli using system Chrome
|
||||
curl -fsSL https://github.com/jgm/pandoc/releases/download/3.5/pandoc-3.5-1-amd64.deb -o /tmp/pandoc.deb
|
||||
sudo dpkg -i /tmp/pandoc.deb && pandoc --version | head -1
|
||||
PUPPETEER_SKIP_DOWNLOAD=true npm install -g @mermaid-js/mermaid-cli@10
|
||||
TITLE=$(python3 -c "import json,os;print((json.load(open('book.json')).get('title') if os.path.exists('book.json') else '') or '${{ github.event.repository.name }}')")
|
||||
TAG="${{ steps.tag.outputs.SAFE_TAG_NAME || 'latest' }}"
|
||||
python3 tools/render_mermaid.py --book-dir . --svg-out /tmp/mmsvg
|
||||
python3 tools/build_html_reader.py --book-dir . --title "$TITLE" --svg-dir /tmp/mmsvg \
|
||||
--out "${{ github.event.repository.name }}-${TAG}.html"
|
||||
ls -lh ${{ github.event.repository.name }}-${TAG}.html
|
||||
title=$(python3 -c 'import json; print(json.load(open("book.json", encoding="utf-8"))["title"])')
|
||||
PATH="$GITHUB_WORKSPACE/node_modules/.bin:$PATH" \
|
||||
python3 tools/render_mermaid.py --book-dir . --svg-out "$RUNNER_TEMP/mmsvg"
|
||||
python3 tools/build_html_reader.py \
|
||||
--book-dir . \
|
||||
--title "$title" \
|
||||
--svg-dir "$RUNNER_TEMP/mmsvg" \
|
||||
--out "dist/docker_practice-${SAFE_TAG_NAME}.html"
|
||||
|
||||
- name: Attach HTML to release
|
||||
if: steps.htmlreader.outcome == 'success' && startsWith(github.ref, 'refs/tags/')
|
||||
uses: softprops/action-gh-release@v3
|
||||
with:
|
||||
tag_name: ${{ steps.tag.outputs.TAG_NAME }}
|
||||
files: "${{ github.event.repository.name }}-${{ steps.tag.outputs.SAFE_TAG_NAME }}.html"
|
||||
- name: Verify release artifacts
|
||||
env:
|
||||
SAFE_TAG_NAME: ${{ steps.tag.outputs.SAFE_TAG_NAME }}
|
||||
run: |
|
||||
title=$(python3 -c 'import json; print(json.load(open("book.json", encoding="utf-8"))["title"])')
|
||||
python3 tools/verify_artifacts.py \
|
||||
--title "$title" \
|
||||
--pdf "dist/docker_practice-${SAFE_TAG_NAME}.pdf" \
|
||||
--html "dist/docker_practice-${SAFE_TAG_NAME}.html" \
|
||||
--checksums dist/SHA256SUMS
|
||||
(cd dist && sha256sum -c SHA256SUMS)
|
||||
|
||||
- name: Upload HTML as artifact
|
||||
if: steps.htmlreader.outcome == 'success'
|
||||
uses: actions/upload-artifact@v7
|
||||
- name: Upload verified release bundle
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: html-edition
|
||||
path: "${{ github.event.repository.name }}-*.html"
|
||||
name: docker-practice-release-bundle
|
||||
path: dist/
|
||||
if-no-files-found: error
|
||||
|
||||
release:
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
permissions:
|
||||
contents: write
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download verified release bundle
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: docker-practice-release-bundle
|
||||
path: dist
|
||||
|
||||
- name: Recheck artifact checksums
|
||||
run: (cd dist && sha256sum -c SHA256SUMS)
|
||||
|
||||
- name: Create GitHub release
|
||||
uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
|
||||
with:
|
||||
generate_release_notes: true
|
||||
fail_on_unmatched_files: true
|
||||
files: |
|
||||
dist/docker_practice-*.pdf
|
||||
dist/docker_practice-*.html
|
||||
dist/SHA256SUMS
|
||||
|
||||
@@ -3,63 +3,69 @@ name: Check link
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check-link:
|
||||
name: check-link
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
# search Issues :-(
|
||||
- run: |
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check Markdown links
|
||||
run: |
|
||||
docker run -i --rm \
|
||||
-v $PWD:/mnt:ro \
|
||||
dkhamsing/awesome_bot \
|
||||
--white-list "localhost","0.0.0.0",\
|
||||
"server","example.com","docker",\
|
||||
"docker.domain.com","YourIP","register",\
|
||||
"172.16.238.100","172.16.238.101","172.16.238.102",\
|
||||
"192.168.199.100",\
|
||||
"github.com/settings",\
|
||||
"github.com/docker/compose/releases/download",\
|
||||
"github.com/etcd-io/etcd/releases/download",\
|
||||
"github.com/tianon/gosu/releases/download",\
|
||||
"github.com/yeasy/docker_practice",\
|
||||
"github.com/AliyunContainerService/k8s-for-docker-desktop/raw",\
|
||||
"dl-cdn.alpinelinux.org/alpine/edge/testing",\
|
||||
"www.w3.org/1999/xhtml",\
|
||||
"cr.console.aliyun.com",\
|
||||
"cloud.tencent.com",\
|
||||
"nodejs.org/dist/",\
|
||||
"c.163.com/hub",\
|
||||
"drone.yeasy.com",\
|
||||
"docs.docker.com",\
|
||||
"dockerhub.azk8s.cn",\
|
||||
"reg-mirror.qiniu.com",\
|
||||
"registry.docker-cn.com",\
|
||||
"mirror.ccs.tencentyun.com",\
|
||||
"vuepress.mirror.docker-practice.com",\
|
||||
"mc.qcloudimg.com/static/img",\
|
||||
"www.daocloud.io/mirror",\
|
||||
"download.docker.com",\
|
||||
"www.ubuntu.com",\
|
||||
"archive.ubuntu.com",\
|
||||
"security.ubuntu.com/ubuntu",\
|
||||
"nginx.com",\
|
||||
"img.shields.io/github/release/yeasy/docker_practice",\
|
||||
"launchpad.net",\
|
||||
"www.w3.org/1999",\
|
||||
"chat.freenode.net",\
|
||||
"en.wikipedia.org/wiki/UnionFS",\
|
||||
"product.china-pub.com",\
|
||||
"union-click.jd.com",\
|
||||
"x.x.x.x/base",\
|
||||
"x.x.x.x:9090",\
|
||||
"yeasy.gitbooks.io",\
|
||||
"download.fastgit.org",\
|
||||
"www.aliyun.com" \
|
||||
--allow-dupe \
|
||||
--skip-save-results \
|
||||
-t 10 \
|
||||
`find . \( -path "./mesos" -o -path "./swarm_mode" \) -prune -o -name "*.md" -exec ls {} \;`
|
||||
name: check-link
|
||||
-v "$GITHUB_WORKSPACE:/mnt:ro" \
|
||||
-w /mnt \
|
||||
dkhamsing/awesome_bot@sha256:a8adaeb3b3bd5745304743e4d8a6d512127646e420544a6d22d9f58a07f35884 \
|
||||
--white-list "localhost","0.0.0.0",\
|
||||
"server","example.com","docker",\
|
||||
"docker.domain.com","YourIP","register",\
|
||||
"172.16.238.100","172.16.238.101","172.16.238.102",\
|
||||
"192.168.199.100",\
|
||||
"github.com/settings",\
|
||||
"github.com/docker/compose/releases/download",\
|
||||
"github.com/etcd-io/etcd/releases/download",\
|
||||
"github.com/tianon/gosu/releases/download",\
|
||||
"github.com/yeasy/docker_practice",\
|
||||
"github.com/AliyunContainerService/k8s-for-docker-desktop/raw",\
|
||||
"dl-cdn.alpinelinux.org/alpine/edge/testing",\
|
||||
"www.w3.org/1999/xhtml",\
|
||||
"cr.console.aliyun.com",\
|
||||
"cloud.tencent.com",\
|
||||
"nodejs.org/dist/",\
|
||||
"c.163.com/hub",\
|
||||
"drone.yeasy.com",\
|
||||
"docs.docker.com",\
|
||||
"dockerhub.azk8s.cn",\
|
||||
"reg-mirror.qiniu.com",\
|
||||
"registry.docker-cn.com",\
|
||||
"mirror.ccs.tencentyun.com",\
|
||||
"vuepress.mirror.docker-practice.com",\
|
||||
"mc.qcloudimg.com/static/img",\
|
||||
"www.daocloud.io/mirror",\
|
||||
"download.docker.com",\
|
||||
"www.ubuntu.com",\
|
||||
"archive.ubuntu.com",\
|
||||
"security.ubuntu.com/ubuntu",\
|
||||
"nginx.com",\
|
||||
"img.shields.io/github/release/yeasy/docker_practice",\
|
||||
"launchpad.net",\
|
||||
"www.w3.org/1999",\
|
||||
"chat.freenode.net",\
|
||||
"en.wikipedia.org/wiki/UnionFS",\
|
||||
"product.china-pub.com",\
|
||||
"union-click.jd.com",\
|
||||
"x.x.x.x/base",\
|
||||
"x.x.x.x:9090",\
|
||||
"yeasy.gitbooks.io",\
|
||||
"download.fastgit.org",\
|
||||
"www.aliyun.com" \
|
||||
--allow-dupe \
|
||||
--skip-save-results \
|
||||
-t 10 \
|
||||
$(find . \( -path "./mesos" -o -path "./swarm_mode" \) -prune -o -name "*.md" -print)
|
||||
timeout-minutes: 25
|
||||
|
||||
+80
-23
@@ -7,48 +7,105 @@ on:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- name: Check project rules
|
||||
run: python3 check_project_rules.py
|
||||
- name: Check release metadata
|
||||
run: npm test
|
||||
- name: Install Chromium and CJK fonts
|
||||
uses: browser-actions/setup-chrome@v2
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install locked Node dependencies
|
||||
env:
|
||||
PUPPETEER_SKIP_DOWNLOAD: "true"
|
||||
run: npm ci
|
||||
|
||||
- name: Install canonical-example validators
|
||||
env:
|
||||
KUBECONFORM_VERSION: "0.8.0"
|
||||
KUBECONFORM_SHA256: "9bc2bffbf71f261128533edaf912153948b7ff238f9a531ae6d34466ec287883"
|
||||
ACTIONLINT_VERSION: "1.7.12"
|
||||
ACTIONLINT_SHA256: "8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8"
|
||||
run: |
|
||||
mkdir -p "$RUNNER_TEMP/bin"
|
||||
kube_archive="$RUNNER_TEMP/kubeconform.tar.gz"
|
||||
curl -fsSL --retry 3 \
|
||||
"https://github.com/yannh/kubeconform/releases/download/v${KUBECONFORM_VERSION}/kubeconform-linux-amd64.tar.gz" \
|
||||
-o "$kube_archive"
|
||||
echo "${KUBECONFORM_SHA256} $kube_archive" | sha256sum -c -
|
||||
tar xzf "$kube_archive" -C "$RUNNER_TEMP/bin" kubeconform
|
||||
|
||||
actionlint_archive="$RUNNER_TEMP/actionlint.tar.gz"
|
||||
curl -fsSL --retry 3 \
|
||||
"https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz" \
|
||||
-o "$actionlint_archive"
|
||||
echo "${ACTIONLINT_SHA256} $actionlint_archive" | sha256sum -c -
|
||||
tar xzf "$actionlint_archive" -C "$RUNNER_TEMP/bin" actionlint
|
||||
echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Check project rules, metadata, and canonical examples
|
||||
run: |
|
||||
python3 check_project_rules.py
|
||||
npm test
|
||||
python3 tools/test_examples.py --require-tools
|
||||
|
||||
- name: Install Chromium
|
||||
uses: browser-actions/setup-chrome@2e1d749697dd1612b833dba4a722266286fbefcd # v2.1.2
|
||||
with:
|
||||
chrome-version: stable
|
||||
- name: Install CJK fonts
|
||||
|
||||
- name: Install CJK fonts and PDF inspection tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra
|
||||
- name: Install mdpress 0.7.10
|
||||
sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra poppler-utils
|
||||
|
||||
- name: Install mdPress 0.7.10
|
||||
env:
|
||||
MDPRESS_VERSION: "0.7.10"
|
||||
MDPRESS_SHA256: "17e53e455996940bbbce64c69c43b3fb543f1501e03b74cf0434074efebd2db4"
|
||||
run: |
|
||||
archive="/tmp/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz"
|
||||
echo "Installing mdpress ${MDPRESS_VERSION}"
|
||||
curl -fsSL "https://github.com/yeasy/mdPress/releases/download/v${MDPRESS_VERSION}/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz" -o "$archive"
|
||||
archive="$RUNNER_TEMP/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz"
|
||||
curl -fsSL --retry 3 \
|
||||
"https://github.com/yeasy/mdPress/releases/download/v${MDPRESS_VERSION}/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz" \
|
||||
-o "$archive"
|
||||
echo "${MDPRESS_SHA256} $archive" | sha256sum -c -
|
||||
tar xzf "$archive"
|
||||
sudo mv mdpress /usr/local/bin/
|
||||
mdpress --version
|
||||
tar xzf "$archive" -C "$RUNNER_TEMP" mdpress
|
||||
mkdir -p "$RUNNER_TEMP/bin"
|
||||
install -m 0755 "$RUNNER_TEMP/mdpress" "$RUNNER_TEMP/bin/mdpress"
|
||||
echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Prepare PDF sources
|
||||
run: python3 tools/prepare_pdf_sources.py --book-dir . --out "$RUNNER_TEMP/docker_practice-pdf-src"
|
||||
|
||||
- name: Build PDF
|
||||
working-directory: ${{ runner.temp }}/docker_practice-pdf-src
|
||||
run: mdpress build --format pdf --output "$GITHUB_WORKSPACE/docker_practice.pdf"
|
||||
run: |
|
||||
mkdir -p "$GITHUB_WORKSPACE/dist"
|
||||
mdpress build --format pdf --output "$GITHUB_WORKSPACE/dist/docker_practice.pdf"
|
||||
|
||||
- name: Build site
|
||||
run: npm run build
|
||||
- name: Upload PDF as artifact
|
||||
uses: actions/upload-artifact@v7
|
||||
|
||||
- name: Verify build artifacts
|
||||
run: |
|
||||
title=$(python3 -c 'import json; print(json.load(open("book.json", encoding="utf-8"))["title"])')
|
||||
python3 tools/verify_artifacts.py \
|
||||
--title "$title" \
|
||||
--pdf dist/docker_practice.pdf \
|
||||
--site _site \
|
||||
--checksums dist/SHA256SUMS
|
||||
(cd dist && sha256sum -c SHA256SUMS)
|
||||
|
||||
- name: Upload verified PDF
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: docker_practice-pdf
|
||||
path: docker_practice.pdf
|
||||
path: |
|
||||
dist/docker_practice.pdf
|
||||
dist/SHA256SUMS
|
||||
if-no-files-found: error
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
name: Dependabot auto-merge
|
||||
on: pull_request
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
checks: read
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
dependabot:
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
checks: read
|
||||
runs-on: ubuntu-latest
|
||||
if: github.actor == 'dependabot[bot]'
|
||||
steps:
|
||||
- name: Dependabot metadata
|
||||
id: metadata
|
||||
uses: dependabot/fetch-metadata@25dd0e34f4fe68f24cc83900b1fe3fe149efef98 # v3
|
||||
uses: dependabot/fetch-metadata@25dd0e34f4fe68f24cc83900b1fe3fe149efef98 # v3.1.0
|
||||
with:
|
||||
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
name: Pages
|
||||
|
||||
# One-time repository setup remains manual: Settings > Pages > Source -> GitHub Actions.
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: {}
|
||||
|
||||
concurrency:
|
||||
group: pages
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
permissions:
|
||||
contents: read
|
||||
pages: read
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install locked Node dependencies
|
||||
env:
|
||||
PUPPETEER_SKIP_DOWNLOAD: "true"
|
||||
run: npm ci
|
||||
|
||||
- name: Check project rules and metadata
|
||||
run: |
|
||||
python3 check_project_rules.py
|
||||
npm test
|
||||
|
||||
- name: Install mdPress 0.7.10
|
||||
env:
|
||||
MDPRESS_VERSION: "0.7.10"
|
||||
MDPRESS_SHA256: "17e53e455996940bbbce64c69c43b3fb543f1501e03b74cf0434074efebd2db4"
|
||||
run: |
|
||||
archive="$RUNNER_TEMP/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz"
|
||||
curl -fsSL --retry 3 \
|
||||
"https://github.com/yeasy/mdPress/releases/download/v${MDPRESS_VERSION}/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz" \
|
||||
-o "$archive"
|
||||
echo "${MDPRESS_SHA256} $archive" | sha256sum -c -
|
||||
tar xzf "$archive" -C "$RUNNER_TEMP" mdpress
|
||||
mkdir -p "$RUNNER_TEMP/bin"
|
||||
install -m 0755 "$RUNNER_TEMP/mdpress" "$RUNNER_TEMP/bin/mdpress"
|
||||
echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Build mdPress site
|
||||
run: npm run build
|
||||
|
||||
- name: Verify site output
|
||||
run: test -s _site/index.html
|
||||
|
||||
- name: Configure Pages
|
||||
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
|
||||
|
||||
- name: Upload Pages artifact
|
||||
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
|
||||
with:
|
||||
path: _site
|
||||
|
||||
deploy:
|
||||
needs: build
|
||||
permissions:
|
||||
pages: write
|
||||
id-token: write
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Deploy Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
|
||||
@@ -6,49 +6,57 @@ on:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
permissions: {}
|
||||
|
||||
concurrency:
|
||||
group: preview-pdf
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
update-preview-pdf:
|
||||
name: Update preview release
|
||||
build:
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check project rules
|
||||
run: python3 check_project_rules.py
|
||||
- name: Install locked Node dependencies
|
||||
env:
|
||||
PUPPETEER_SKIP_DOWNLOAD: "true"
|
||||
run: npm ci
|
||||
|
||||
- name: Check release metadata
|
||||
run: npm test
|
||||
- name: Check project rules and metadata
|
||||
run: |
|
||||
python3 check_project_rules.py
|
||||
npm test
|
||||
|
||||
- name: Install Chromium and CJK fonts
|
||||
uses: browser-actions/setup-chrome@v2
|
||||
- name: Install Chromium
|
||||
uses: browser-actions/setup-chrome@2e1d749697dd1612b833dba4a722266286fbefcd # v2.1.2
|
||||
with:
|
||||
chrome-version: stable
|
||||
- name: Install CJK fonts
|
||||
|
||||
- name: Install CJK fonts and PDF inspection tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra
|
||||
sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra poppler-utils
|
||||
|
||||
- name: Install mdpress 0.7.10
|
||||
- name: Install mdPress 0.7.10
|
||||
env:
|
||||
MDPRESS_VERSION: "0.7.10"
|
||||
MDPRESS_SHA256: "17e53e455996940bbbce64c69c43b3fb543f1501e03b74cf0434074efebd2db4"
|
||||
run: |
|
||||
archive="/tmp/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz"
|
||||
echo "Installing mdpress ${MDPRESS_VERSION}"
|
||||
curl -fsSL "https://github.com/yeasy/mdPress/releases/download/v${MDPRESS_VERSION}/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz" -o "$archive"
|
||||
archive="$RUNNER_TEMP/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz"
|
||||
curl -fsSL --retry 3 \
|
||||
"https://github.com/yeasy/mdPress/releases/download/v${MDPRESS_VERSION}/mdpress_${MDPRESS_VERSION}_linux_amd64.tar.gz" \
|
||||
-o "$archive"
|
||||
echo "${MDPRESS_SHA256} $archive" | sha256sum -c -
|
||||
tar xzf "$archive" -C /tmp mdpress
|
||||
sudo mv /tmp/mdpress /usr/local/bin/
|
||||
mdpress --version
|
||||
tar xzf "$archive" -C "$RUNNER_TEMP" mdpress
|
||||
mkdir -p "$RUNNER_TEMP/bin"
|
||||
install -m 0755 "$RUNNER_TEMP/mdpress" "$RUNNER_TEMP/bin/mdpress"
|
||||
echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Prepare PDF sources
|
||||
run: python3 tools/prepare_pdf_sources.py --book-dir . --out "$RUNNER_TEMP/docker_practice-pdf-src"
|
||||
@@ -59,6 +67,39 @@ jobs:
|
||||
mkdir -p "$GITHUB_WORKSPACE/dist"
|
||||
mdpress build --format pdf --output "$GITHUB_WORKSPACE/dist/docker_practice.pdf"
|
||||
|
||||
- name: Verify preview PDF
|
||||
run: |
|
||||
title=$(python3 -c 'import json; print(json.load(open("book.json", encoding="utf-8"))["title"])')
|
||||
python3 tools/verify_artifacts.py \
|
||||
--title "$title" \
|
||||
--pdf dist/docker_practice.pdf \
|
||||
--checksums dist/SHA256SUMS
|
||||
(cd dist && sha256sum -c SHA256SUMS)
|
||||
|
||||
- name: Upload verified preview bundle
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: docker-practice-preview
|
||||
path: dist/
|
||||
if-no-files-found: error
|
||||
|
||||
publish:
|
||||
permissions:
|
||||
contents: write
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
steps:
|
||||
- name: Download verified preview bundle
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: docker-practice-preview
|
||||
path: dist
|
||||
|
||||
- name: Recheck preview checksum
|
||||
run: (cd dist && sha256sum -c SHA256SUMS)
|
||||
|
||||
- name: Write release notes
|
||||
run: |
|
||||
cat > dist/release-notes.md <<EOF
|
||||
@@ -69,7 +110,7 @@ jobs:
|
||||
- Run: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}
|
||||
EOF
|
||||
|
||||
- name: Create preview release
|
||||
- name: Create preview release when absent
|
||||
run: |
|
||||
gh release view preview-pdf >/dev/null 2>&1 || \
|
||||
gh release create preview-pdf \
|
||||
@@ -87,8 +128,10 @@ jobs:
|
||||
--prerelease \
|
||||
--target "$GITHUB_SHA"
|
||||
|
||||
- name: Remove legacy preview asset
|
||||
run: gh release delete-asset preview-pdf latest.pdf -y || true
|
||||
|
||||
- name: Upload preview PDF
|
||||
run: gh release upload preview-pdf dist/docker_practice.pdf --clobber
|
||||
- name: Replace preview assets
|
||||
run: |
|
||||
gh release delete-asset preview-pdf latest.pdf -y || true
|
||||
gh release upload preview-pdf \
|
||||
dist/docker_practice.pdf \
|
||||
dist/SHA256SUMS \
|
||||
--clobber
|
||||
|
||||
Reference in New Issue
Block a user