mirror of
https://github.com/GXDE-OS/GXDE.git
synced 2026-11-06 03:01:09 +08:00
add: Build Archlinux
This commit is contained in:
@@ -29,4 +29,8 @@ jobs:
|
||||
call-hetao:
|
||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao.yml@master
|
||||
secrets: inherit
|
||||
|
||||
call-arch:
|
||||
uses: GXDE-OS/GXDE/.github/workflows/building-pkg.yml@master
|
||||
secrets: inherit
|
||||
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation, either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# -----------------------------------------------------------------------------
|
||||
# 本工作流用于构建Archlinux软件包,仅接受根目录的PKGBUILD或arch/PKGBUILD,没有时跳过。
|
||||
# This workflow is used to build Arch Linux packages, it only accepts PKGBUILD
|
||||
# in the root directory of the repo or arch/PKGBUILD, otherwise this will be
|
||||
# skipped.
|
||||
|
||||
name: Building GXDE Arch Package
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
secrets:
|
||||
PASSWD:
|
||||
required: true
|
||||
USERS:
|
||||
required: true
|
||||
HOST:
|
||||
required: true
|
||||
UPATH:
|
||||
required: true
|
||||
UPORT:
|
||||
required: true
|
||||
UPROGRAM_ARCH:
|
||||
required: false
|
||||
|
||||
env:
|
||||
REPOSITORY: https://github.com/GXDE-OS/GXDE
|
||||
BOTTLEPATH: system-bottle
|
||||
GXDE_ARCH_REPO: https://repo1.gxde.top/gxde-arch
|
||||
|
||||
jobs:
|
||||
detect:
|
||||
if: github.repository_owner == 'GXDE-OS'
|
||||
runs-on: ubuntu-24.04
|
||||
outputs:
|
||||
pkgbuild-dir: ${{ steps.find.outputs.dir }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Find PKGBUILD
|
||||
id: find
|
||||
run: |
|
||||
if [[ -f arch/PKGBUILD ]]; then
|
||||
echo "dir=arch" >> $GITHUB_OUTPUT
|
||||
elif [[ -f PKGBUILD ]]; then
|
||||
echo "dir=." >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "No PKGBUILD found, skip Arch build"
|
||||
fi
|
||||
|
||||
build:
|
||||
needs: detect
|
||||
if: needs.detect.outputs.pkgbuild-dir != ''
|
||||
name: ${{ matrix.arch }}-arch
|
||||
runs-on: ${{ matrix.runner }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- arch: x86_64
|
||||
runner: ubuntu-24.04
|
||||
- arch: aarch64
|
||||
runner: ubuntu-24.04-arm
|
||||
steps:
|
||||
- name: Clone Repository To Get Script
|
||||
run: |
|
||||
git clone $REPOSITORY --depth=1
|
||||
mv $(basename $REPOSITORY)/* . -v
|
||||
mv $(basename $REPOSITORY)/.* . -v | true
|
||||
|
||||
- name: Configure Base System
|
||||
run: |
|
||||
bash .github/workflows/configure-building-enviroment-arch.sh ${{ matrix.arch }} \
|
||||
$REPOSITORY \
|
||||
https://github.com/$GITHUB_REPOSITORY \
|
||||
${{ github.ref_name }} \
|
||||
$GXDE_ARCH_REPO
|
||||
|
||||
- name: Building ${{ GITHUB.repository }}
|
||||
run: |
|
||||
gitPath=/home/builder/$(basename $GITHUB_REPOSITORY)/${{ needs.detect.outputs.pkgbuild-dir }}
|
||||
sudo chroot $BOTTLEPATH sudo -H -u builder bash -c \
|
||||
"cd $gitPath && makepkg -s --noconfirm --needed"
|
||||
mkdir -p packages
|
||||
sudo find $BOTTLEPATH$gitPath -maxdepth 1 -name '*.pkg.tar.*' ! -name '*.sig' -exec cp -v {} packages/ \;
|
||||
sudo chown -R $(id -u):$(id -g) packages
|
||||
ls -l packages
|
||||
|
||||
- name: Remove Debug Package
|
||||
run: |
|
||||
rm -fv packages/*-debug-*.pkg.tar.*
|
||||
|
||||
- name: Pack tar
|
||||
run: |
|
||||
cd packages
|
||||
tar -cvf ../arch-${{ matrix.arch }}-$(date +%s).tar *.pkg.tar.*
|
||||
|
||||
- name: Push
|
||||
env:
|
||||
UPASSWD: ${{ secrets.PASSWD }}
|
||||
UUSERS: ${{ secrets.USERS }}
|
||||
UHOST: ${{ secrets.HOST }}
|
||||
UPATH: ${{ secrets.UPATH }}
|
||||
UPROGRAM_ARCH: ${{ secrets.UPROGRAM_ARCH }}
|
||||
UPORT: ${{ secrets.UPORT }}
|
||||
run: |
|
||||
if [[ -z "$UPROGRAM_ARCH" ]]; then
|
||||
echo "::warning::UPROGRAM_ARCH is not set, skip uploading Arch packages"
|
||||
exit 0
|
||||
fi
|
||||
sudo apt update
|
||||
sudo apt install sshpass -y
|
||||
mkdir -p ~/.ssh/
|
||||
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
|
||||
tarName=$(ls | grep '^arch-.*\.tar$' | head -n 1)
|
||||
sshpass -p "$UPASSWD" rsync -e "ssh -p $UPORT" $tarName $UUSERS@$UHOST:$UPATH
|
||||
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -p $UPORT $UPROGRAM_ARCH ${{ matrix.arch }} $UPATH/$tarName > /dev/null
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOCKEN_GITHUB }}
|
||||
with:
|
||||
files: |
|
||||
packages/*.pkg.tar.*
|
||||
@@ -0,0 +1,140 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation, either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# -----------------------------------------------------------------------------
|
||||
# 本脚本用于构建GXDE Arch打包环境
|
||||
# 参数$1 = 架构,可选x86_64/aarch64
|
||||
# 参数$2 = GXDE仓库地址
|
||||
# 参数$3 = 源码包仓库地址
|
||||
# 参数$4 = 当前欲构建的分支
|
||||
# 参数$5 = GXDE Arch源地址,用于获取GXDE依赖
|
||||
# -----------------------------------------------------------------------------
|
||||
# This script is used to configure the packaging environment of GXDE on Arch.
|
||||
# $1 = Archtecture required, either x86_64 or aarch64.
|
||||
# $2 = GXDE repository address.
|
||||
# $3 = Repository path of the software to be built.
|
||||
# $4 = The branch that you want to build.
|
||||
# $5 = The Arch PACMAN source of GXDE, we'll use it to install dependencies.
|
||||
|
||||
set -e
|
||||
build_arch=$1
|
||||
bottle_path=./system-bottle
|
||||
gxde_arch_repo=${5:-https://repo1.gxde.top/gxde-arch}
|
||||
|
||||
# 引用/Works Cited: https://patorjk.com/software/taag/#p=display&f=Linguaholic+Shadow+3D
|
||||
echo ' ██████╗██╗ ██╗██████╗ ████████╗ ████╗ '
|
||||
echo '██╔═════╝╚═██╗ ██╔═╝██╔═══██╗██╔═════╝ ██╔═══╝ ████╗ ██╗ ████╗ '
|
||||
echo '██║ ████╗ ╚═██╔═╝ ██║ ██║██████╗ ██████╗ ██╔═══██╗████╔═══╝ '
|
||||
echo '██║ ╚═██║ ██╔═██╗ ██║ ██║██╔═══╝ ╚═██╔═╝ ██║ ██║██╔═╝ '
|
||||
echo '╚═██████║██╔═╝ ╚═██╗██████╔═╝████████╗ ██║ ╚═████╔═╝██║ '
|
||||
echo ' ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═══════╝ ╚═╝ ╚═══╝ ╚═╝ '
|
||||
echo ' '
|
||||
echo ' '
|
||||
echo ' ████╗ ██╗ ██╗ ██╗ '
|
||||
echo '██╔═══██╗██╗ ████╗ ██████╗██████╗ ██║ ╚═╝██████╗ ██╗ ██╗██╗ ██╗'
|
||||
echo '████████║████╔═══╝██╔═════╝██╔═══██╗██║ ██╗██╔═══██╗██║ ██║╚═████╔═╝'
|
||||
echo '██╔═══██║██╔═╝ ██║ ██║ ██║██║ ██║██║ ██║██║ ██║ ████║ '
|
||||
echo '██║ ██║██║ ╚═██████╗██║ ██║████████╗██║██║ ██║╚═██████║██╔═══██╗'
|
||||
echo '╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝╚═══════╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝'
|
||||
|
||||
# 先安装解压chroot用的依赖 ・ Install the dependencies for extracting chroot first.
|
||||
sudo apt update
|
||||
sudo apt install wget zstd git -y
|
||||
|
||||
# 根据架构下载解压对应chroot ・ Download & extract corresponding chroot by archtecture needed.
|
||||
echo '[I] (Chroot) Init: Starting to download chroot for Archlinux...'
|
||||
if [[ $build_arch == "x86_64" ]]; then
|
||||
echo '[I] (Chroot) Init: Archtecture hit >> AMD64.'
|
||||
wget -q https://geo.mirror.pkgbuild.com/iso/latest/archlinux-bootstrap-x86_64.tar.zst
|
||||
sudo tar --zstd -xpf archlinux-bootstrap-x86_64.tar.zst --numeric-owner
|
||||
sudo mv root.x86_64 $bottle_path
|
||||
echo 'Server = https://geo.mirror.pkgbuild.com/$repo/os/$build_arch' | sudo tee $bottle_path/etc/pacman.d/mirrorlist
|
||||
keyring=archlinux
|
||||
elif [[ $build_arch == "aarch64" ]]; then
|
||||
echo '[I] (Chroot) Init: Archtecture hit >> AARCH64.'
|
||||
wget -q http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
|
||||
sudo mkdir -p $bottle_path
|
||||
sudo tar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C $bottle_path --numeric-owner
|
||||
keyring=archlinuxarm
|
||||
else
|
||||
echo '[E] (Chroot) Init: Unsupportted archtecture $arch, HALTED!'
|
||||
exit 1
|
||||
fi
|
||||
echo '[I] (Chroot) Init: Done downloading chroot for Archlinux.'
|
||||
|
||||
# 挂载chroot ・ Mount chroot.
|
||||
echo '[I] (Chroot) Mount: Starting to mount target chroot...'
|
||||
sudo mount --bind $bottle_path $bottle_path
|
||||
for i in proc sys dev dev/pts; do
|
||||
sudo mount --bind /$i $bottle_path/$i
|
||||
done
|
||||
sudo cp -L /etc/resolv.conf $bottle_path/etc/resolv.conf
|
||||
echo '[I] (Chroot) Mount: Done mounting the chroot!'
|
||||
|
||||
# Pacman在chroot里无法做沙箱/空间检查
|
||||
# Pacman is not able to do space check or sandbox in chroot.
|
||||
echo '[I] (Chroot) PostInit: Disabling sanbox and space check since we are in chroot...'
|
||||
sudo sed -i 's/^CheckSpace/#CheckSpace/' $bottle_path/etc/pacman.conf
|
||||
sudo sed -i 's/^#DisableSandbox/DisableSandbox/' $bottle_path/etc/pacman.conf
|
||||
echo '[I] (Chroot) PostInit: Done disabling unavailable components!'
|
||||
|
||||
# 一个小wrapper,在chroot中运行某指令 ・ A wrapper to run certain commands under chroot.
|
||||
run() {
|
||||
sudo chroot $bottle_path bash -c "$*"
|
||||
}
|
||||
|
||||
# 写入GXDE Arch源,以便安装dtk等自身提供的依赖
|
||||
# 新源刚建立时可能还不存在,因此只做可选信任
|
||||
# --------------------------------------------
|
||||
# Add GXDE Archlinux PACMAN source to install dependencies such as DTK.
|
||||
# It may not exist when as we're just getting started, so we will do a Optional TrustAll.
|
||||
echo '[I] (Chroot) PACMAN: Configuring GXDE pacman source...'
|
||||
cat << EOF | sudo tee -a $bottle_path/etc/pacman.conf
|
||||
|
||||
[gxde]
|
||||
SigLevel = Optional TrustAll
|
||||
Server = $gxde_arch_repo/\$build_arch
|
||||
EOF
|
||||
echo '[I] (Chroot) PACMAN: GXDE pacman source has been added to chroot!'
|
||||
echo '[I] (Chroot) PACMAN: Doing upgrade...'
|
||||
run pacman-key --init
|
||||
run pacman-key --populate $keyring
|
||||
for i in {1..5}; do
|
||||
# GXDE 源尚不存在时 -Syu 会失败,此时去掉 GXDE 源再试一次
|
||||
if run pacman -Syu --noconfirm --needed base-devel git sudo; then
|
||||
break
|
||||
fi
|
||||
if [[ $i == 3 ]]; then
|
||||
echo "GXDE Arch repo unreachable, building without it"
|
||||
sudo sed -i '/^\[gxde\]/,/^Server/d' $bottle_path/etc/pacman.conf
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
echo '[I] (Chroot) PACMAN: Shall be okay...'
|
||||
|
||||
# makepkg不允许以root运行 ・ makepkg require another account other than root.
|
||||
echo '[I] (Building) AccountCtl: Setting up builder account...'
|
||||
run useradd -m builder
|
||||
echo "builder ALL=(ALL) NOPASSWD: ALL" | sudo tee $bottle_path/etc/sudoers.d/builder
|
||||
echo '[I] (Building) AccountCtl: Builder account is up!'
|
||||
|
||||
# 以builder身份克隆仓库 ・ Clone the repo as builder.
|
||||
echo '[I] (Building) Builder: Cloning target repository...'
|
||||
run sudo -H -u builder git clone $3 -b $4 /home/builder/$(basename $3)
|
||||
echo '[I] (Building) Builder: Done cloning target repository.'
|
||||
|
||||
echo '[I] (Env) Setup: Setup finished, bye~'
|
||||
exit 0
|
||||
Reference in New Issue
Block a user