Oi Habr. Este artigo é sobre como configurar a construção em todas as plataformas usando ações do github.
Antecedentes
Eu escrevi uma aplicação simples em elétron, eu mesmo usei linux, mas meu amigo preferia macos. Quando tentei compilar para macos no meu computador e entreguei o pacote ao meu amigo - ele não foi iniciado. Como resultado, a única opção para compilar um aplicativo para macos foi compilá-lo no macos. Para simplificar a tarefa o máximo possível, criei três scripts: build: linux, build: mac, build: win. Como resultado, após a compilação, os seguintes arquivos foram obtidos: linux.deb, linux.AppImage, mac.pkg, win.exe. Mas havia um problema que precisava ser compilado em sistemas diferentes. E então a salvação das ações do gihub.
Como tudo deve funcionar
Pressiono o novo botão de lançamento no github e a mágica inicia o fluxo de trabalho nas ações do github, ele é compilado em todos os sistemas operacionais e adicionando binários ao lançamento
Usei https://github.com/JasonEtco/upload-to-releas para adicionar arquivos para lançamento, no entanto, houve uma captura com esta ação. Esta é uma ação de contêiner e, nas ações do github, as ações de contêiner estão disponíveis apenas no linux. Portanto, foi decidido usar quatro trabalhos, 3 para compilação e 1 para carregamento. Como o ambiente não é salvo para cada tarefa, é por isso que os artefatos são usados para trocar entre eles
Prática
Primeiro, na pasta .github / workflows / workflow.yml com o conteúdo
name: CI on: release
Bem, acho claro que esse é o fluxo de trabalho do IC e será lançado no lançamento, e agora o trabalho mais importante
jobs: build-linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Install bluetooth run: sudo apt-get install -y build-essential libbluetooth-dev - name: Install dependencies run: npm install - name: Build linux run: npm run build:linux - name: Creating out run: | mkdir out cp dist/linux.AppImage out/ cp dist/linux.deb out/ - name: Upload build uses: actions/upload-artifact@master with: name: linux path: out
As etapas dos trabalhos: este é todo o trabalho, build-linux: este é o trabalho com o nome build-linux, continua: ubuntu-latest diz que você precisa executar tudo sob o ubuntu mais recente
E então as etapas mais interessantes: e tudo o que está por baixo é o que nosso trabalho fará
Primeiramente - usa: ations / checkout @ v1 clona o repositório para que possamos usá-lo. A próxima etapa Instalar bluetooth instala o bluetooth porque o projeto o utiliza. Em seguida, as dependências são estabelecidas e uma compilação ocorre. Como após a compilação, na pasta dist, existem não apenas binários, mas também lixo desnecessário. Portanto, a próxima etapa é criar outra pasta na qual apenas os binários estão localizados e carregá-los em artefatos.
Quase o mesmo para ganhar com macos
build-mac: runs-on: macOS-latest steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: node-version: '8.x' - name: Install dependencies run: npm install - name: Build mac run: npm run build:mac - name: Creating out run: | mkdir out cp dist/mac.pkg out/ - name: Upload build uses: actions/upload-artifact@master with: name: mac path: out build-win: runs-on: windows-latest steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: node-version: '8.x' - name: Install dependencies run: npm install - name: Build win run: npm run build:win - name: Creating out run: | mkdir out copy dist\win.exe out\ - name: Upload build uses: actions/upload-artifact@master with: name: win path: out
No entanto, vale ressaltar algumas diferenças. Primeiramente, você não precisa instalar o bluetooth, ele já está instalado; no entanto, você precisa instalar o nodejs para isso, use actions / setup-node. Além disso, o Windows usa outros comandos no estágio Criando.
E, claro, a etapa final é fazer o upload de arquivos para o lançamento
upload: runs-on: ubuntu-latest needs: [build-linux, build-mac, build-win] steps: - uses: actions/checkout@v1 - name: Download linux artifact uses: actions/download-artifact@master with: name: linux - name: Download mac artifact uses: actions/download-artifact@master with: name: mac - name: Download win artifact uses: actions/download-artifact@master with: name: win - name: Upload to Release deb uses: JasonEtco/upload-to-release@v0.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: linux/linux.deb application/vnd.debian.binary-package - name: Upload to Release AppImage uses: JasonEtco/upload-to-release@v0.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: linux/linux.AppImage application/x-executable - name: Upload to Release pkg uses: JasonEtco/upload-to-release@v0.31.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: mac/mac.pkg application/x-xar - name: Upload to Release exe uses: JasonEtco/upload-to-release@v0.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: win/win.exe application/octet-stream
A parte muito importante é que precisa, esta linha diz que você precisa iniciar o trabalho somente depois de todas as construções (se as construções forem paralelas), primeiro faremos o download dos artefatos e depois adicionaremos os binários deles à liberação
Referências
Arquivo workflow.yml resultante
Repositório
Mais sobre ações do github
Obrigado pela atenção!