æ¬å¤å¿åæ»ç»äº Github Actions 常ç¨çé 置说æï¼ä»¥ä¾å¿«éåèã
GitHub Actions çä»åºä¸èªå¨åãèªå®ä¹åæ§è¡è½¯ä»¶å¼å工使µç¨ï¼æåä¸ªåºæ¬çæ¦å¿µï¼å¦ä¸ï¼
| :- | :- |
|---|---|
workflow (工使µç¨) | æç»éæä¸æ¬¡è¿è¡çè¿ç¨ï¼å°±æ¯ä¸ä¸ª workflow |
job (ä»»å¡) | ä¸ä¸ª workflow ç±ä¸ä¸ªæå¤ä¸ª jobs ææï¼å«ä¹æ¯ä¸æ¬¡æç»éæçè¿è¡ï¼å¯ä»¥å®æå¤ä¸ªä»»å¡ |
step (æ¥éª¤) | æ¯ä¸ª job ç±å¤ä¸ª step ææï¼ä¸æ¥æ¥å®æ |
action (å¨ä½) | æ¯ä¸ª step å¯ä»¥ä¾æ¬¡æ§è¡ä¸ä¸ªæå¤ä¸ªå½ä»¤(action) |
.github/workflows ç®å½ä¸.ymlï¼æ¯å¦ ci.ymlworkflow æä»¶name: GitHub Actions Demo
on:
push:
branches:
- main
# ä»»å¡
jobs:
build:
runs-on: ubuntu-latest
# æ¥éª¤ æ ¹æ®æ¥éª¤æ§è¡ä»»å¡
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- run: npm install
- run: npm run build
åæ¾å° .github/workflows ç®å½ä¸ï¼å½å为 ci.ymlï¼å½ push 代ç å°ä»åº main 忝ä¸ï¼è¯¥é
ç½®èªå¨è¿è¡é
ç½®ã
push äºä»¶è§¦å workflow
on: push
push äºä»¶æ pull_request äºä»¶é½å¯ä»¥è§¦å workflow
on: [push, pull_request]
åªæå¨ main 忝 push äºä»¶è§¦å workflow
on:
push:
branches:
- main
push äºä»¶è§¦å workflowï¼docs ç®å½ä¸çæ´æ¹ push äºä»¶ä¸è§¦å workflow
on:
push:
paths-ignore:
- 'docs/**'
push äºä»¶è§¦å workflowï¼å æ¬ sub-project ç®å½æå ¶åç®å½ä¸çæä»¶è§¦å workflowï¼é¤é该æä»¶å¨ sub-project/docs ç®å½ä¸ï¼ä¸è§¦å workflow
on:
push:
paths:
- 'sub-project/**'
- '!sub-project/docs/**'
çæ¬åå¸ä¸º published æ¶è¿è¡å·¥ä½æµç¨ã
on:
release:
types: [published]
jobs:
my_first_job: # 第ä¸ä¸ªä»»å¡
name: My first job
my_second_job: # 第äºä¸ªä»»å¡
name: My second job
éè¿ jobs (jobs.<job_id>.name)åæ®µï¼é
ç½®ä¸é¡¹æå¤é¡¹éè¦æ§è¡çä»»å¡
éè¿ needs (jobs.<job_id>.needs)åæ®µï¼æå®å½åä»»å¡çä¾èµå
³ç³»
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
ä¸é¢é
ç½®ä¸ï¼job1 å¿
é¡»å
äº job2 宿ï¼è job3 çå¾
job1 å job2 ç宿æè½è¿è¡ãå æ¤ï¼è¿ä¸ª workflow çè¿è¡é¡ºåºä¾æ¬¡ä¸ºï¼job1ãjob2ãjob3
jobs:
job1:
runs-on: ubuntu-latest
# å°æ¥éª¤è¾åºæ å°å°ä½ä¸è¾åº
outputs:
output1: ${{ steps.step1.outputs.test }}
output2: ${{ steps.step2.outputs.test }}
steps:
- id: step1
run: echo "::set-output name=test::hello"
- id: step2
run: echo "::set-output name=test::world"
job2:
runs-on: ubuntu-latest
needs: job1
steps:
- run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}
å¯ä»¥ä½¿ç¨ cron 表达å¼é ç½®å¨ææ§ä»»å¡ï¼å®æ¶æ§è¡
name: schedule task
# è¦æ³¨ææ¶å·®ï¼æå¥½æå¨æå®æ¶åº
env:
TZ: Asia/Shanghai
on:
# push å° main åæ¯æ¶æ§è¡ä»»å¡
push:
branches:
- main
# æ¯é䏤尿¶èªå¨æ§è¡ä»»å¡
schedule:
- cron: '0 0/2 * * *'
runs-on: ubuntu-latest
æå®è¿è¡æéè¦çèææºç¯å¢ï¼â ï¸ å®æ¯å¿ å¡«åæ®µ
jobs:
build: # ä»»å¡åç§°
runs-on: ubuntu-latest # èææºç¯å¢é
ç½®
Windows Server 2022 (windows-latest) æ (windows-2022)Ubuntu 20.04 (ubuntu-latest) æ (ubuntu-20.04)macOS Monterey 12 (macos-12)macOS Big Sur 11 (macos-latest),(macos-11)å¦è§: éæ© GitHub æç®¡çè¿è¡å¨
æ¯ä¸ªæ¥éª¤é½å¯ä»¥æå®ä»¥ä¸ä¸ä¸ªå段
jobs.<job_id>.steps.name # æ¥éª¤åç§°
# 该æ¥éª¤è¿è¡çå½ä»¤æè
action
jobs.<job_id>.steps.run
# 该æ¥éª¤æéçç¯å¢åé
jobs.<job_id>.steps.env
steps åæ®µæå®æ¯ä¸ª Job çè¿è¡æ¥éª¤ï¼å¯ä»¥å
å«ä¸ä¸ªæå¤ä¸ªæ¥éª¤(steps)
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- run: npm install
- run: npm run build
jobs.<job_id>.environment
使ç¨åä¸ç¯å¢åç§°ç示ä¾
environment: staging_environment
使ç¨ç¯å¢åç§°å URL ç示ä¾
environment:
name: production_environment
url: https://github.com
GitHub ä¼ä¿ç GITHUB_ ç¯å¢åéåç¼ä¾ GitHub å
é¨ä½¿ç¨ã设置æ GITHUB_ åç¼çç¯å¢åéæå¯ç å°å¯¼è´é误ã
- name: æµè¯ nodejs è·åç¯å¢åé
env:
API_TOKEN: ${{ secrets.API_TOKEN }}
å¨ https://github.com/<ç¨æ·å>/<项ç®åç§°>/settings/secrets 䏿·»å secrets API_TOKENï¼å¨å·¥ä½æµä¸è®¾ç½®ç¯å¢åé API_TOKEN
å¨ if æ¡ä»¶ä¸ä½¿ç¨è¡¨è¾¾å¼æ¶ï¼å¯ä»¥çç¥è¡¨è¾¾å¼è¯æ³ (${{ }})ï¼å 为 GitHub ä¼èªå¨å° if æ¡ä»¶ä½ä¸ºè¡¨è¾¾å¼æ±å¼
steps:
- uses: actions/hello-world-action@v1.1
if: github.repository == 'uiw/uiw-repo'
# if: ${{ <expression> }}
设置ç¯å¢åéç示ä¾
env:
MY_ENV_VAR: ${{ <expression> }}
( ) (é»è¾åç»)[ ] (ç´¢å¼). (屿§è§£å¼ç¨)! (é)< (å°äº)<= (å°äºæçäº)> (大äº)>= (å¤§äºæçäº)== (ç¸ç)!= (ä¸ç)&& (å)|| (æ)| 屿§åç§° | ç±»å | æè¿° |
|---|---|---|
github (object) | 工使µç¨ä¸ä»»ä½ä½ä¸ææ¥éª¤æé´å¯ç¨çé¡¶å±ä¸ä¸æã | |
github.event (object) | 宿´äºä»¶ web æé©ææè´è½½ã æ´å¤ä¿¡æ¯è¯·åé â触å工使µç¨çäºä»¶âã | |
github.event_path (string) | è¿è¡å¨ä¸å®æ´äºä»¶ web æé©ææè´è½½çè·¯å¾ã | |
github.workflow (string) | 工使µç¨çåç§°ã 妿工使µç¨æä»¶æªæå® nameï¼æ¤å±æ§çå¼å°æ¯ä»åºä¸å·¥ä½æµç¨æä»¶ç宿´è·¯å¾ã | |
github.job (string) | å½åä½ä¸ç job_idã | |
github.run_id (string) | ä»åºä¸æ¯ä¸ªè¿è¡çå¯ä¸ç¼å·ã 妿æ¨éæ°æ§è¡å·¥ä½æµç¨è¿è¡ï¼æ¤ç¼å·ä¸åã | |
github.run_number (string) | ä»åºä¸ç¹å®å·¥ä½æµç¨æ¯ä¸ªè¿è¡çå¯ä¸ç¼å·ã æ¤ç¼å·ä» 1ï¼å¯¹åºäºå·¥ä½æµç¨ç第ä¸ä¸ªè¿è¡ï¼å¼å§ï¼ç¶åéçæ¯ä¸ªæ°çè¿è¡èéå¢ã 妿æ¨éæ°æ§è¡å·¥ä½æµç¨è¿è¡ï¼æ¤ç¼å·ä¸åã | |
github.actor (string) | åèµ·å·¥ä½æµç¨è¿è¡çç¨æ·çç»å½åã | |
github.repository (string) | ææè åä»åºåç§°ã ä¾å¦ Codertocat/Hello-Worldã | |
github.repository_owner (string) | ä»åºææè çåç§°ã ä¾å¦ Codertocatã | |
github.event_name (string) | 触å工使µç¨è¿è¡çäºä»¶çåç§°ã | |
github.sha (string) | 触å工使µç¨çæäº¤ SHAã | |
github.ref (string) | 触å工使µç¨çåæ¯ææ è®°åèã | |
github.head_ref (string) | 工使µç¨è¿è¡ä¸æå请æ±ç head_ref ææ¥æºåæ¯ã æ¤å±æ§ä» å¨è§¦å工使µç¨è¿è¡çäºä»¶ä¸º pull_request æ¶æå¯ç¨ã | |
github.base_ref (string) | 工使µç¨è¿è¡ä¸æå请æ±ç base_ref æç®æ åæ¯ã æ¤å±æ§ä» å¨è§¦å工使µç¨è¿è¡çäºä»¶ä¸º pull_request æ¶æå¯ç¨ã | |
github.token (string) | 代表ä»åºä¸å®è£ ç GitHub åºç¨ç¨åºè¿è¡èº«ä»½éªè¯ç令çã è¿å¨åè½ä¸çåäº GITHUB_TOKEN å¯ç ã æ´å¤ä¿¡æ¯è¯·åé âä½¿ç¨ GITHUB_TOKEN éªè¯èº«ä»½âã | |
github.workspace (string) | ä½¿ç¨ checkout æä½æ¶æ¥éª¤çé»è®¤å·¥ä½ç®å½åä»åºçé»è®¤ä½ç½®ã | |
github.action (string) | æ£å¨è¿è¡çæä½çåç§°ã å¨å½åæ¥éª¤è¿è¡èæ¬æ¶ï¼GitHub å é¤ç¹æ®å符æä½¿ç¨åç§° runã 妿å¨åä¸ä½ä¸ä¸å¤æ¬¡ä½¿ç¨ç¸åçæä½ï¼ååç§°å°å æ¬å¸¦æåºåå·çåç¼ã ä¾å¦ï¼è¿è¡ç第ä¸ä¸ªèæ¬å称为 run1ï¼å第äºä¸ªèæ¬å°å½å为 run2ã åæ ·ï¼actions/checkout ç¬¬äºæ¬¡è°ç¨æ¶å°åæ actionscheckout2ã |
Github ä¸ä¸ææ¯è®¿é®æå ³å·¥ä½æµè¿è¡ãè¿è¡å¨ç¯å¢ãä½ä¸åæ¥éª¤çä¿¡æ¯çä¸ç§æ¹å¼
ä½ä¸ºè¡¨è¾¾å¼çä¸é¨åï¼å¯ä»¥ä½¿ç¨ boolean, null, number æ stringæ°æ®ç±»å
env:
myNull: ${{ null }}
myBoolean: ${{ false }}
myIntegerNumber: ${{ 711 }}
myFloatNumber: ${{ -9.2 }}
myHexNumber: ${{ 0xff }}
myExponentialNumber: ${{ -2.99e-2 }}
myString: Mona the Octocat
myStringInBraces: ${{ 'It''s source!' }}
使ç¨å符串ç示ä¾
contains('Hello world', 'llo') // è¿å true
使ç¨å¯¹è±¡è¿æ»¤å¨ç示ä¾è¿å true
contains(github.event.issue.labels.*.name, 'bug')
å¦è§: 彿° contains
startsWith('Hello world', 'He') // è¿å true
å¦è§: 彿° startsWithï¼æ¤å½æ°ä¸åºå大å°å
| ç¯å¢åé | æè¿° |
|---|---|
CI | å§ç»è®¾ç½®ä¸º true |
HOME | ç¨äºåå¨ç¨æ·æ°æ®ç GitHub 主ç®å½è·¯å¾ã ä¾å¦ /github/home |
GITHUB_WORKFLOW | 工使µç¨çåç§°ã |
GITHUB_RUN_ID | ä»åºä¸æ¯ä¸ªè¿è¡çå¯ä¸ç¼å·ã 妿æ¨éæ°æ§è¡å·¥ä½æµç¨è¿è¡ï¼æ¤ç¼å·ä¸åã |
GITHUB_RUN_NUMBER | ä»åºä¸ç¹å®å·¥ä½æµç¨æ¯ä¸ªè¿è¡çå¯ä¸ç¼å·ã æ¤ç¼å·ä» 1ï¼å¯¹åºäºå·¥ä½æµç¨ç第ä¸ä¸ªè¿è¡ï¼å¼å§ï¼ç¶åéçæ¯ä¸ªæ°çè¿è¡èéå¢ã 妿æ¨éæ°æ§è¡å·¥ä½æµç¨è¿è¡ï¼æ¤ç¼å·ä¸åã |
GITHUB_ACTION | æä½å¯ä¸çæ è¯ç¬¦ (id)ã |
GITHUB_ACTIONS | å½ GitHub æä½ è¿è¡å·¥ä½æµç¨æ¶ï¼å§ç»è®¾ç½®ä¸º trueã æ¨å¯ä»¥ä½¿ç¨æ¤å鿥åºåæµè¯æ¯å¨æ¬å°è¿è¡è¿æ¯éè¿ GitHub æä½ è¿è¡ã |
GITHUB_ACTION_PATH | GitHub æä½æå¨çè·¯å¾ |
GITHUB_ACTOR | åèµ·å·¥ä½æµç¨ç个人æåºç¨ç¨åºçåç§°ã ä¾å¦ octocat |
GITHUB_API_URL | è¿å API URLãä¾å¦ï¼https://api.github.com |
GITHUB_REPOSITORY | ææè åä»åºåç§°ã ä¾å¦ octocat/Hello-World |
GITHUB_EVENT_NAME | 触å工使µç¨ç web æé©äºä»¶çåç§° |
GITHUB_EVENT_PATH | å ·æå®æ´ web æé©äºä»¶ææè´è½½çæä»¶è·¯å¾ã ä¾å¦ /github/workflow/event.json |
GITHUB_WORKSPACE | GitHub å·¥ä½ç©ºé´ç®å½è·¯å¾ã 妿æ¨ç工使µç¨ä½¿ç¨ actions/checkout æä½ï¼å·¥ä½ç©ºé´ç®å½å°å å«åå¨ä»åºå¯æ¬çåç®å½ã 妿ä¸ä½¿ç¨ actions/checkout æä½ï¼è¯¥ç®å½å°ä¸ºç©ºã ä¾å¦ /home |
GITHUB_SHA | 触å工使µç¨çæäº¤ SHAã ä¾å¦ ffac537e6cbbf9 |
GITHUB_REF | 触å工使µç¨çåæ¯ææ è®°åèã ä¾å¦ refs/heads/feature-branch-1ã å¦æåæ¯ææ è®°é½ä¸éç¨äºäºä»¶ç±»åï¼ååéä¸ä¼åå¨ |
GITHUB_HEAD_REF | ä» ä¸ºå¤å»çä»åºè®¾ç½®ã头é¨ä»åºç忝 |
GITHUB_BASE_REF | ä» ä¸ºå¤å»çä»åºè®¾ç½®ãåºç¡ä»åºç忝 |
å¦è§: é»è®¤ç¯å¢åé
format('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')
// è¿å '{Hello Mona the Octocat!}'.
å¦è§: 彿° format
join(github.event.issue.labels.*.name,', ')
// ä¹è®¸è¿å 'bug, help wanted'.
å¦è§: 彿° join
toJSON(job)
// ä¹è®¸è¿å { "status": "Success" }.
å¦è§: 彿° toJSON
| :- | :- |
|---|---|
fromJSON | è¿å JSON 对象æ JSON æ°æ®ç±»åçå¼ # |
hashFiles | è¿åä¸è·¯å¾æ¨¡å¼å¹é çæä»¶éçå个åå¸ # |
success | å½åé¢çæ¥éª¤é½æ²¡å¤±è´¥æè¢«åæ¶æ¶è¿å true # |
always | 使æ¥éª¤å§ç»æ§è¡ï¼è¿å true å³ä½¿åæ¶ä¹æ¯å¦æ¤ # |
cancelled | 妿工使µè¢«åæ¶ï¼åè¿å true # |
failure | å½ä½ä¸çä»»ä½å åæ¥éª¤å¤±è´¥æ¶è¿å true # |
steps:
...
- name: ä½ä¸å·²æå
if: ${{ success() }}
steps:
...
- name: ä½ä¸å¤±è´¥
if: ${{ failure() }}
- name: Test
run: |
# Strip git ref prefix from version
echo "${{ github.ref }}"
# VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
# # Strip "v" prefix from tag name
# [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
echo "$VERSION"
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{secrets.GITHUB_TOKEN}}
publish_dir: ./build
- name: Modify Version
shell: bash
run: |
node -e 'var pkg = require("./package.json"); pkg.version= (new Date().getFullYear().toString().substr(2)) + "." + (new Date().getMonth() + 1) + "." + (new Date().getDate()); require("fs").writeFileSync("./package.json", JSON.stringify(pkg, null, 2))'
ä½¿ç¨ github-action-package ä¿®æ¹ name åæ®µ
- name: package.json info
uses: jaywcjlove/github-action-package@main
with:
rename: '@wcj/github-package-test'
- name: Checkout
uses: actions/checkout@v3
with:
path: main
submodules: true
submodulesï¼true æ£åºåæ¨¡åæ recursive é彿£åºå模å
- name: Clone sub repository
shell: bash
run: |
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
# git submodule sync --recursive
# git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --remote --force --recursive --checkout ant.design
ä½¿ç¨ jobs.<job_id>.needs è¯å«å¨æ¤ä½ä¸è¿è¡ä¹åå¿
é¡»æå宿çä»»ä½ä½ä¸ãå®å¯ä»¥æ¯ä¸ä¸ªå符串ï¼ä¹å¯ä»¥æ¯å符串æ°ç»ã 妿æä¸ªä½ä¸å¤±è´¥ï¼åææéè¦å®çä½ä¸é½ä¼è¢«è·³è¿ï¼é¤éè¿äºä½ä¸ä½¿ç¨è®©è¯¥ä½ä¸ç»§ç»çæ¡ä»¶è¡¨è¾¾å¼ã
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
卿¤ç¤ºä¾ä¸ï¼job1 å¿
é¡»å¨ job2 å¼å§ä¹åæå宿ï¼è job3 è¦çå¾
job1 å job2 å®æãæ¤ç¤ºä¾ä¸çä½ä¸æé¡ºåºè¿è¡ï¼
â¶ job1
â· job2
⸠job3
é ç½®å¦ä¸
jobs:
job1:
job2:
needs: job1
job3:
if: ${{ always() }}
needs: [job1, job2]
卿¤ç¤ºä¾ä¸ï¼job3 ä½¿ç¨ always() æ¡ä»¶è¡¨è¾¾å¼ï¼å æ¤å®å§ç»å¨ job1 å job2 宿åè¿è¡ï¼ä¸ç®¡å®ä»¬æ¯å¦æåã
- name: Sync to Gitee
run: |
mirror() {
git clone "https://github.com/$1/$2"
cd "$2"
git remote add gitee "https://jaywcjlove:${{ secrets.GITEE_TOKEN }}@gitee.com/uiw/$2"
git remote set-head origin -d
git push gitee --prune +refs/remotes/origin/*:refs/heads/* +refs/tags/*:refs/tags/*
cd ..
}
mirror uiwjs uiw
- run: npm publish --access public
continue-on-error: true
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
è·å NPM_TOKENï¼å¯ä»¥éè¿ npm è´¦å·å建 token
npm token list [--json|--parseable] # æ¥ç
npm token create [--read-only] [--cidr=1.1.1.1/24,2.2.2.2/16] # å建
npm token revoke <id|token> # æ¤é
å¯ä»¥ä½¿ç¨ JS-DevTools/npm-publish æäº¤
- name: ð¦ @province-city-china/data
uses: JS-DevTools/npm-publish@v1
with:
token: ${{ secrets.NPM_TOKEN }}
package: packages/data/package.json
å®æä¸ªå¥½å¤ï¼æ£æµ package.json ä¸çæ¬å·æ¯å¦åçåæ´ï¼æ¥å³å®æ¯å¦æäº¤çæ¬ï¼ä¸ä¼å¼åæµç¨é误ã
Artifacts æ¯ GitHub Actions ä¸ºæ¨æä¾æä¹ æä»¶å¹¶å¨è¿è¡å®æå使ç¨å®ä»¬æå¨ä½ä¸ï¼ææ¡£ï¼ä¹é´å ±äº«çä¸ç§æ¹å¼ã
è¦ä¸ä¼ æä»¶æç®å½ï¼æ¨åªéåè¿æ ·ä½¿ç¨å®ï¼
steps:
- uses: actions/checkout@v2
- run: mkdir -p path/to/artifact
- run: echo hello > path/to/file/a.txt
- uses: actions/upload-artifact@v2
with:
name: my-artifact
path: path/to/artifact/a.txt
ç¶åä¸è½½ artifact 以使ç¨å®ï¼
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
with:
name: my-artifact
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: 14
使ç¨ç©éµçç¥ å¨ nodejs ä¸åçæ¬ä¸è¿è¡
strategy:
matrix:
node-version: [10.x, 12.x, 14.x]
steps:
- uses: actions/checkout@v2
- name: ä½¿ç¨ Node ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm run build --if-present
- run: npm test
# https://www.basefactor.com/github-actions-docker
- name: Docker login
run: docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }}
- name: Build ant.design image
run: |
cd ./ant\.design
docker build -t ant.design .
- name: Tags & Push docs
run: |
# Strip git ref prefix from version
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
docker tag ant.design ${{ secrets.DOCKER_USER }}/ant.design:$VERSION
docker tag ant.design ${{ secrets.DOCKER_USER }}/ant.design:latest
docker push ${{ secrets.DOCKER_USER }}/ant.design:$VERSION
docker push ${{ secrets.DOCKER_USER }}/ant.design:latest
- name: Create Tag
id: create_tag
uses: jaywcjlove/create-tag-action@main
with:
package-path: ./package.json
æ ¹æ® package-path æå®ç package.json æ£æµ version æ¯å¦åçå忥å建 tag
- name: Generate Changelog
id: changelog
uses: jaywcjlove/changelog-generator@main
with:
filter-author: (å°å¼è°è°â¢)
- name: Get the changelog
run: echo "${{ steps.changelog.outputs.changelog }}"
- name: 'ç»å½å° GitHub 注å表'
run: echo ${{ github.token }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- name: 'ç¼è¯ docker image'
run: docker build -t ghcr.io/jaywcjlove/reference:latest .
- name: 'æ¨éå° GitHub 注å表ä¸'
run: docker push ghcr.io/jaywcjlove/reference:latest
- name: 'æ è®° docker éåå¹¶åå¸å° GitHub 注å表'
if: steps.create_tag.outputs.successful
run: |
echo "version: v${{ steps.changelog.outputs.version }}"
docker tag ghcr.io/jaywcjlove/reference:latest ghcr.io/jaywcjlove/reference:${{steps.changelog.outputs.version}}
docker push ghcr.io/jaywcjlove/reference:${{steps.changelog.outputs.version}}
- name: çæä¸ä¸ªæä»¶ï¼å¹¶å°å®æäº¤å° master 忝
run: |
# Strip git ref prefix from version
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
COMMIT=released-${VERSION}
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
echo "è¾åºçæ¬å·ï¼$VERSION"
# å°çæ¬è¾åºå°å½å VERSION æä»¶ä¸
echo "$VERSION" > VERSION
echo "1. è¾åºCommitï¼$commit"
echo "2. Released $VERSION"
git fetch
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add .
git commit -am $COMMIT
git branch -av
git pull origin master
- name: å°ä¸é¢çæäº¤ push å° master 忝
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
å建ä¸ä¸ªæä»¶ï¼ç¶åå°å ¶ä½ä¸ºæä»¶ä¸ä¼
jobs:
example-job:
name: Save output
steps:
- shell: bash
run: |
expr 1 + 1 > output.log
- name: Upload output file
uses: actions/upload-artifact@v3
with:
name: output-log-file
path: output.log
å¯ä»¥ä¸è½½å为 output-log-file ç工件
jobs:
example-job:
steps:
- name: Download a single artifact
uses: actions/download-artifact@v3
with:
name: output-log-file
- name: Clean temp directory
run: rm -rf *
working-directory: ./temp
ä½¿ç¨ working-directory å
³é®åï¼æ¨å¯ä»¥æå®è¿è¡å½ä»¤çå·¥ä½ç®å½(./temp)
jobs:
job1:
runs-on: ubuntu-latest
defaults:
run:
shell: bash
working-directory: scripts
ä½ä¸ä¸çææ run æ¥éª¤æä¾é»è®¤ç shell å working-directory
ä½¿ç¨ bash è¿è¡èæ¬
steps:
- name: Display the path
run: echo $PATH
shell: bash
è¿è¡ python èæ¬
steps:
- name: Display the path
run: |
import os
print(os.environ['PATH'])
shell: python
æ¨å¯ä»¥ä½¿ç¨ shell å
³é®åè¦çè¿è¡å¨æä½ç³»ç»ä¸çé»è®¤ shell 设置
| :- | :- |
|---|---|
create-tag-action | æ ¹æ® package.json å建 Tag / Release |
changelog-generator | çæ changelog æ¥å¿ |
github-action-modify-file-content | ä¿®æ¹ä»åºæä»¶å 容 |
github-action-contributors | çæè´¡ç®(contributors.svg)å¾ç |
generated-badges | çæå¾½ç« (Badges)å¾ç |
coverage-badges-cli | çæè¦ççå¾½ç« (Badges)å¾ç |
action-ejs | åºäº ejs çæ HTML |
github-action-package | ä¿®æ¹ JSON æä»¶å 容 |
github-action-read-file | 读åæä»¶å 容 |
markdown-to-html-cli | Markdown è½¬æ¢æ HTML |
ncipollo/release-action | å建 Release |
peaceiris/actions-gh-pages | å°æä»¶ææä»¶å¤¹å
容æäº¤å° gh-pages 忝 |
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: ç»å½ GitHub 容卿³¨å表
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: æå»ºå¹¶æ¨é image:latest
uses: docker/build-push-action@v3
with:
push: true
context: .
platforms: linux/amd64,linux/arm64
tags: ghcr.io/jaywcjlove/reference:latest
- name: æå»ºå¹¶æ¨é image:tags
uses: docker/build-push-action@v3
if: steps.create_tag.outputs.successful
with:
push: true
context: .
platforms: linux/amd64,linux/arm64
tags: ghcr.io/jaywcjlove/reference:${{steps.changelog.outputs.version}}
- name: Generate Contributors Images
uses: jaywcjlove/github-action-contributors@main
id: contributors
with:
output: dist/CONTRIBUTORS.svg
avatarSize: 42
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: ç»å½å° Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: æå»ºå¹¶æ¨é image:latest
uses: docker/build-push-action@v3
with:
push: true
context: .
platforms: linux/amd64,linux/arm64
tags: ${{ secrets.DOCKER_USER }}/reference:latest
- name: æå»ºå¹¶æ¨é image:tags
uses: docker/build-push-action@v3
if: steps.create_tag.outputs.successful
with:
push: true
context: .
platforms: linux/amd64,linux/arm64
tags: ${{ secrets.DOCKER_USER }}/reference:${{steps.changelog.outputs.version}}
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- run: npm publish
continue-on-error: true
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
å½ npm æ¨éå
失败ä¸å½±åæ´ä¸ªæµç¨ï¼å¯ç¨äºèªå¨åå
- name: Setup Yarn
uses: threeal/setup-yarn-action@v2.0.0
with:
cache: false
version: 1.22.21
å¨ ci.yml ä¸ä¿åç¯å¢åé
- name: Save commit message to environment variable
run: echo "COMMIT_MESSAGE=${{ github.event.head_commit.message }}" >> $GITHUB_ENV
å¨ tag.yml ä¸è·åç¯å¢åé
- name: Read commit message
run: |
echo "Commit: ${{ github.event.workflow_run.head_commit.message }}"
å¨ tag.yml 䏿·»å 夿 tag å建æå触å tag-creation-success ç工使µ
- name: Trigger next workflow if successful
if: steps.check_success.outputs.success == 'true'
run: |
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-d '{"event_type": "tag-creation-success"}' \
https://api.github.com/repos/${{ github.repository }}/dispatches
å¨ success.yml ä¸çå¬
on:
repository_dispatch:
types: [tag-creation-success]
job1:
variables:
GIT_CHECKOUT: "true"
script:
- echo "Run your script here"
GitHub Actions
jobs:
job1:
steps:
- uses: actions/checkout@v3
- run: echo "Run your script here"
windows_job:
tags:
- windows
script:
- echo Hello, %USERNAME%!
linux_job: tags:
- linux script:
- echo "Hello, $USER!"
GitHub Actions
windows_job:
runs-on: windows-latest
steps:
- run: echo Hello, %USERNAME%!
linux_job:
runs-on: ubuntu-latest
steps:
- run: echo "Hello, $USER!"
å¨ä¸åçå¹³å°ä¸è¿è¡ä½ä¸
my_job:
image: node:10.16-jessie
GitHub Actions
jobs:
my_job:
container: node:10.16-jessie
deploy_prod:
stage: deploy
script:
- echo "é¨ç½²å°ç产æå¡å¨"
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
GitHub Actions
jobs:
deploy_prod:
if: contains( github.ref, 'master')
runs-on: ubuntu-latest
steps:
- run: echo "é¨ç½²å°ç产æå¡å¨"
script:
artifacts:
paths:
- math-homework.txt
GitHub Actions
- name: Upload math result for job 1
uses: actions/upload-artifact@v3
with:
name: homework
path: math-homework.txt
stages:
- build
- test
- deploy
build_a: stage: build script:
- echo "该ä½ä¸å°é¦å
è¿è¡"
build_b: stage: build script:
- echo "该ä½ä¸å°é¦å
è¿è¡ï¼ä¸ build_a å¹¶è¡"
test_ab: stage: test script:
- echo "æ¤ä½ä¸å°å¨ build_a å build_b 宿åè¿è¡"
deploy_ab: stage: deploy script:
- echo "æ¤ä½ä¸å°å¨ test_ab 宿åè¿è¡"
GitHub Actions
jobs:
build_a:
runs-on: ubuntu-latest
steps:
- run: echo "该ä½ä¸å°é¦å
è¿è¡"
build_b:
runs-on: ubuntu-latest
steps:
- run: echo "该ä½ä¸å°é¦å
è¿è¡ï¼ä¸ build_a å¹¶è¡"
test_ab:
runs-on: ubuntu-latest
needs: [build_a,build_b]
steps:
- run: echo "æ¤ä½ä¸å°å¨ build_a å build_b 宿åè¿è¡"
deploy_ab:
runs-on: ubuntu-latest
needs: [test_ab]
steps:
- run: echo "æ¤ä½ä¸å°å¨ test_ab 宿åè¿è¡"
image: node:latest
cache: key: $CI_COMMIT_REF_SLUG paths:
- .npm/
before_script:
- npm ci --cache .npm --prefer-offline
test_async: script:
- node ./specs/start.js ./specs/async.spec.js
GitHub Actions
jobs:
test_async:
runs-on: ubuntu-latest
steps:
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: v1-npm-deps-${{ hashFiles('**/package-lock.json') }}
restore-keys: v1-npm-deps-
container-job:
variables:
POSTGRES_PASSWORD: postgres
# PostgreSQL æå¡å®¹å¨éä¿¡ç主æºå
POSTGRES_HOST: postgres
# é»è®¤ç PostgreSQL 端å£
POSTGRES_PORT: 5432
image: node:10.18-jessie
services:
- postgres
script:
# æ§è¡ package.json æä»¶ä¸
# ææä¾èµé¡¹çå
¨æ°å®è£
- npm ci
# è¿è¡å建 PostgreSQL 客æ·ç«¯çèæ¬ï¼
# ç¨æ°æ®å¡«å
客æ·ç«¯ï¼å¹¶æ£ç´¢æ°æ®
- node client.js
tags:
- docker
GitHub Actions
jobs:
container-job:
runs-on: ubuntu-latest
container: node:10.18-jessie
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
steps:
- name: Check out repository code
uses: actions/checkout@v3
# æ§è¡ package.json æä»¶ä¸
# ææä¾èµé¡¹çå
¨æ°å®è£
- name: Install dependencies
run: npm ci
- name: Connect to PostgreSQL
# è¿è¡å建 PostgreSQL 客æ·ç«¯çèæ¬ï¼
# ç¨æ°æ®å¡«å
客æ·ç«¯ï¼å¹¶æ£ç´¢æ°æ®
run: node client.js
env:
# PostgreSQL æå¡å®¹å¨éä¿¡ç主æºå
POSTGRES_HOST: postgres
# é»è®¤ç PostgreSQL 端å£
POSTGRES_PORT: 5432