actionlint v1.4 â v1.6 ã§å®è£ ããæ°æ©è½ã®ç´¹ä»
ååã® actionlint ã®è¨äº GitHub Actions ã®ã¯ã¼ã¯ããã¼ããã§ãã¯ãã actionlint ãã¤ãã£ã ããã¡ããã©1ã¶æçµã¡ï¼ä»æ¥ v1.6.0 ããªãªã¼ã¹ãã¾ããï¼ååæç¹ã§ã¯ v1.4.0 ã§ï¼ãããã v1.4.1, v1.4.2, v1.4.3, v1.5.0, v1.5.1, v1.5.2, v1.5.3, v1.6.0 ã¨ãªãªã¼ã¹ãéãã¦ãã¾ãï¼git diff ã«ãã㨠v1.4.0 ã v1.6.0 ã§
155 files changed, 14816 insertions(+), 2981 deletions(-)
ã®ã³ã¼ãå¤æ´ãè¡ã£ãããã§ãï¼
ãã®è¨äºã§ã¯å¤§ããã®æ©è½è¿½å ãæ¹åãããã¤ãç´¹ä»ãã¾ãï¼
- æåã¢ã¯ã·ã§ã³ã® input/output ãã§ãã¯
- ã¹ã¯ãªããã¤ã³ã¸ã§ã¯ã·ã§ã³èå¼±æ§ã®ãã§ãã¯
-format
ãªãã·ã§ã³ã«ããæè»ãªã¨ã©ã¼åºå- ããã¥ã¡ã³ãã®åæ§æ
- Windows ã§ã«ã¬ã³ããã£ã¬ã¯ããªã®å®è¡ãã¡ã¤ã«ãæå³ããå®è¡ã§ãã¦ãã¾ãèå¼±æ§ã¸ã®å¯¾å¦
- Playground ã®æ©è½è¿½å
å¤æ´ã®å®å ¨ãªå±¥æ´ã«ã¤ãã¦ã¯ãã§ã³ã¸ãã°ã確èªãã¦ãã ããï¼
æåã¢ã¯ã·ã§ã³ã® input/output ãã§ãã¯
ã¢ã¯ã·ã§ã³ã«ã¯å ¥åã¨åºåãããï¼action.yml ã¡ã¿ãã¼ã¿ã«å®ç¾©ããã¦ãã¾ãï¼å ¥åã«ã¯å¿ é ã®ãã®ã¨å¿ é ã§ãªããã®ãããã¾ãï¼
ãããã® input/output ã«ã¤ãã¦ã®æ å ±ã¯ï¼ãã®ã¢ã¯ã·ã§ã³ã® action.yml ããã§ããããªãã¨åããã¾ããï¼ãããã¯ã¼ã¯ãªã¯ã¨ã¹ãã¯é ãã§ããï¼ãããã¯ã¼ã¯ãå¶éãããç°å¢ï¼ã³ã³ããå ãªã©ï¼ã§ã使ããããã«ããå¿ è¦ãããããï¼ãã§ããããã®ã¯é¿ãããã§ãï¼ãã®ããï¼äºåã«æåãªã¢ã¯ã·ã§ã³ã® action.yml ã®æ å ±ãã¯ãã¼ã«ãã¦ã³ã¼ãçæã§æã£ã¦ãããã¨ã§ï¼input/output ã®ãã§ãã¯ãå®ç¾ãã¦ãã¾ãï¼ç°¡åãªèª¿æ»ã§ã¯ï¼æåãªã¢ã¯ã·ã§ã³ã®ãã§ãã¯ããã§ããã°å ¨ä½ã¢ã¯ã·ã§ã³å®è¡ã®9å²ä»¥ä¸ã¯ã«ãã¼ã§ããããªã®ã§ï¼ã¨ããããããã§ã¨ã·ã¨ãã¦ãã¾ãï¼
on: push jobs: test: runs-on: ubuntu-latest steps: - uses: actions/cache@v2 # ERROR: å¿ é ã® input "key" ããªã with: # ERROR: å®ç¾©ããã¦ããªã input keys: | ${{ hashFiles('**/*.lock') }} ${{ hashFiles('**/*.cache') }} path: ./packages - run: make
ãã®ä¾ã¯ actions/cache
ã® input ã®ãã§ãã¯ããã¦ãã¾ãï¼actions/cache
㯠key
ã¨ããå¿
é ã® input ãããã®ã§ãããæå®ããã¦ããªããã¨ï¼action.yml ã«å®ç¾©ããã¦ããªã keys
input ãæå®ããã¦ãããã¨ã®2ç¹ãã¨ã©ã¼ã¨ãã¦å ±åããã¾ãï¼
on: push jobs: test: runs-on: ubuntu-latest steps: # ERROR: id: cache ã®ã¹ãããã¯ã¾ã å®è¡ããã¦ããªã - run: echo ${{ steps.cache.outputs.cache-hit }} - uses: actions/cache@v2 id: cache with: key: ${{ hashFiles('**/*.lock') }} path: ./packages # OK - run: echo ${{ steps.cache.outputs.cache-hit }} # ERROR: cache_hit ã¨ãã output ã¯åå¨ããªã - run: echo ${{ steps.cache.outputs.cache_hit }}
ãã®ä¾ã¯ actions/cache
ã® output ã®ãã§ãã¯ããã¦ãã¾ãï¼actions/cache
ã¯ãã£ãã·ã¥ãããããããã©ããã cache-hit
ã¨ãã output ã«ã»ãããã¾ãï¼actionlint ã§ã¯ steps.cache.outputs
ã®ãªãã¸ã§ã¯ãåã« action.yml ã«åºã¥ãã¦ããããã£ãå®ç¾©ãããã¨ã§ï¼åãã§ãã¯ã§æ£ãã output ã使ãã¦ãããããã§ãã¯ãã¾ãï¼ããã§ã¯åå¨ããªã cache_hit
ããããã£ã«ã¢ã¯ã»ã¹ãããã¨ãã¦ã¨ã©ã¼ã«ãªã£ã¦ãã¾ãï¼ã¾ãï¼steps.cache.outputs
ã®åã¯ï¼id: cache
ã®ã¹ããã以éã§ã®ã¿å®ç¾©ãããã®ã§ï¼id: cache
ããåã®ã¹ãããã§ã¯ã¢ã¯ã»ã¹ã§ããã¨ã©ã¼ã«ãªãã¾ãï¼
action.yml ã®æ
å ±ã¯ã¹ã¯ãªãããçµã㧠go generate
ã§æ´æ°ããããã«ãã¦ãã¦ï¼æ¯é± CI ã§å®è¡ããï¼æ´æ°ãããã°èªå㧠pull request ãçæãããä»çµã¿ã«ãªã£ã¦ãã¾ãï¼
ã¹ã¯ãªããã¤ã³ã¸ã§ã¯ã·ã§ã³èå¼±æ§ã®ãã§ãã¯
GitHub Actions ã® ${{ }}
ã¯åã«æååã¨ãã¦ç½®æããã¾ãï¼ä¾ãã°
- run: echo '${{ github.event.pull_request.title }}'
ã¨ãã step ãããã¨ï¼ã¸ã§ãå®è¡æã« ${{ }}
ã®ä¸èº«ãè©ä¾¡ããã¦ç½®æããï¼
- run: echo 'pull request ã®ã¿ã¤ãã«'
ãã¹ã¯ãªããã¨ãã¦å®è¡ããã¾ãï¼
ããã§æªæã®ããã¦ã¼ã¶ã '; malicious_command ...
ã¨ããã¿ã¤ãã«ã§ pull request ãä½æããã¨ã©ããªãã§ãããï¼
- run: echo ''; malicious_command ...
ã¨ç½®æããï¼malicious_command
ãå®è¡ã§ãã¦ãã¾ãã¾ãï¼ã¸ã§ãå®è¡æã«ã¯è¨å®ããããã¼ããã·ã§ã³ã§ credential ãçæããã¾ããï¼ããã¯ã«ãã£ã¦ã¯ã·ã¼ã¯ã¬ããã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã®ã§ï¼ç§å¿æ
å ±ãçããã¨ãã§ãã¦ãã¾ãã¾ãï¼
ãããé²ãããã«ã¯
- run: echo "$TITLE" env: TITLE: ${{ github.event.pull_request.title }}
ã¨ããããã«ç°å¢å¤æ°ãéãã¦ã¢ã¯ã»ã¹ããåé¿çãããã¾ãï¼
ããã§ã®åé¡ã¯ github.event.pull_request.title
ãä¿¡é ¼ã§ããªãå
¥åã§ããã¨ããç¹ã§ãï¼ã©ã®å
¥åãä¿¡é ¼ã§ããªããã¯ï¼GitHub Security Lab ã®ããã°è¨äºã«ä¸è¦§ãããã¾ãï¼
actionlint ã§ã¯ï¼run:
ãªã©ã®ã¹ã¯ãªããã¤ã³ã¸ã§ã¯ã·ã§ã³ã®å±éºãããç®æã§ï¼ãããã®ä¿¡é ¼ã§ããªãå
¥åã ${{ }}
ã§ç´ã«ä½¿ããã¦ããªããããã§ãã¯ãã¾ãï¼
on: pull_request jobs: test: runs-on: ubuntu-latest steps: - name: Print pull request title # ERROR: ä¿¡é ¼ã§ããªãå ¥åã®ä½¿ç¨ run: echo '${{ github.event.pull_request.title }}' - uses: actions/stale@v4 with: repo-token: ${{ secrets.TOKEN }} # OK: ã¢ã¯ã·ã§ã³ã®å ¥åã¯ã¹ã¯ãªããã«ç´æ¥æ¸¡ãããªãã®ã§ä½¿ã£ã¦è¯ã stale-pr-message: ${{ github.event.pull_request.title }} was closed - uses: actions/github-script@v4 with: # ERROR: ãã®å ¥åã¯ã¹ã¯ãªããã§è©ä¾¡ããã script: console.log('${{ github.event.head_commit.author.name }}')
ãã®ãã§ãã¯ã¯ @azu ããã«æ©è½ãªã¯ã¨ã¹ããããã ãã¦å®è£ ãã¾ããï¼
-format
ãªãã·ã§ã³ã«ããæè»ãªã¨ã©ã¼åºå
Go ãã³ãã¬ã¼ãæ§æã使ã£ã¦ã¨ã©ã¼ã¡ãã»ã¼ã¸ã®åºåãã©ã¼ããããæè»ã«æå®ã§ããããã«ãã¾ããï¼æ§æãç¥ã£ã¦ãã人åãã«èª¬æããã¨ï¼.
ã¯ã¨ã©ã¼ãªãã¸ã§ã¯ãã®ã¹ã©ã¤ã¹ã«ãªã£ã¦ãã¦ï¼åã¨ã©ã¼ãªãã¸ã§ã¯ãã® .Message
ã .Line
ãã£ã¼ã«ããªã©ãå©ç¨ãã¦åºåãæ´å½¢ãã¾ãï¼
ä¾ãã°ï¼
actionlint -format '{{json .}}'
ã¨ãã㨠json
ã¢ã¯ã·ã§ã³ãéãã¦ã¨ã©ã¼ã¡ãã»ã¼ã¸ã®åã JSON æåååãã
[{"message":"unexpected key \"branch\" for ...
ã®ããã«ãªãã¸ã§ã¯ãã®é
åã§åºåããã¾ãï¼åºåã jq
ãªã©ã§æä½ããã®ã«ä¾¿å©ã§ãï¼
ã¾ãï¼ããå°ãè¤éãªä¾ã¨ãã¦ï¼
actionlint -format '{{range $err := .}}### Error at line {{$err.Line}}, col {{$err.Column}} of `{{$err.Filepath}}`\n\n{{$err.Message}}\n\n```\n{{$err.Snippet}}\n```\n\n{{end}}'
ã¨ãã㨠Markdown å½¢å¼ã§ã¨ã©ã¼ãåºåã§ã
ã®ããã«ã¨ã©ã¼ãåºåããã¾ãï¼
ããã¥ã¡ã³ãã§ã¯ ::error
ã³ãã³ãã使ã£ã¦ã¨ã©ã¼ã¢ããã¼ã·ã§ã³ãä»ããä¾ããã©ã¼ãããã®ä½¿ãæ¹ã«ã¤ãã¦ã説æãã¦ãã¾ãã®ã§ï¼è©³ããã¯ãã¡ããåç
§ãã¦ãã ããï¼
ãã®æ©è½ã¯ @ybiquitous ããã«æ©è½ãªã¯ã¨ã¹ããããã ãã¦å®è£ ãã¾ããï¼
ããã¥ã¡ã³ãã®åæ§æ
以åã¯ãã¹ã¦ã®ããã¥ã¡ã³ãããªãã¸ããªç´ä¸ã® README.md
ã«ãã¹ã¦çªã£è¾¼ãã§ããã®ã§ããï¼ãã§ãã¯é
ç®ãã»ã¯ã·ã§ã³æ°ãå¢ãã¦ãã¦é常ã«é·ããªã£ã¦ãã¾ã£ã¦ãã¾ããï¼é·ã README ã¯èªã¾ããªãã®ã§ï¼ããã¥ã¡ã³ãã®å
容ãã¨ã«ãã¡ã¤ã«ãåãã¦æ´çãã¾ããï¼
README.md
: ã¤ã³ãããã¯ã·ã§ã³ï¼ç°¡åãªãã¥ã¼ããªã¢ã«ï¼ä»ã®ããã¥ã¡ã³ãã¸ã®ãªã³ã¯ï¼ã©ã¤ã»ã³ã¹ã«ã¤ãã¦ã®ã¿è¨è¼ãã¦ãã¾ãdocs/checks.md
: actionlint ãè¡ããã¹ã¦ã®ãã§ãã¯é ç®ã®ãªã¹ãã§ãï¼ã¯ã¼ã¯ããã¼ä¾ã¨ã¨ã©ã¼åºåä¾ï¼Playground ã¸ã®ãªã³ã¯ããã§ãã¯é ç®ãã¨ã«è¨è¼ãã¦ãã¾ãdocs/install.md
: ã¤ã³ã¹ãã¼ã«æ¹æ³ã§ãï¼ãã«ãæ¸ã¿ãã¤ããªï¼Homebrewï¼ãã¦ã³ãã¼ãã¹ã¯ãªããï¼go install
ã«ããã½ã¼ã¹ããã®ãã«ãã®ããããã«ã¤ãã¦èª¬æãã¦ãã¾ãdocs/usage.md
:actionlint
ã³ãã³ãã®ä½¿ãæ¹ï¼ç¹å®ã®ã¨ã©ã¼ãç¡è¦ããæ¹æ³ï¼-format
ãªãã·ã§ã³ã®ä½¿ãæ¹ï¼exit status ã®æå³ãªã©ï¼ï¼Playground ã®ä½¿ãæ¹ã«ã¤ãã¦èª¬æãã¦ãã¾ãï¼ã¾ãï¼reviewdog, Problem Matchers, super-linter ã¨ã®é£æºã«ã¤ãã¦ã解説ãã¦ãã¾ãdocs/config.md
: ã³ã³ãã£ã°ãã¡ã¤ã«ã®ä½¿ãæ¹ã«ã¤ãã¦èª¬æãã¦ãã¾ãdoc/api.md
: actionlint ã Go ã®ã©ã¤ãã©ãªã¨ãã¦ä½¿ãæ¹æ³ã«ã¤ãã¦è§£èª¬ãã¦ãã¾ãdoc/reference.md
: å種ãªã½ã¼ã¹ã¸ã®ãªã³ã¯éã§ã
Windows ã§ã«ã¬ã³ããã£ã¬ã¯ããªã®å®è¡ãã¡ã¤ã«ãæå³ããå®è¡ã§ãã¦ãã¾ãèå¼±æ§ã¸ã®å¯¾å¦
Windows ã§ã¯ foo
ã¨ããããã«çµ¶å¯¾ãã¹ã§ã¯ãªãã³ãã³ããå®è¡ããã¨ï¼ã«ã¬ã³ããã£ã¬ã¯ããªã«ãã foo.exe
ãå®è¡ã§ãã¦ãã¾ãã¨ããæåãããã¾ãï¼Go ã® exec.LookPath("foo")
ã§ãã«ã¬ã³ããã£ã¬ã¯ããªã® foo.exe
ãè¿ãã¦ãã¾ãã¾ãï¼
actionlint ã§ã shellcheck
ã³ãã³ãã pyflakes
ã³ãã³ãã®ãã¹ãåå¾ããã®ã« exec.LookPath
ã使ã£ã¦ããã®ã§ï¼ã«ã¬ã³ããã£ã¬ã¯ããªã« shellcheck.exe
ã pyflakes.exe
ãããã¨ãã¡ããæå³ããå®è¡ãã¦ãã¾ãåé¡ãããã¾ããï¼ç¾å¨ã¯ execabs ã使ããã¨ã§ãã®åé¡ãä¿®æ£æ¸ã¿ã§ãï¼
Playground ã®æ©è½è¿½å
https://rhysd.github.io/actionlint/
actionlint ã Wasm ã«ãã«ããããã¨ã§ãã©ã¦ã¶ä¸ã§ãåãããã«ãã Playground ã§ããï¼ããæ軽ã«ä½¿ãã¦å ±æã§ããããã«ããã¤ãæ¹åãè¡ãã¾ããï¼
- 'Permalink' ãã¿ã³ãè¨ç½®ãã¾ããï¼ãããã¯ãªãã¯ããã¨ä»ã®ã³ã¼ãã¨ãã£ã¿ã®ã½ã¼ã¹ã®ç¶æ ã URL ã®ããã·ã¥ã«ã¨ã³ã³ã¼ããããã¨ã§æ°¸ç¶åãã¾ãï¼ãã°å ±åæã« Playground ã§åç¾ããã¦ãã®ãã¼ã ãªã³ã¯ãæä¾ãã¦ããããã¨å©ãããªã¨æã£ã¦å®è£ ãã¦ãã¾ãï¼
- URL ã®å
¥åãã©ã¼ã ãè¨ç½®ãã¾ããï¼URL ãå
¥åãã¦ãã Check ãã¿ã³ãæ¼ãã¨ï¼URL å
ã®ãã¡ã¤ã«ããã§ãããã¦ãã¾ãï¼ãã¡ããã§ãã GitHub Pages ãããã§ããã§ãã URL ã®ã¿ä½¿ãã¾ãï¼
https://github.com/owner/repo/tree/branch/...
: GitHub ä¸ã®ç¹å®ã®ãã¡ã¤ã«ããã©ã¦ã¶ã§è¡¨ç¤ºãããæã® URLhttps://raw.githubusercontent.com/owner/repo/branch/...
: GitHub ä¸ã§ãã¹ãããã¦ããçã®ãã¡ã¤ã«ã® URLhttps://gist.github.com/owner/...
: Gist ä¸ã®ç¹å®ã®ãã¡ã¤ã«ããã©ã¦ã¶ã§è¡¨ç¤ºãããæã® URLhttps://gist.githubusercontent.com/owner/...
: Gist ä¸ã§ãã¹ãããã¦ããçã®ãã¡ã¤ã«ã® URL
ã¾ã¨ã
ååã®è¨äºä»¥éãç¶ç¶ãã¦æ¹åã»æ©è½è¿½å ãè¡ã£ã¦ããã¾ããï¼ãããããã°è©¦ãã«ä½¿ã£ã¦ã¿ã¦ï¼ä½ãæ¹åç¹ã»åé¡ç¹ãªã©ããã° issue ã§æãã¦ããããã¨ãããããã§ãï¼æ¥æ¬èªã§ãè±èªã§ã大æè¿ã§ãï¼ï¼