mirror of
https://github.com/shimataro/ssh-key-action.git
synced 2025-06-19 22:52:10 +10:00
commit
5bd2f032f1
32 changed files with 6152 additions and 0 deletions
37
.editorconfig
Normal file
37
.editorconfig
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# http://editorconfig.org/
|
||||||
|
# https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties
|
||||||
|
root = true
|
||||||
|
|
||||||
|
|
||||||
|
# recommended settings; DO NOT CHANGE!
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
|
||||||
|
# common settings
|
||||||
|
[*]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 4
|
||||||
|
max_line_length = off
|
||||||
|
|
||||||
|
quote_type = double
|
||||||
|
curly_bracket_next_line = true
|
||||||
|
spaces_around_operators = true
|
||||||
|
spaces_around_brackets = none
|
||||||
|
indent_brace_style = allman
|
||||||
|
|
||||||
|
|
||||||
|
# JSON/YAML
|
||||||
|
[*.{json,babelrc,code-workspace,yml,yaml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
tab_width = 2
|
||||||
|
|
||||||
|
|
||||||
|
# markdown
|
||||||
|
[*.md]
|
||||||
|
indent_style = space
|
305
.eslintrc.yml
Normal file
305
.eslintrc.yml
Normal file
|
@ -0,0 +1,305 @@
|
||||||
|
# https://eslint.org/
|
||||||
|
env: # https://eslint.org/docs/user-guide/configuring#specifying-environments
|
||||||
|
es6: true
|
||||||
|
node: true
|
||||||
|
extends:
|
||||||
|
- eslint:recommended
|
||||||
|
- plugin:@typescript-eslint/eslint-recommended
|
||||||
|
- plugin:@typescript-eslint/recommended
|
||||||
|
plugins:
|
||||||
|
- import
|
||||||
|
- "@typescript-eslint"
|
||||||
|
parser: "@typescript-eslint/parser"
|
||||||
|
parserOptions:
|
||||||
|
sourceType: module
|
||||||
|
project: ./tsconfig.json
|
||||||
|
rules: # https://eslint.org/docs/rules/
|
||||||
|
accessor-pairs: error
|
||||||
|
array-bracket-newline: error
|
||||||
|
array-bracket-spacing:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
array-callback-return: error
|
||||||
|
arrow-body-style: 'off'
|
||||||
|
arrow-parens:
|
||||||
|
- error
|
||||||
|
- always
|
||||||
|
arrow-spacing:
|
||||||
|
- error
|
||||||
|
- after: true
|
||||||
|
before: true
|
||||||
|
block-scoped-var: error
|
||||||
|
block-spacing: error
|
||||||
|
brace-style:
|
||||||
|
- error
|
||||||
|
- allman
|
||||||
|
callback-return: error
|
||||||
|
capitalized-comments: 'off'
|
||||||
|
class-methods-use-this: error
|
||||||
|
comma-dangle:
|
||||||
|
- error
|
||||||
|
- always-multiline
|
||||||
|
comma-spacing:
|
||||||
|
- error
|
||||||
|
- after: true
|
||||||
|
before: false
|
||||||
|
comma-style:
|
||||||
|
- error
|
||||||
|
- last
|
||||||
|
complexity:
|
||||||
|
- error
|
||||||
|
computed-property-spacing:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
consistent-return: 'off'
|
||||||
|
consistent-this: error
|
||||||
|
curly: error
|
||||||
|
default-case: 'off'
|
||||||
|
dot-location:
|
||||||
|
- error
|
||||||
|
- property
|
||||||
|
dot-notation:
|
||||||
|
- error
|
||||||
|
- allowKeywords: true
|
||||||
|
eol-last: error
|
||||||
|
eqeqeq: error
|
||||||
|
for-direction: error
|
||||||
|
func-call-spacing: error
|
||||||
|
func-name-matching: error
|
||||||
|
func-names:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
func-style:
|
||||||
|
- error
|
||||||
|
- declaration
|
||||||
|
function-paren-newline: error
|
||||||
|
generator-star-spacing: error
|
||||||
|
getter-return: error
|
||||||
|
global-require: error
|
||||||
|
guard-for-in: error
|
||||||
|
handle-callback-err: error
|
||||||
|
id-blacklist: error
|
||||||
|
id-length: 'off'
|
||||||
|
id-match: error
|
||||||
|
implicit-arrow-linebreak:
|
||||||
|
- error
|
||||||
|
- below
|
||||||
|
indent:
|
||||||
|
- error
|
||||||
|
- tab
|
||||||
|
indent-legacy: 'off'
|
||||||
|
init-declarations: error
|
||||||
|
jsx-quotes: error
|
||||||
|
key-spacing: error
|
||||||
|
keyword-spacing:
|
||||||
|
- error
|
||||||
|
- overrides:
|
||||||
|
if:
|
||||||
|
after: false
|
||||||
|
for:
|
||||||
|
after: false
|
||||||
|
while:
|
||||||
|
after: false
|
||||||
|
catch:
|
||||||
|
after: false
|
||||||
|
with:
|
||||||
|
after: false
|
||||||
|
line-comment-position: 'off'
|
||||||
|
linebreak-style:
|
||||||
|
- error
|
||||||
|
- unix
|
||||||
|
lines-around-comment: 'off'
|
||||||
|
lines-around-directive: error
|
||||||
|
lines-between-class-members:
|
||||||
|
- error
|
||||||
|
- always
|
||||||
|
max-depth: error
|
||||||
|
max-len: 'off'
|
||||||
|
max-lines: 'off'
|
||||||
|
max-nested-callbacks: error
|
||||||
|
max-params: 'off'
|
||||||
|
max-statements: 'off'
|
||||||
|
max-statements-per-line: error
|
||||||
|
multiline-comment-style:
|
||||||
|
- error
|
||||||
|
- separate-lines
|
||||||
|
multiline-ternary: error
|
||||||
|
new-cap: error
|
||||||
|
new-parens: error
|
||||||
|
newline-after-var: 'off'
|
||||||
|
newline-before-return: 'off'
|
||||||
|
no-alert: error
|
||||||
|
no-array-constructor: error
|
||||||
|
no-await-in-loop: error
|
||||||
|
no-bitwise: error
|
||||||
|
no-buffer-constructor: error
|
||||||
|
no-caller: error
|
||||||
|
no-catch-shadow: error
|
||||||
|
no-confusing-arrow: error
|
||||||
|
no-continue: 'off'
|
||||||
|
no-div-regex: error
|
||||||
|
no-duplicate-imports: error
|
||||||
|
no-else-return: 'off'
|
||||||
|
no-empty-function: 'off'
|
||||||
|
no-eq-null: error
|
||||||
|
no-eval: error
|
||||||
|
no-extend-native: error
|
||||||
|
no-extra-bind: error
|
||||||
|
no-extra-label: error
|
||||||
|
no-extra-parens: error
|
||||||
|
no-floating-decimal: error
|
||||||
|
no-implicit-coercion: error
|
||||||
|
no-implicit-globals: error
|
||||||
|
no-implied-eval: error
|
||||||
|
no-inline-comments: 'off'
|
||||||
|
no-invalid-this: error
|
||||||
|
no-iterator: error
|
||||||
|
no-label-var: error
|
||||||
|
no-labels: error
|
||||||
|
no-lonely-if: error
|
||||||
|
no-loop-func: error
|
||||||
|
no-magic-numbers: 'off'
|
||||||
|
no-mixed-operators: error
|
||||||
|
no-mixed-requires: error
|
||||||
|
no-multi-assign: error
|
||||||
|
no-multi-spaces: error
|
||||||
|
no-multi-str: error
|
||||||
|
no-multiple-empty-lines:
|
||||||
|
- error
|
||||||
|
- max: 1
|
||||||
|
no-native-reassign: error
|
||||||
|
no-negated-condition: error
|
||||||
|
no-negated-in-lhs: error
|
||||||
|
no-nested-ternary: error
|
||||||
|
no-new: error
|
||||||
|
no-new-func: error
|
||||||
|
no-new-object: error
|
||||||
|
no-new-require: error
|
||||||
|
no-new-wrappers: error
|
||||||
|
no-octal-escape: error
|
||||||
|
no-param-reassign: 'off'
|
||||||
|
no-path-concat: error
|
||||||
|
no-plusplus: 'off'
|
||||||
|
no-process-env: 'off'
|
||||||
|
no-process-exit: error
|
||||||
|
no-proto: error
|
||||||
|
no-prototype-builtins: 'off'
|
||||||
|
no-restricted-globals: error
|
||||||
|
no-restricted-imports: error
|
||||||
|
no-restricted-modules: error
|
||||||
|
no-restricted-properties: error
|
||||||
|
no-restricted-syntax: error
|
||||||
|
no-return-assign: error
|
||||||
|
no-return-await: error
|
||||||
|
no-script-url: error
|
||||||
|
no-self-compare: error
|
||||||
|
no-sequences: error
|
||||||
|
no-shadow: error
|
||||||
|
no-shadow-restricted-names: error
|
||||||
|
no-spaced-func: error
|
||||||
|
no-sync: 'off'
|
||||||
|
no-tabs: 'off'
|
||||||
|
no-template-curly-in-string: error
|
||||||
|
no-ternary: error
|
||||||
|
no-throw-literal: error
|
||||||
|
no-trailing-spaces: error
|
||||||
|
no-undef-init: error
|
||||||
|
no-undefined: 'off'
|
||||||
|
no-underscore-dangle: 'off'
|
||||||
|
no-unmodified-loop-condition: error
|
||||||
|
no-unneeded-ternary: error
|
||||||
|
no-unused-expressions: error
|
||||||
|
no-use-before-define: 'off'
|
||||||
|
no-useless-call: error
|
||||||
|
no-useless-computed-key: error
|
||||||
|
no-useless-concat: error
|
||||||
|
no-useless-constructor: error
|
||||||
|
no-useless-rename: error
|
||||||
|
no-useless-return: error
|
||||||
|
no-var: error
|
||||||
|
no-void: error
|
||||||
|
no-warning-comments: error
|
||||||
|
no-whitespace-before-property: error
|
||||||
|
no-with: error
|
||||||
|
nonblock-statement-body-position: error
|
||||||
|
object-curly-newline: 'off'
|
||||||
|
object-curly-spacing:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
object-property-newline: error
|
||||||
|
object-shorthand: 'off'
|
||||||
|
one-var: 'off'
|
||||||
|
one-var-declaration-per-line: error
|
||||||
|
operator-assignment: error
|
||||||
|
operator-linebreak: error
|
||||||
|
padded-blocks: 'off'
|
||||||
|
padding-line-between-statements: error
|
||||||
|
prefer-arrow-callback: error
|
||||||
|
prefer-const: error
|
||||||
|
prefer-destructuring: error
|
||||||
|
prefer-numeric-literals: error
|
||||||
|
prefer-promise-reject-errors: error
|
||||||
|
prefer-reflect: error
|
||||||
|
prefer-rest-params: error
|
||||||
|
prefer-spread: error
|
||||||
|
prefer-template: error
|
||||||
|
quote-props: 'off'
|
||||||
|
quotes: 'off'
|
||||||
|
radix: error
|
||||||
|
require-await: error
|
||||||
|
require-jsdoc: error
|
||||||
|
rest-spread-spacing:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
semi: error
|
||||||
|
semi-spacing: error
|
||||||
|
semi-style:
|
||||||
|
- error
|
||||||
|
- last
|
||||||
|
sort-imports: 'off'
|
||||||
|
sort-keys: 'off'
|
||||||
|
sort-vars: error
|
||||||
|
space-before-blocks: error
|
||||||
|
space-before-function-paren: 'off'
|
||||||
|
space-in-parens:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
space-infix-ops: error
|
||||||
|
space-unary-ops: error
|
||||||
|
spaced-comment:
|
||||||
|
- error
|
||||||
|
- always
|
||||||
|
strict: error
|
||||||
|
switch-colon-spacing: error
|
||||||
|
symbol-description: error
|
||||||
|
template-curly-spacing:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
template-tag-spacing: error
|
||||||
|
unicode-bom:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
valid-jsdoc:
|
||||||
|
- error
|
||||||
|
- requireParamType: false
|
||||||
|
requireReturn: false
|
||||||
|
requireReturnType: false
|
||||||
|
vars-on-top: error
|
||||||
|
wrap-iife: error
|
||||||
|
wrap-regex: error
|
||||||
|
yield-star-spacing: error
|
||||||
|
yoda:
|
||||||
|
- error
|
||||||
|
- never
|
||||||
|
|
||||||
|
# import plugin
|
||||||
|
import/extensions: 'off'
|
||||||
|
import/no-unresolved:
|
||||||
|
- error
|
||||||
|
|
||||||
|
# @typescript-eslint plugin
|
||||||
|
"@typescript-eslint/explicit-function-return-type": 'off'
|
||||||
|
"@typescript-eslint/no-use-before-define":
|
||||||
|
- error
|
||||||
|
- functions: false
|
||||||
|
"@typescript-eslint/strict-boolean-expressions": error
|
32
.github/workflows/build.yml
vendored
Normal file
32
.github/workflows/build.yml
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
|
||||||
|
|
||||||
|
on: push
|
||||||
|
name: Build
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build on ${{ matrix.os }} / Node.js v${{ matrix.nodejs }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- Windows-latest
|
||||||
|
- macOS-latest
|
||||||
|
- Ubuntu-latest
|
||||||
|
nodejs:
|
||||||
|
- 12
|
||||||
|
fail-fast: false
|
||||||
|
steps:
|
||||||
|
- name: Turn off auto-crlf
|
||||||
|
run: git config --global core.autocrlf false
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.nodejs }}
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
- name: Build
|
||||||
|
run: npm run build
|
||||||
|
- name: Verify
|
||||||
|
run: npm run verify
|
41
.github/workflows/verify-on-macos.yml
vendored
Normal file
41
.github/workflows/verify-on-macos.yml
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
|
||||||
|
|
||||||
|
on: push
|
||||||
|
name: macOS
|
||||||
|
jobs:
|
||||||
|
ssh:
|
||||||
|
name: Connect to github.com
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
- name: print created files
|
||||||
|
run: ls -l ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone git@github.com:shimataro/ssh-key-action.git tmp
|
||||||
|
ssh-with-name:
|
||||||
|
name: Connect to github.com with name and config
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
name: ssh_key_name # optional
|
||||||
|
config: | # optional
|
||||||
|
Host github
|
||||||
|
Hostname github.com
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/ssh_key_name
|
||||||
|
- name: print created files
|
||||||
|
run: ls -l ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone github:shimataro/ssh-key-action.git tmp
|
41
.github/workflows/verify-on-ubuntu.yml
vendored
Normal file
41
.github/workflows/verify-on-ubuntu.yml
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
|
||||||
|
|
||||||
|
on: push
|
||||||
|
name: Ubuntu
|
||||||
|
jobs:
|
||||||
|
ssh:
|
||||||
|
name: Connect to github.com
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
- name: print created files
|
||||||
|
run: ls -l ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone git@github.com:shimataro/ssh-key-action.git tmp
|
||||||
|
ssh-with-name:
|
||||||
|
name: Connect to github.com with name and config
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
name: ssh_key_name # optional
|
||||||
|
config: | # optional
|
||||||
|
Host github
|
||||||
|
Hostname github.com
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/ssh_key_name
|
||||||
|
- name: print created files
|
||||||
|
run: ls -l ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone github:shimataro/ssh-key-action.git tmp
|
41
.github/workflows/verify-on-ubuntu1604.yml
vendored
Normal file
41
.github/workflows/verify-on-ubuntu1604.yml
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
|
||||||
|
|
||||||
|
on: push
|
||||||
|
name: Ubuntu 16.04
|
||||||
|
jobs:
|
||||||
|
ssh:
|
||||||
|
name: Connect to github.com
|
||||||
|
runs-on: ubuntu-16.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
- name: print created files
|
||||||
|
run: ls -l ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone git@github.com:shimataro/ssh-key-action.git tmp
|
||||||
|
ssh-with-name:
|
||||||
|
name: Connect to github.com with name and config
|
||||||
|
runs-on: ubuntu-16.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
name: ssh_key_name # optional
|
||||||
|
config: | # optional
|
||||||
|
Host github
|
||||||
|
Hostname github.com
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/ssh_key_name
|
||||||
|
- name: print created files
|
||||||
|
run: ls -l ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone github:shimataro/ssh-key-action.git tmp
|
41
.github/workflows/verify-on-windows.yml
vendored
Normal file
41
.github/workflows/verify-on-windows.yml
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
|
||||||
|
|
||||||
|
on: push
|
||||||
|
name: Windows
|
||||||
|
jobs:
|
||||||
|
ssh:
|
||||||
|
name: Connect to github.com
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
- name: print created files
|
||||||
|
run: ls ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone git@github.com:shimataro/ssh-key-action.git tmp
|
||||||
|
ssh-with-name:
|
||||||
|
name: Connect to github.com with name and config
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source codes
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: ./.
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
name: ssh_key_name # optional
|
||||||
|
config: | # optional
|
||||||
|
Host github
|
||||||
|
Hostname github.com
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/ssh_key_name
|
||||||
|
- name: print created files
|
||||||
|
run: ls ~/.ssh
|
||||||
|
- name: git clone through SSH
|
||||||
|
run: git clone github:shimataro/ssh-key-action.git tmp
|
14
.gitignore
vendored
Normal file
14
.gitignore
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# temporary files
|
||||||
|
*~
|
||||||
|
*.bak
|
||||||
|
*.log
|
||||||
|
*.swp
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# image caches
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# patch/merge
|
||||||
|
*.orig
|
||||||
|
*.rej
|
7
.markdownlint.yml
Normal file
7
.markdownlint.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
MD007:
|
||||||
|
indent: 4
|
||||||
|
MD013:
|
||||||
|
line_length: 255
|
||||||
|
MD024:
|
||||||
|
siblings_only: true
|
||||||
|
MD026: false
|
4
.npmrc
Normal file
4
.npmrc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#also=dev
|
||||||
|
engine-strict=true
|
||||||
|
heading="🍣"
|
||||||
|
save-prefix=""
|
107
CHANGELOG.md
Normal file
107
CHANGELOG.md
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2.0.0] - 2020-02-08
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* rename `private-key` to `key`
|
||||||
|
* rename `known-hosts` to `known_hosts`
|
||||||
|
* make `known_hosts` required
|
||||||
|
|
||||||
|
## [1.6.5] - 2020-02-08
|
||||||
|
|
||||||
|
### Others
|
||||||
|
|
||||||
|
* update version of [Checkout](https://github.com/marketplace/actions/checkout) action
|
||||||
|
|
||||||
|
## [1.6.4] - 2020-01-27
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
* `node_modules/.bin` error (thanks [@george3447](https://github.com/george3447))
|
||||||
|
|
||||||
|
## [1.6.3] - 2020-01-27
|
||||||
|
|
||||||
|
### Others
|
||||||
|
|
||||||
|
* add Q&A
|
||||||
|
|
||||||
|
## [1.6.2] - 2020-01-25
|
||||||
|
|
||||||
|
### Others
|
||||||
|
|
||||||
|
* some updates
|
||||||
|
|
||||||
|
## [1.6.1] - 2020-01-19
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
* Some bugfixes
|
||||||
|
|
||||||
|
## [1.6.0] - 2020-01-18
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* `public-key` is no longer necessarily
|
||||||
|
|
||||||
|
## [1.5.0] - 2019/12/30
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* Append contents of `config` and `known_hosts` when called multiple times.
|
||||||
|
|
||||||
|
## [1.4.0] - 2019/12/22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* `config` option
|
||||||
|
|
||||||
|
## [1.3.0] - 2019/09/29
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* `known-hosts` option
|
||||||
|
|
||||||
|
## [1.2.0] - 2019/09/22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
* CI trigger
|
||||||
|
* example code in [README](README.md)
|
||||||
|
|
||||||
|
### Others
|
||||||
|
|
||||||
|
* Install only `dependencies` packages.
|
||||||
|
|
||||||
|
## [1.1.0] - 2019/09/19
|
||||||
|
|
||||||
|
### Others
|
||||||
|
|
||||||
|
* Support Visual Studio Code officially.
|
||||||
|
* Use GitHub Actions for build test.
|
||||||
|
|
||||||
|
## [1.0.0] - 2019/09/18
|
||||||
|
|
||||||
|
* First release.
|
||||||
|
|
||||||
|
[Unreleased]: https://github.com/shimataro/ssh-key-action/compare/v2.0.0...HEAD
|
||||||
|
[2.0.0]: https://github.com/shimataro/ssh-key-action/compare/v1.6.5...v2.0.0
|
||||||
|
[1.6.5]: https://github.com/shimataro/ssh-key-action/compare/v1.6.4...v1.6.5
|
||||||
|
[1.6.4]: https://github.com/shimataro/ssh-key-action/compare/v1.6.3...v1.6.4
|
||||||
|
[1.6.3]: https://github.com/shimataro/ssh-key-action/compare/v1.6.2...v1.6.3
|
||||||
|
[1.6.2]: https://github.com/shimataro/ssh-key-action/compare/v1.6.1...v1.6.2
|
||||||
|
[1.6.1]: https://github.com/shimataro/ssh-key-action/compare/v1.6.0...v1.6.1
|
||||||
|
[1.6.0]: https://github.com/shimataro/ssh-key-action/compare/v1.5.0...v1.6.0
|
||||||
|
[1.5.0]: https://github.com/shimataro/ssh-key-action/compare/v1.4.0...v1.5.0
|
||||||
|
[1.4.0]: https://github.com/shimataro/ssh-key-action/compare/v1.3.0...v1.4.0
|
||||||
|
[1.3.0]: https://github.com/shimataro/ssh-key-action/compare/v1.2.0...v1.3.0
|
||||||
|
[1.2.0]: https://github.com/shimataro/ssh-key-action/compare/v1.1.0...v1.2.0
|
||||||
|
[1.1.0]: https://github.com/shimataro/ssh-key-action/compare/v1.0.0...v1.1.0
|
||||||
|
[1.0.0]: https://github.com/shimataro/ssh-key-action/compare/8deacc95b1ee5732107e56baa4c8aac4c386ef7e...v1.0.0
|
141
README.md
Normal file
141
README.md
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
# Install SSH Key
|
||||||
|
|
||||||
|
[![Build][image-build]][link-build]
|
||||||
|
[![Windows][image-verify-windows]][link-verify-windows]
|
||||||
|
[![macOS][image-verify-macos]][link-verify-macos]
|
||||||
|
[![Ubuntu][image-verify-ubuntu]][link-verify-ubuntu]
|
||||||
|
[![Ubuntu 16.04][image-verify-ubuntu1604]][link-verify-ubuntu1604]
|
||||||
|
[![Release][image-release]][link-release]
|
||||||
|
[![License][image-license]][link-license]
|
||||||
|
[![Stars][image-stars]][link-stars]
|
||||||
|
|
||||||
|
This action installs SSH key in `~/.ssh`.
|
||||||
|
|
||||||
|
Useful for SCP, SFTP, and `rsync` over SSH in deployment script.
|
||||||
|
|
||||||
|
**Works on all [virtual environment](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners#supported-runners-and-hardware-resources) -- Windows, macOS, Ubuntu and Ubuntu 16.04.**
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Add your SSH key to your product secrets by clicking `Settings` - `Secrets` - `Add a new secret` beforehand.
|
||||||
|
|
||||||
|
**NOTE:** OPENSSH format (key begins with `-----BEGIN OPENSSH PRIVATE KEY-----`) may not work due to OpenSSH version on VM. Please use PEM format (begins with `-----BEGIN RSA PRIVATE KEY-----`) instead.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Install SSH key
|
||||||
|
uses: shimataro/ssh-key-action@v2
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
name: id_rsa # optional
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
config: ${{ secrets.CONFIG }} # ssh_config; optional
|
||||||
|
- name: rsync over ssh
|
||||||
|
run: rsync ./foo/ user@remote:bar/
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Workflow syntax for GitHub Actions](https://help.github.com/en/articles/workflow-syntax-for-github-actions) for details.
|
||||||
|
|
||||||
|
### Install multiple keys
|
||||||
|
|
||||||
|
If you want to install multiple keys, call this action multiple times.
|
||||||
|
It is useful for port forwarding.
|
||||||
|
|
||||||
|
**NOTE:** When this action is called multiple times, **the contents of `known_hosts` and `config` will be appended**. `key` must be saved as different name, by using `name` option.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Install SSH key of bastion
|
||||||
|
uses: shimataro/ssh-key-action@v2
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY_OF_BASTION }}
|
||||||
|
name: id_rsa-bastion
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS_OF_BASTION }}
|
||||||
|
config: |
|
||||||
|
Host bastion
|
||||||
|
HostName xxx.xxx.xxx.xxx
|
||||||
|
User user-of-bastion
|
||||||
|
IdentityFile ~/.ssh/id_rsa-bastion
|
||||||
|
- name: Install SSH key of target
|
||||||
|
uses: shimataro/ssh-key-action@v2
|
||||||
|
with:
|
||||||
|
key: ${{ secrets.SSH_KEY_OF_TARGET }}
|
||||||
|
name: id_rsa-target
|
||||||
|
known_hosts: ${{ secrets.KNOWN_HOSTS_OF_TARGET }} # will be appended!
|
||||||
|
config: | # will be appended!
|
||||||
|
Host target
|
||||||
|
HostName yyy.yyy.yyy.yyy
|
||||||
|
User user-of-target
|
||||||
|
IdentityFile ~/.ssh/id_rsa-target
|
||||||
|
ProxyCommand ssh -W %h:%p bastion
|
||||||
|
- name: SCP via port-forwarding
|
||||||
|
run: scp ./foo/ target:bar/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Q&A
|
||||||
|
|
||||||
|
### SSH failed even though key has been installed.
|
||||||
|
|
||||||
|
Check belows:
|
||||||
|
|
||||||
|
* `Load key "/HOME/.ssh/id_rsa": invalid format`:
|
||||||
|
* OPENSSH format (key begins with `-----BEGIN OPENSSH PRIVATE KEY-----`) may not work.
|
||||||
|
* Use PEM format (begins with `-----BEGIN RSA PRIVATE KEY-----`).
|
||||||
|
* `Host key verification failed.`:
|
||||||
|
* Set `known_hosts` option correctly (use `ssh-keyscan` command).
|
||||||
|
|
||||||
|
### How do I use encrypted SSH key?
|
||||||
|
|
||||||
|
This action doesn't support encrypted key directly.
|
||||||
|
Here are some solutions:
|
||||||
|
|
||||||
|
* decrypting key beforehand: best bet, and works on any VM
|
||||||
|
* `sshpass` command: next best bet, but not supported on Windows
|
||||||
|
* `expect` command: be careful not to expose passphrase to console
|
||||||
|
* `SSH_ASKPASS` environment variable: might be troublesome
|
||||||
|
|
||||||
|
### Which one is the best way for transferring files, "direct SCP/SFTP/rsync" or "SCP/SFTP/rsync via bastion"?
|
||||||
|
|
||||||
|
I recommend **rsync via bastion**.
|
||||||
|
It has some advantages over other methods:
|
||||||
|
|
||||||
|
* "Rsync via bastion" doesn't require to update workflow files and `secrets` even if it is necessary to transfer files to multiple servers.
|
||||||
|
* Other methods require to update `known_hosts` if servers have changed.
|
||||||
|
* Rsync:
|
||||||
|
* is fastest of all.
|
||||||
|
* does **NOT** break files even if disconnected during transferring.
|
||||||
|
* can remove files that don't exist on server.
|
||||||
|
* SCP is [deprecated by OpenSSH](https://www.openssh.com/txt/release-8.0) due to outdated and inflexible protocol.
|
||||||
|
* Using bastion is more secure because:
|
||||||
|
* it is not necessarily to expose SSH port on servers to public.
|
||||||
|
* Address filtering is less effective.
|
||||||
|
* Because Azure address range is [very wide](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners#ip-addresses-of-github-hosted-runners).
|
||||||
|
* And will be updated continuously.
|
||||||
|
* if security incident ―e.g., private key leaked― occurs, it's OK just to remove `authorized_keys` on bastion.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The scripts and documentation in this project are released under the [MIT License](LICENSE)
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
See [CHANGELOG.md](CHANGELOG.md).
|
||||||
|
|
||||||
|
[image-build]: https://github.com/shimataro/ssh-key-action/workflows/Build/badge.svg?event=push&branch=v2
|
||||||
|
[link-build]: https://github.com/shimataro/ssh-key-action/actions?query=workflow%3ABuild
|
||||||
|
[image-verify-windows]: https://github.com/shimataro/ssh-key-action/workflows/Windows/badge.svg?event=push&branch=v2
|
||||||
|
[link-verify-windows]: https://github.com/shimataro/ssh-key-action/actions?query=workflow%3AWindows
|
||||||
|
[image-verify-macos]: https://github.com/shimataro/ssh-key-action/workflows/macOS/badge.svg?event=push&branch=v2
|
||||||
|
[link-verify-macos]: https://github.com/shimataro/ssh-key-action/actions?query=workflow%3AmacOS
|
||||||
|
[image-verify-ubuntu]: https://github.com/shimataro/ssh-key-action/workflows/Ubuntu/badge.svg?event=push&branch=v2
|
||||||
|
[link-verify-ubuntu]: https://github.com/shimataro/ssh-key-action/actions?query=workflow%3AUbuntu
|
||||||
|
[image-verify-ubuntu1604]: https://github.com/shimataro/ssh-key-action/workflows/Ubuntu%2016.04/badge.svg?event=push&branch=v2
|
||||||
|
[link-verify-ubuntu1604]: https://github.com/shimataro/ssh-key-action/actions?query=workflow%3A%22Ubuntu+16.04%22
|
||||||
|
[image-release]: https://img.shields.io/github/release/shimataro/ssh-key-action.svg
|
||||||
|
[link-release]: https://github.com/shimataro/ssh-key-action/releases
|
||||||
|
[image-license]: https://img.shields.io/github/license/shimataro/ssh-key-action.svg
|
||||||
|
[link-license]: ./LICENSE
|
||||||
|
[image-stars]: https://img.shields.io/github/stars/shimataro/ssh-key-action.svg
|
||||||
|
[link-stars]: https://github.com/shimataro/ssh-key-action/stargazers
|
26
action.yml
Normal file
26
action.yml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# https://help.github.com/en/articles/metadata-syntax-for-github-actions
|
||||||
|
name: "Install SSH Key"
|
||||||
|
description: "Install SSH key in ~/.ssh"
|
||||||
|
author: "shimataro"
|
||||||
|
branding:
|
||||||
|
icon: "terminal"
|
||||||
|
color: "gray-dark"
|
||||||
|
inputs:
|
||||||
|
key:
|
||||||
|
description: "SSH private key"
|
||||||
|
required: true
|
||||||
|
name:
|
||||||
|
description: "SSH key file name (default: id_rsa)"
|
||||||
|
required: false
|
||||||
|
default: "id_rsa"
|
||||||
|
known_hosts:
|
||||||
|
description: "public keys of SSH servers"
|
||||||
|
required: true
|
||||||
|
default: ""
|
||||||
|
config:
|
||||||
|
description: "SSH config"
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
runs:
|
||||||
|
using: "node12"
|
||||||
|
main: "lib/main.js"
|
106
lib/main.js
Normal file
106
lib/main.js
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
"use strict";
|
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
};
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
|
result["default"] = mod;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const fs_1 = __importDefault(require("fs"));
|
||||||
|
const path_1 = __importDefault(require("path"));
|
||||||
|
const core = __importStar(require("@actions/core"));
|
||||||
|
/**
|
||||||
|
* main function
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
try {
|
||||||
|
const files = [
|
||||||
|
{
|
||||||
|
name: core.getInput("name"),
|
||||||
|
contents: core.getInput("key", {
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
options: {
|
||||||
|
mode: 0o400,
|
||||||
|
flag: "ax",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "known_hosts",
|
||||||
|
contents: prependLf(core.getInput("known_hosts", {
|
||||||
|
required: true,
|
||||||
|
})),
|
||||||
|
options: {
|
||||||
|
mode: 0o644,
|
||||||
|
flag: "a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "config",
|
||||||
|
contents: prependLf(core.getInput("config")),
|
||||||
|
options: {
|
||||||
|
mode: 0o644,
|
||||||
|
flag: "a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
// create ".ssh" directory
|
||||||
|
const home = getHomeDirectory();
|
||||||
|
const dirName = path_1.default.resolve(home, ".ssh");
|
||||||
|
fs_1.default.mkdirSync(dirName, {
|
||||||
|
recursive: true,
|
||||||
|
mode: 0o700,
|
||||||
|
});
|
||||||
|
// create files
|
||||||
|
for (const file of files) {
|
||||||
|
const fileName = path_1.default.join(dirName, file.name);
|
||||||
|
fs_1.default.writeFileSync(fileName, file.contents, file.options);
|
||||||
|
}
|
||||||
|
console.log(`SSH key has been stored to ${dirName} successfully.`);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
core.setFailed(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* get home directory
|
||||||
|
* @returns home directory
|
||||||
|
*/
|
||||||
|
function getHomeDirectory() {
|
||||||
|
const homeEnv = getHomeEnv();
|
||||||
|
const home = process.env[homeEnv];
|
||||||
|
if (home === undefined) {
|
||||||
|
throw Error(`${homeEnv} is not defined`);
|
||||||
|
}
|
||||||
|
return home;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* get HOME environment name
|
||||||
|
* @returns HOME environment name
|
||||||
|
*/
|
||||||
|
function getHomeEnv() {
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
// Windows
|
||||||
|
return "USERPROFILE";
|
||||||
|
}
|
||||||
|
// macOS / Linux
|
||||||
|
return "HOME";
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* prepend LF to value if not empty
|
||||||
|
* @param value the value to prepend LF
|
||||||
|
* @returns prepended value
|
||||||
|
*/
|
||||||
|
function prependLf(value) {
|
||||||
|
if (value.length === 0) {
|
||||||
|
// do nothing if empty
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return `\n${value}`;
|
||||||
|
}
|
||||||
|
main();
|
||||||
|
//# sourceMappingURL=main.js.map
|
1
lib/main.js.map
Normal file
1
lib/main.js.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAExB,oDAAsC;AAStC;;GAEG;AACH,SAAS,IAAI;IAEZ,IACA;QACC,MAAM,KAAK,GAAe;YACzB;gBACC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;oBAC9B,QAAQ,EAAE,IAAI;iBACd,CAAC;gBACF,OAAO,EAAE;oBACR,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,IAAI;iBACV;aACD;YACD;gBACC,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;oBAChD,QAAQ,EAAE,IAAI;iBACd,CAAC,CAAC;gBACH,OAAO,EAAE;oBACR,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,GAAG;iBACT;aACD;YACD;gBACC,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC5C,OAAO,EAAE;oBACR,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,GAAG;iBACT;aACD;SACD,CAAC;QAEF,0BAA0B;QAC1B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE;YACrB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QAEH,eAAe;QACf,KAAI,MAAM,IAAI,IAAI,KAAK,EACvB;YACC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SACxD;QAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,gBAAgB,CAAC,CAAC;KACnE;IACD,OAAM,GAAG,EACT;QACC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KAC5B;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IAExB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAG,IAAI,KAAK,SAAS,EACrB;QACC,MAAM,KAAK,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC;KACzC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU;IAElB,IAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,EAC/B;QACC,UAAU;QACV,OAAO,aAAa,CAAC;KACrB;IAED,gBAAgB;IAChB,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,KAAa;IAE/B,IAAG,KAAK,CAAC,MAAM,KAAK,CAAC,EACrB;QACC,sBAAsB;QACtB,OAAO,EAAE,CAAC;KACV;IAED,OAAO,KAAK,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,IAAI,EAAE,CAAC"}
|
140
node_modules/@actions/core/README.md
generated
vendored
Normal file
140
node_modules/@actions/core/README.md
generated
vendored
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
# `@actions/core`
|
||||||
|
|
||||||
|
> Core functions for setting results, logging, registering secrets and exporting variables across actions
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Import the package
|
||||||
|
|
||||||
|
```js
|
||||||
|
// javascript
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
// typescript
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Inputs/Outputs
|
||||||
|
|
||||||
|
Action inputs can be read with `getInput`. Outputs can be set with `setOutput` which makes them available to be mapped into inputs of other actions to ensure they are decoupled.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const myInput = core.getInput('inputName', { required: true });
|
||||||
|
|
||||||
|
core.setOutput('outputKey', 'outputVal');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Exporting variables
|
||||||
|
|
||||||
|
Since each step runs in a separate process, you can use `exportVariable` to add it to this step and future steps environment blocks.
|
||||||
|
|
||||||
|
```js
|
||||||
|
core.exportVariable('envVar', 'Val');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Setting a secret
|
||||||
|
|
||||||
|
Setting a secret registers the secret with the runner to ensure it is masked in logs.
|
||||||
|
|
||||||
|
```js
|
||||||
|
core.setSecret('myPassword');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### PATH Manipulation
|
||||||
|
|
||||||
|
To make a tool's path available in the path for the remainder of the job (without altering the machine or containers state), use `addPath`. The runner will prepend the path given to the jobs PATH.
|
||||||
|
|
||||||
|
```js
|
||||||
|
core.addPath('/path/to/mytool');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Exit codes
|
||||||
|
|
||||||
|
You should use this library to set the failing exit code for your action. If status is not set and the script runs to completion, that will lead to a success.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Do stuff
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
// setFailed logs the message and sets a failing exit code
|
||||||
|
core.setFailed(`Action failed with error ${err}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
Note that `setNeutral` is not yet implemented in actions V2 but equivalent functionality is being planned.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Logging
|
||||||
|
|
||||||
|
Finally, this library provides some utilities for logging. Note that debug logging is hidden from the logs by default. This behavior can be toggled by enabling the [Step Debug Logs](../../docs/action-debugging.md#step-debug-logs).
|
||||||
|
|
||||||
|
```js
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
const myInput = core.getInput('input');
|
||||||
|
try {
|
||||||
|
core.debug('Inside try block');
|
||||||
|
|
||||||
|
if (!myInput) {
|
||||||
|
core.warning('myInput was not set');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do stuff
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
core.error(`Error ${err}, action may still succeed though`);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This library can also wrap chunks of output in foldable groups.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const core = require('@actions/core')
|
||||||
|
|
||||||
|
// Manually wrap output
|
||||||
|
core.startGroup('Do some function')
|
||||||
|
doSomeFunction()
|
||||||
|
core.endGroup()
|
||||||
|
|
||||||
|
// Wrap an asynchronous function call
|
||||||
|
const result = await core.group('Do something async', async () => {
|
||||||
|
const response = await doSomeHTTPRequest()
|
||||||
|
return response
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Action state
|
||||||
|
|
||||||
|
You can use this library to save state and get state for sharing information between a given wrapper action:
|
||||||
|
|
||||||
|
**action.yml**
|
||||||
|
```yaml
|
||||||
|
name: 'Wrapper action sample'
|
||||||
|
inputs:
|
||||||
|
name:
|
||||||
|
default: 'GitHub'
|
||||||
|
runs:
|
||||||
|
using: 'node12'
|
||||||
|
main: 'main.js'
|
||||||
|
post: 'cleanup.js'
|
||||||
|
```
|
||||||
|
|
||||||
|
In action's `main.js`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
core.saveState("pidToKill", 12345);
|
||||||
|
```
|
||||||
|
|
||||||
|
In action's `cleanup.js`:
|
||||||
|
```js
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
var pid = core.getState("pidToKill");
|
||||||
|
|
||||||
|
process.kill(pid);
|
||||||
|
```
|
16
node_modules/@actions/core/lib/command.d.ts
generated
vendored
Normal file
16
node_modules/@actions/core/lib/command.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
interface CommandProperties {
|
||||||
|
[key: string]: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Commands
|
||||||
|
*
|
||||||
|
* Command Format:
|
||||||
|
* ::name key=value,key=value::message
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
* ::warning::This is the message
|
||||||
|
* ::set-env name=MY_VAR::some value
|
||||||
|
*/
|
||||||
|
export declare function issueCommand(command: string, properties: CommandProperties, message: string): void;
|
||||||
|
export declare function issue(name: string, message?: string): void;
|
||||||
|
export {};
|
78
node_modules/@actions/core/lib/command.js
generated
vendored
Normal file
78
node_modules/@actions/core/lib/command.js
generated
vendored
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
"use strict";
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
|
result["default"] = mod;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const os = __importStar(require("os"));
|
||||||
|
/**
|
||||||
|
* Commands
|
||||||
|
*
|
||||||
|
* Command Format:
|
||||||
|
* ::name key=value,key=value::message
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
* ::warning::This is the message
|
||||||
|
* ::set-env name=MY_VAR::some value
|
||||||
|
*/
|
||||||
|
function issueCommand(command, properties, message) {
|
||||||
|
const cmd = new Command(command, properties, message);
|
||||||
|
process.stdout.write(cmd.toString() + os.EOL);
|
||||||
|
}
|
||||||
|
exports.issueCommand = issueCommand;
|
||||||
|
function issue(name, message = '') {
|
||||||
|
issueCommand(name, {}, message);
|
||||||
|
}
|
||||||
|
exports.issue = issue;
|
||||||
|
const CMD_STRING = '::';
|
||||||
|
class Command {
|
||||||
|
constructor(command, properties, message) {
|
||||||
|
if (!command) {
|
||||||
|
command = 'missing.command';
|
||||||
|
}
|
||||||
|
this.command = command;
|
||||||
|
this.properties = properties;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
toString() {
|
||||||
|
let cmdStr = CMD_STRING + this.command;
|
||||||
|
if (this.properties && Object.keys(this.properties).length > 0) {
|
||||||
|
cmdStr += ' ';
|
||||||
|
let first = true;
|
||||||
|
for (const key in this.properties) {
|
||||||
|
if (this.properties.hasOwnProperty(key)) {
|
||||||
|
const val = this.properties[key];
|
||||||
|
if (val) {
|
||||||
|
if (first) {
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cmdStr += ',';
|
||||||
|
}
|
||||||
|
cmdStr += `${key}=${escapeProperty(val)}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cmdStr += `${CMD_STRING}${escapeData(this.message)}`;
|
||||||
|
return cmdStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function escapeData(s) {
|
||||||
|
return (s || '')
|
||||||
|
.replace(/%/g, '%25')
|
||||||
|
.replace(/\r/g, '%0D')
|
||||||
|
.replace(/\n/g, '%0A');
|
||||||
|
}
|
||||||
|
function escapeProperty(s) {
|
||||||
|
return (s || '')
|
||||||
|
.replace(/%/g, '%25')
|
||||||
|
.replace(/\r/g, '%0D')
|
||||||
|
.replace(/\n/g, '%0A')
|
||||||
|
.replace(/:/g, '%3A')
|
||||||
|
.replace(/,/g, '%2C');
|
||||||
|
}
|
||||||
|
//# sourceMappingURL=command.js.map
|
1
node_modules/@actions/core/lib/command.js.map
generated
vendored
Normal file
1
node_modules/@actions/core/lib/command.js.map
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":";;;;;;;;;AAAA,uCAAwB;AAQxB;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAC1B,OAAe,EACf,UAA6B,EAC7B,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;AAC/C,CAAC;AAPD,oCAOC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,UAAkB,EAAE;IACtD,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACjC,CAAC;AAFD,sBAEC;AAED,MAAM,UAAU,GAAG,IAAI,CAAA;AAEvB,MAAM,OAAO;IAKX,YAAY,OAAe,EAAE,UAA6B,EAAE,OAAe;QACzE,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,iBAAiB,CAAA;SAC5B;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,QAAQ;QACN,IAAI,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC,OAAO,CAAA;QAEtC,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9D,MAAM,IAAI,GAAG,CAAA;YACb,IAAI,KAAK,GAAG,IAAI,CAAA;YAChB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;oBAChC,IAAI,GAAG,EAAE;wBACP,IAAI,KAAK,EAAE;4BACT,KAAK,GAAG,KAAK,CAAA;yBACd;6BAAM;4BACL,MAAM,IAAI,GAAG,CAAA;yBACd;wBAED,MAAM,IAAI,GAAG,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAA;qBAC1C;iBACF;aACF;SACF;QAED,MAAM,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;QACpD,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;SACb,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;SACb,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC"}
|
112
node_modules/@actions/core/lib/core.d.ts
generated
vendored
Normal file
112
node_modules/@actions/core/lib/core.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Interface for getInput options
|
||||||
|
*/
|
||||||
|
export interface InputOptions {
|
||||||
|
/** Optional. Whether the input is required. If required and not present, will throw. Defaults to false */
|
||||||
|
required?: boolean;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The code to exit an action
|
||||||
|
*/
|
||||||
|
export declare enum ExitCode {
|
||||||
|
/**
|
||||||
|
* A code indicating that the action was successful
|
||||||
|
*/
|
||||||
|
Success = 0,
|
||||||
|
/**
|
||||||
|
* A code indicating that the action was a failure
|
||||||
|
*/
|
||||||
|
Failure = 1
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Sets env variable for this action and future actions in the job
|
||||||
|
* @param name the name of the variable to set
|
||||||
|
* @param val the value of the variable
|
||||||
|
*/
|
||||||
|
export declare function exportVariable(name: string, val: string): void;
|
||||||
|
/**
|
||||||
|
* Registers a secret which will get masked from logs
|
||||||
|
* @param secret value of the secret
|
||||||
|
*/
|
||||||
|
export declare function setSecret(secret: string): void;
|
||||||
|
/**
|
||||||
|
* Prepends inputPath to the PATH (for this action and future actions)
|
||||||
|
* @param inputPath
|
||||||
|
*/
|
||||||
|
export declare function addPath(inputPath: string): void;
|
||||||
|
/**
|
||||||
|
* Gets the value of an input. The value is also trimmed.
|
||||||
|
*
|
||||||
|
* @param name name of the input to get
|
||||||
|
* @param options optional. See InputOptions.
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
export declare function getInput(name: string, options?: InputOptions): string;
|
||||||
|
/**
|
||||||
|
* Sets the value of an output.
|
||||||
|
*
|
||||||
|
* @param name name of the output to set
|
||||||
|
* @param value value to store
|
||||||
|
*/
|
||||||
|
export declare function setOutput(name: string, value: string): void;
|
||||||
|
/**
|
||||||
|
* Sets the action status to failed.
|
||||||
|
* When the action exits it will be with an exit code of 1
|
||||||
|
* @param message add error issue message
|
||||||
|
*/
|
||||||
|
export declare function setFailed(message: string): void;
|
||||||
|
/**
|
||||||
|
* Writes debug message to user log
|
||||||
|
* @param message debug message
|
||||||
|
*/
|
||||||
|
export declare function debug(message: string): void;
|
||||||
|
/**
|
||||||
|
* Adds an error issue
|
||||||
|
* @param message error issue message
|
||||||
|
*/
|
||||||
|
export declare function error(message: string): void;
|
||||||
|
/**
|
||||||
|
* Adds an warning issue
|
||||||
|
* @param message warning issue message
|
||||||
|
*/
|
||||||
|
export declare function warning(message: string): void;
|
||||||
|
/**
|
||||||
|
* Writes info to log with console.log.
|
||||||
|
* @param message info message
|
||||||
|
*/
|
||||||
|
export declare function info(message: string): void;
|
||||||
|
/**
|
||||||
|
* Begin an output group.
|
||||||
|
*
|
||||||
|
* Output until the next `groupEnd` will be foldable in this group
|
||||||
|
*
|
||||||
|
* @param name The name of the output group
|
||||||
|
*/
|
||||||
|
export declare function startGroup(name: string): void;
|
||||||
|
/**
|
||||||
|
* End an output group.
|
||||||
|
*/
|
||||||
|
export declare function endGroup(): void;
|
||||||
|
/**
|
||||||
|
* Wrap an asynchronous function call in a group.
|
||||||
|
*
|
||||||
|
* Returns the same type as the function itself.
|
||||||
|
*
|
||||||
|
* @param name The name of the group
|
||||||
|
* @param fn The function to wrap in the group
|
||||||
|
*/
|
||||||
|
export declare function group<T>(name: string, fn: () => Promise<T>): Promise<T>;
|
||||||
|
/**
|
||||||
|
* Saves state for current action, the state can only be retrieved by this action's post job execution.
|
||||||
|
*
|
||||||
|
* @param name name of the state to store
|
||||||
|
* @param value value to store
|
||||||
|
*/
|
||||||
|
export declare function saveState(name: string, value: string): void;
|
||||||
|
/**
|
||||||
|
* Gets the value of an state set by this action's main execution.
|
||||||
|
*
|
||||||
|
* @param name name of the state to get
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
export declare function getState(name: string): string;
|
202
node_modules/@actions/core/lib/core.js
generated
vendored
Normal file
202
node_modules/@actions/core/lib/core.js
generated
vendored
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
"use strict";
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
|
result["default"] = mod;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const command_1 = require("./command");
|
||||||
|
const os = __importStar(require("os"));
|
||||||
|
const path = __importStar(require("path"));
|
||||||
|
/**
|
||||||
|
* The code to exit an action
|
||||||
|
*/
|
||||||
|
var ExitCode;
|
||||||
|
(function (ExitCode) {
|
||||||
|
/**
|
||||||
|
* A code indicating that the action was successful
|
||||||
|
*/
|
||||||
|
ExitCode[ExitCode["Success"] = 0] = "Success";
|
||||||
|
/**
|
||||||
|
* A code indicating that the action was a failure
|
||||||
|
*/
|
||||||
|
ExitCode[ExitCode["Failure"] = 1] = "Failure";
|
||||||
|
})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// Variables
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Sets env variable for this action and future actions in the job
|
||||||
|
* @param name the name of the variable to set
|
||||||
|
* @param val the value of the variable
|
||||||
|
*/
|
||||||
|
function exportVariable(name, val) {
|
||||||
|
process.env[name] = val;
|
||||||
|
command_1.issueCommand('set-env', { name }, val);
|
||||||
|
}
|
||||||
|
exports.exportVariable = exportVariable;
|
||||||
|
/**
|
||||||
|
* Registers a secret which will get masked from logs
|
||||||
|
* @param secret value of the secret
|
||||||
|
*/
|
||||||
|
function setSecret(secret) {
|
||||||
|
command_1.issueCommand('add-mask', {}, secret);
|
||||||
|
}
|
||||||
|
exports.setSecret = setSecret;
|
||||||
|
/**
|
||||||
|
* Prepends inputPath to the PATH (for this action and future actions)
|
||||||
|
* @param inputPath
|
||||||
|
*/
|
||||||
|
function addPath(inputPath) {
|
||||||
|
command_1.issueCommand('add-path', {}, inputPath);
|
||||||
|
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
|
||||||
|
}
|
||||||
|
exports.addPath = addPath;
|
||||||
|
/**
|
||||||
|
* Gets the value of an input. The value is also trimmed.
|
||||||
|
*
|
||||||
|
* @param name name of the input to get
|
||||||
|
* @param options optional. See InputOptions.
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
function getInput(name, options) {
|
||||||
|
const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';
|
||||||
|
if (options && options.required && !val) {
|
||||||
|
throw new Error(`Input required and not supplied: ${name}`);
|
||||||
|
}
|
||||||
|
return val.trim();
|
||||||
|
}
|
||||||
|
exports.getInput = getInput;
|
||||||
|
/**
|
||||||
|
* Sets the value of an output.
|
||||||
|
*
|
||||||
|
* @param name name of the output to set
|
||||||
|
* @param value value to store
|
||||||
|
*/
|
||||||
|
function setOutput(name, value) {
|
||||||
|
command_1.issueCommand('set-output', { name }, value);
|
||||||
|
}
|
||||||
|
exports.setOutput = setOutput;
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// Results
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Sets the action status to failed.
|
||||||
|
* When the action exits it will be with an exit code of 1
|
||||||
|
* @param message add error issue message
|
||||||
|
*/
|
||||||
|
function setFailed(message) {
|
||||||
|
process.exitCode = ExitCode.Failure;
|
||||||
|
error(message);
|
||||||
|
}
|
||||||
|
exports.setFailed = setFailed;
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// Logging Commands
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Writes debug message to user log
|
||||||
|
* @param message debug message
|
||||||
|
*/
|
||||||
|
function debug(message) {
|
||||||
|
command_1.issueCommand('debug', {}, message);
|
||||||
|
}
|
||||||
|
exports.debug = debug;
|
||||||
|
/**
|
||||||
|
* Adds an error issue
|
||||||
|
* @param message error issue message
|
||||||
|
*/
|
||||||
|
function error(message) {
|
||||||
|
command_1.issue('error', message);
|
||||||
|
}
|
||||||
|
exports.error = error;
|
||||||
|
/**
|
||||||
|
* Adds an warning issue
|
||||||
|
* @param message warning issue message
|
||||||
|
*/
|
||||||
|
function warning(message) {
|
||||||
|
command_1.issue('warning', message);
|
||||||
|
}
|
||||||
|
exports.warning = warning;
|
||||||
|
/**
|
||||||
|
* Writes info to log with console.log.
|
||||||
|
* @param message info message
|
||||||
|
*/
|
||||||
|
function info(message) {
|
||||||
|
process.stdout.write(message + os.EOL);
|
||||||
|
}
|
||||||
|
exports.info = info;
|
||||||
|
/**
|
||||||
|
* Begin an output group.
|
||||||
|
*
|
||||||
|
* Output until the next `groupEnd` will be foldable in this group
|
||||||
|
*
|
||||||
|
* @param name The name of the output group
|
||||||
|
*/
|
||||||
|
function startGroup(name) {
|
||||||
|
command_1.issue('group', name);
|
||||||
|
}
|
||||||
|
exports.startGroup = startGroup;
|
||||||
|
/**
|
||||||
|
* End an output group.
|
||||||
|
*/
|
||||||
|
function endGroup() {
|
||||||
|
command_1.issue('endgroup');
|
||||||
|
}
|
||||||
|
exports.endGroup = endGroup;
|
||||||
|
/**
|
||||||
|
* Wrap an asynchronous function call in a group.
|
||||||
|
*
|
||||||
|
* Returns the same type as the function itself.
|
||||||
|
*
|
||||||
|
* @param name The name of the group
|
||||||
|
* @param fn The function to wrap in the group
|
||||||
|
*/
|
||||||
|
function group(name, fn) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
startGroup(name);
|
||||||
|
let result;
|
||||||
|
try {
|
||||||
|
result = yield fn();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
endGroup();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.group = group;
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// Wrapper action state
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Saves state for current action, the state can only be retrieved by this action's post job execution.
|
||||||
|
*
|
||||||
|
* @param name name of the state to store
|
||||||
|
* @param value value to store
|
||||||
|
*/
|
||||||
|
function saveState(name, value) {
|
||||||
|
command_1.issueCommand('save-state', { name }, value);
|
||||||
|
}
|
||||||
|
exports.saveState = saveState;
|
||||||
|
/**
|
||||||
|
* Gets the value of an state set by this action's main execution.
|
||||||
|
*
|
||||||
|
* @param name name of the state to get
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
function getState(name) {
|
||||||
|
return process.env[`STATE_${name}`] || '';
|
||||||
|
}
|
||||||
|
exports.getState = getState;
|
||||||
|
//# sourceMappingURL=core.js.map
|
1
node_modules/@actions/core/lib/core.js.map
generated
vendored
Normal file
1
node_modules/@actions/core/lib/core.js.map
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,uCAA6C;AAE7C,uCAAwB;AACxB,2CAA4B;AAU5B;;GAEG;AACH,IAAY,QAUX;AAVD,WAAY,QAAQ;IAClB;;OAEG;IACH,6CAAW,CAAA;IAEX;;OAEG;IACH,6CAAW,CAAA;AACb,CAAC,EAVW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAUnB;AAED,yEAAyE;AACzE,YAAY;AACZ,yEAAyE;AAEzE;;;;GAIG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,GAAW;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAA;IACvB,sBAAY,CAAC,SAAS,EAAE,EAAC,IAAI,EAAC,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC;AAHD,wCAGC;AAED;;;GAGG;AACH,SAAgB,SAAS,CAAC,MAAc;IACtC,sBAAY,CAAC,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;AACtC,CAAC;AAFD,8BAEC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,SAAiB;IACvC,sBAAY,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;AAC7E,CAAC;AAHD,0BAGC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,OAAsB;IAC3D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;IACrE,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAA;KAC5D;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;AACnB,CAAC;AARD,4BAQC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,sBAAY,CAAC,YAAY,EAAE,EAAC,IAAI,EAAC,EAAE,KAAK,CAAC,CAAA;AAC3C,CAAC;AAFD,8BAEC;AAED,yEAAyE;AACzE,UAAU;AACV,yEAAyE;AAEzE;;;;GAIG;AACH,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAA;IACnC,KAAK,CAAC,OAAO,CAAC,CAAA;AAChB,CAAC;AAHD,8BAGC;AAED,yEAAyE;AACzE,mBAAmB;AACnB,yEAAyE;AAEzE;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,sBAAY,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACpC,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,eAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACzB,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,OAAe;IACrC,eAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC;AAFD,0BAEC;AAED;;;GAGG;AACH,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;AACxC,CAAC;AAFD,oBAEC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,IAAY;IACrC,eAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AACtB,CAAC;AAFD,gCAEC;AAED;;GAEG;AACH,SAAgB,QAAQ;IACtB,eAAK,CAAC,UAAU,CAAC,CAAA;AACnB,CAAC;AAFD,4BAEC;AAED;;;;;;;GAOG;AACH,SAAsB,KAAK,CAAI,IAAY,EAAE,EAAoB;;QAC/D,UAAU,CAAC,IAAI,CAAC,CAAA;QAEhB,IAAI,MAAS,CAAA;QAEb,IAAI;YACF,MAAM,GAAG,MAAM,EAAE,EAAE,CAAA;SACpB;gBAAS;YACR,QAAQ,EAAE,CAAA;SACX;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CAAA;AAZD,sBAYC;AAED,yEAAyE;AACzE,uBAAuB;AACvB,yEAAyE;AAEzE;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,sBAAY,CAAC,YAAY,EAAE,EAAC,IAAI,EAAC,EAAE,KAAK,CAAC,CAAA;AAC3C,CAAC;AAFD,8BAEC;AAED;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,IAAY;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;AAC3C,CAAC;AAFD,4BAEC"}
|
44
node_modules/@actions/core/package.json
generated
vendored
Normal file
44
node_modules/@actions/core/package.json
generated
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{
|
||||||
|
"name": "@actions/core",
|
||||||
|
"version": "1.2.2",
|
||||||
|
"description": "Actions core lib",
|
||||||
|
"keywords": [
|
||||||
|
"github",
|
||||||
|
"actions",
|
||||||
|
"core"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/actions/toolkit/tree/master/packages/core",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "lib/core.js",
|
||||||
|
"types": "lib/core.d.ts",
|
||||||
|
"directories": {
|
||||||
|
"lib": "lib",
|
||||||
|
"test": "__tests__"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"lib"
|
||||||
|
],
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/actions/toolkit.git",
|
||||||
|
"directory": "packages/core"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"audit-moderate": "npm install && npm audit --audit-level=moderate",
|
||||||
|
"test": "echo \"Error: run tests from root\" && exit 1",
|
||||||
|
"tsc": "tsc"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/actions/toolkit/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^12.0.2"
|
||||||
|
}
|
||||||
|
|
||||||
|
,"_resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.2.tgz"
|
||||||
|
,"_integrity": "sha512-IbCx7oefq+Gi6FWbSs2Fnw8VkEI6Y4gvjrYprY3RV//ksq/KPMlClOerJ4jRosyal6zkUIc8R9fS/cpRMlGClg=="
|
||||||
|
,"_from": "@actions/core@1.2.2"
|
||||||
|
}
|
4087
package-lock.json
generated
Normal file
4087
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
48
package.json
Normal file
48
package.json
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
{
|
||||||
|
"name": "install-ssh-key",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"private": true,
|
||||||
|
"description": "Install SSH key in .ssh",
|
||||||
|
"main": "lib/main.js",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0",
|
||||||
|
"npm": ">=5.7.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"check-updates": "ncu",
|
||||||
|
"lint": "run-p lint:*",
|
||||||
|
"lint:ts": "eslint ./src --ext .ts",
|
||||||
|
"lint:md": "markdownlint . --ignore node_modules --ignore examples",
|
||||||
|
"lint:yaml": "yamllint **/{,.}*.{yml,yaml} --ignore=node_modules/**",
|
||||||
|
"verify": "run-p lint"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/shimataro/ssh-key-action.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"actions",
|
||||||
|
"github actions",
|
||||||
|
"rsync",
|
||||||
|
"ssh",
|
||||||
|
"ssh key"
|
||||||
|
],
|
||||||
|
"author": "shimataro",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/core": "1.2.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "13.7.0",
|
||||||
|
"@typescript-eslint/eslint-plugin": "2.19.0",
|
||||||
|
"@typescript-eslint/parser": "2.19.0",
|
||||||
|
"eslint": "6.8.0",
|
||||||
|
"eslint-plugin-import": "2.20.1",
|
||||||
|
"markdownlint-cli": "0.21.0",
|
||||||
|
"npm-check-updates": "4.0.1",
|
||||||
|
"npm-run-all": "4.1.5",
|
||||||
|
"typescript": "3.7.5",
|
||||||
|
"yaml-lint": "1.2.4"
|
||||||
|
}
|
||||||
|
}
|
133
scripts/create-release-branch.sh
Executable file
133
scripts/create-release-branch.sh
Executable file
|
@ -0,0 +1,133 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# requires following packages:
|
||||||
|
# - git; I believe it's already installed.
|
||||||
|
# - sed; GNU sed is preferred. POSIX sed may not work.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BASE_BRANCH="develop"
|
||||||
|
|
||||||
|
PACKAGE_NAME="ssh-key-action"
|
||||||
|
URL_PRODUCT="https://github.com/shimataro/${PACKAGE_NAME}"
|
||||||
|
URL_REPOSITORY="${URL_PRODUCT}.git"
|
||||||
|
URL_COMPARE="${URL_PRODUCT}/compare"
|
||||||
|
URL_RELEASE="${URL_PRODUCT}/releases/new"
|
||||||
|
|
||||||
|
COLOR_ERROR="\e[1;41m"
|
||||||
|
COLOR_SECTION="\e[1;34m"
|
||||||
|
COLOR_COMMAND_NAME="\e[1;34m"
|
||||||
|
COLOR_OPTION="\e[4;36m"
|
||||||
|
COLOR_COMMAND="\e[4m"
|
||||||
|
COLOR_FILE="\e[1;34m"
|
||||||
|
COLOR_BRANCH="\e[1;31m"
|
||||||
|
COLOR_INPUT="\e[1;31m"
|
||||||
|
COLOR_SELECT="\e[1;32m"
|
||||||
|
COLOR_RESET="\e[m"
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
cd $(dirname ${0})/..
|
||||||
|
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
local VERSION=$1
|
||||||
|
local BRANCH="release/v${VERSION}"
|
||||||
|
local TAG="v${VERSION}"
|
||||||
|
|
||||||
|
check_version_format ${VERSION}
|
||||||
|
check_current_branch
|
||||||
|
|
||||||
|
create_branch ${BRANCH}
|
||||||
|
./scripts/prepare-release.sh ${VERSION}
|
||||||
|
finish ${VERSION} ${BRANCH} ${TAG}
|
||||||
|
}
|
||||||
|
|
||||||
|
function usage() {
|
||||||
|
local COMMAND=`basename ${0}`
|
||||||
|
|
||||||
|
echo -e "${COLOR_SECTION}NAME${COLOR_RESET}
|
||||||
|
${COMMAND} - Create a branch and prepare for new release
|
||||||
|
|
||||||
|
${COLOR_SECTION}SYNOPSIS${COLOR_RESET}
|
||||||
|
${COLOR_COMMAND_NAME}${COMMAND}${COLOR_RESET} <${COLOR_OPTION}new-version${COLOR_RESET}>
|
||||||
|
|
||||||
|
${COLOR_SECTION}DESCRIPTION${COLOR_RESET}
|
||||||
|
This command:
|
||||||
|
- creates a new branch for release
|
||||||
|
- updates ${COLOR_FILE}CHANGELOG.md${COLOR_RESET}
|
||||||
|
- updates package version in ${COLOR_FILE}package.json${COLOR_RESET}
|
||||||
|
- updates dependencies version in ${COLOR_FILE}package.json${COLOR_RESET}
|
||||||
|
- verifies
|
||||||
|
- ...and commits!
|
||||||
|
|
||||||
|
${COLOR_OPTION}new-version${COLOR_RESET} must follow \"Semantic Versioning\" <https://semver.org/>.
|
||||||
|
"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_version_format() {
|
||||||
|
if [[ $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${COLOR_ERROR}ERROR:${COLOR_RESET} Follow \"Semantic Versioning\" <https://semver.org/> for new version.
|
||||||
|
" >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_current_branch() {
|
||||||
|
local CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
|
||||||
|
if [ ${CURRENT_BRANCH} = ${BASE_BRANCH} ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${COLOR_ERROR}ERROR:${COLOR_RESET} Work on ${COLOR_BRANCH}${BASE_BRANCH}${COLOR_RESET} branch
|
||||||
|
${COLOR_COMMAND}git checkout ${BASE_BRANCH}${COLOR_RESET}
|
||||||
|
" >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_branch() {
|
||||||
|
local BRANCH=$1
|
||||||
|
|
||||||
|
git checkout -b ${BRANCH} ${BASE_BRANCH}
|
||||||
|
}
|
||||||
|
|
||||||
|
function finish() {
|
||||||
|
local VERSION=$1
|
||||||
|
local BRANCH=$2
|
||||||
|
local TAG=$3
|
||||||
|
local TARGET_BRANCH="v${VERSION%%[!0-9]*}"
|
||||||
|
|
||||||
|
echo -e "
|
||||||
|
Branch ${COLOR_BRANCH}${BRANCH}${COLOR_RESET} has been created.
|
||||||
|
Remaining processes are...
|
||||||
|
|
||||||
|
1. Make sure all changes are correct
|
||||||
|
${COLOR_COMMAND}git diff ${BASE_BRANCH} ${BRANCH}${COLOR_RESET}
|
||||||
|
2. Push to remote origin
|
||||||
|
${COLOR_COMMAND}git push --set-upstream origin ${BRANCH}${COLOR_RESET}
|
||||||
|
3. Create a pull-request: ${COLOR_BRANCH}${BRANCH}${COLOR_RESET} to ${COLOR_BRANCH}${BASE_BRANCH}${COLOR_RESET}
|
||||||
|
${URL_COMPARE}/${BASE_BRANCH}...${BRANCH}?expand=1
|
||||||
|
select ${COLOR_SELECT}Squash and merge${COLOR_RESET}
|
||||||
|
4. Create a pull-request: ${COLOR_BRANCH}${BASE_BRANCH}${COLOR_RESET} to ${COLOR_BRANCH}${TARGET_BRANCH}${COLOR_RESET}
|
||||||
|
${URL_COMPARE}/${TARGET_BRANCH}...${BASE_BRANCH}?expand=1&title=version%20${VERSION}
|
||||||
|
select ${COLOR_SELECT}Create a merge commit${COLOR_RESET}
|
||||||
|
5. Create a new release
|
||||||
|
${URL_RELEASE}?tag=${TAG}&target=${TARGET_BRANCH}&title=${PACKAGE_NAME}%20${VERSION}%20released
|
||||||
|
Tag version: ${COLOR_INPUT}${TAG}${COLOR_RESET}
|
||||||
|
Target: ${COLOR_INPUT}${TARGET_BRANCH}${COLOR_RESET}
|
||||||
|
Release title: ${COLOR_INPUT}${PACKAGE_NAME} ${VERSION} released${COLOR_RESET}
|
||||||
|
Description this release: (copy and paste CHANGELOG.md)
|
||||||
|
6. Post processing
|
||||||
|
${COLOR_COMMAND}git checkout ${BASE_BRANCH}${COLOR_RESET}
|
||||||
|
${COLOR_COMMAND}git pull${COLOR_RESET}
|
||||||
|
${COLOR_COMMAND}git fetch -p${COLOR_RESET}
|
||||||
|
${COLOR_COMMAND}git branch -D ${BRANCH}${COLOR_RESET}
|
||||||
|
|
||||||
|
That's all!
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
112
scripts/prepare-release.sh
Executable file
112
scripts/prepare-release.sh
Executable file
|
@ -0,0 +1,112 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# requires following packages:
|
||||||
|
# - git; I believe it's already installed.
|
||||||
|
# - sed; GNU sed is preferred. POSIX sed may not work.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
COLOR_ERROR="\e[1;41m"
|
||||||
|
COLOR_SECTION="\e[1;34m"
|
||||||
|
COLOR_COMMAND_NAME="\e[1;34m"
|
||||||
|
COLOR_OPTION="\e[4;36m"
|
||||||
|
COLOR_COMMAND="\e[4m"
|
||||||
|
COLOR_FILE="\e[1;34m"
|
||||||
|
COLOR_BRANCH="\e[1;31m"
|
||||||
|
COLOR_INPUT="\e[1;31m"
|
||||||
|
COLOR_SELECT="\e[1;32m"
|
||||||
|
COLOR_RESET="\e[m"
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $(dirname ${0})/..
|
||||||
|
|
||||||
|
local VERSION=$1
|
||||||
|
check_version_format ${VERSION}
|
||||||
|
|
||||||
|
update_changelog ${VERSION}
|
||||||
|
update_package_version ${VERSION}
|
||||||
|
update_dependencies_version
|
||||||
|
regenerate_package_lock
|
||||||
|
build_package
|
||||||
|
commit_changes ${VERSION}
|
||||||
|
}
|
||||||
|
|
||||||
|
function usage() {
|
||||||
|
local COMMAND=`basename ${0}`
|
||||||
|
|
||||||
|
echo -e "${COLOR_SECTION}NAME${COLOR_RESET}
|
||||||
|
${COMMAND} - Prepare for new release
|
||||||
|
|
||||||
|
${COLOR_SECTION}SYNOPSIS${COLOR_RESET}
|
||||||
|
${COLOR_COMMAND_NAME}${COMMAND}${COLOR_RESET} <${COLOR_OPTION}new-version${COLOR_RESET}>
|
||||||
|
|
||||||
|
${COLOR_SECTION}DESCRIPTION${COLOR_RESET}
|
||||||
|
This command:
|
||||||
|
- updates ${COLOR_FILE}CHANGELOG.md${COLOR_RESET}
|
||||||
|
- updates package version in ${COLOR_FILE}package.json${COLOR_RESET}
|
||||||
|
- updates dependencies version in ${COLOR_FILE}package.json${COLOR_RESET}
|
||||||
|
- verifies
|
||||||
|
- ...and commits!
|
||||||
|
|
||||||
|
${COLOR_OPTION}new-version${COLOR_RESET} must follow \"Semantic Versioning\" <https://semver.org/>.
|
||||||
|
"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_version_format() {
|
||||||
|
if [[ $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${COLOR_ERROR}ERROR:${COLOR_RESET} Follow \"Semantic Versioning\" <https://semver.org/> for new version.
|
||||||
|
" >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_changelog() {
|
||||||
|
local VERSION=$1
|
||||||
|
local DATE=`date "+%Y-%m-%d"`
|
||||||
|
local KEYWORD="Unreleased"
|
||||||
|
|
||||||
|
sed -i".bak" -r \
|
||||||
|
-e "s/^((##\s+)\[${KEYWORD}\])$/\1\n\n\2[${VERSION}] - ${DATE}/" \
|
||||||
|
-e "s/^(\[${KEYWORD}\](.*))(v.*)\.\.\.HEAD$/\1v${VERSION}...HEAD\n[${VERSION}]\2\3...v${VERSION}/" \
|
||||||
|
CHANGELOG.md
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_package_version() {
|
||||||
|
local VERSION=$1
|
||||||
|
|
||||||
|
sed -i".bak" -r \
|
||||||
|
-e "s/(\"version\"\s*:\s*)\".*?\"/\1\"${VERSION}\"/" \
|
||||||
|
package.json
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_dependencies_version() {
|
||||||
|
npm ci
|
||||||
|
npm run check-updates -- -u
|
||||||
|
}
|
||||||
|
|
||||||
|
function regenerate_package_lock() {
|
||||||
|
rm -rf package-lock.json node_modules
|
||||||
|
npm install
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_package() {
|
||||||
|
npm run build
|
||||||
|
npm run verify
|
||||||
|
}
|
||||||
|
|
||||||
|
function commit_changes() {
|
||||||
|
local VERSION=$1
|
||||||
|
|
||||||
|
rm -rf node_modules
|
||||||
|
npm ci --only=production
|
||||||
|
git add CHANGELOG.md package.json package-lock.json node_modules lib
|
||||||
|
git commit -m "version ${VERSION}"
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
12
scripts/rebuild.sh
Executable file
12
scripts/rebuild.sh
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
rm -rf node_modules package-lock.json
|
||||||
|
npm i
|
||||||
|
npm run build
|
||||||
|
npm run verify
|
||||||
|
|
||||||
|
rm -rf node_modules
|
||||||
|
npm ci --only=production
|
||||||
|
git add node_modules package-lock.json lib
|
40
scripts/update-dependencies.sh
Executable file
40
scripts/update-dependencies.sh
Executable file
|
@ -0,0 +1,40 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# update dependencies
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DATE=$(date +"%Y%m%d")
|
||||||
|
BRANCH=feature/update-dependencies-${DATE}
|
||||||
|
COLOR_SUCCESS="\e[1;32m"
|
||||||
|
COLOR_RESET="\e[m"
|
||||||
|
|
||||||
|
# create branch
|
||||||
|
git checkout develop
|
||||||
|
git checkout -b ${BRANCH}
|
||||||
|
|
||||||
|
# check updates
|
||||||
|
npm ci
|
||||||
|
npm run check-updates -- -u
|
||||||
|
|
||||||
|
# re-install packages
|
||||||
|
rm -rf package-lock.json node_modules
|
||||||
|
npm i
|
||||||
|
|
||||||
|
# check
|
||||||
|
npm run build
|
||||||
|
npm run verify
|
||||||
|
|
||||||
|
# commit
|
||||||
|
rm -rf node_modules
|
||||||
|
npm ci --only=production
|
||||||
|
git add package.json package-lock.json node_modules
|
||||||
|
git commit -m "update dependencies"
|
||||||
|
|
||||||
|
# finished!
|
||||||
|
echo -e "
|
||||||
|
${COLOR_SUCCESS}🎉All dependencies are updated successfully.🎉${COLOR_RESET}
|
||||||
|
|
||||||
|
Push changes and merge into 'develop' branch.
|
||||||
|
|
||||||
|
git push --set-upstream origin ${BRANCH}
|
||||||
|
"
|
122
src/main.ts
Normal file
122
src/main.ts
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
import * as core from "@actions/core";
|
||||||
|
|
||||||
|
interface FileInfo
|
||||||
|
{
|
||||||
|
name: string;
|
||||||
|
contents: string;
|
||||||
|
options: fs.WriteFileOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* main function
|
||||||
|
*/
|
||||||
|
function main(): void
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const files: FileInfo[] = [
|
||||||
|
{
|
||||||
|
name: core.getInput("name"),
|
||||||
|
contents: core.getInput("key", {
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
options: {
|
||||||
|
mode: 0o400,
|
||||||
|
flag: "ax",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "known_hosts",
|
||||||
|
contents: prependLf(core.getInput("known_hosts", {
|
||||||
|
required: true,
|
||||||
|
})),
|
||||||
|
options: {
|
||||||
|
mode: 0o644,
|
||||||
|
flag: "a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "config",
|
||||||
|
contents: prependLf(core.getInput("config")),
|
||||||
|
options: {
|
||||||
|
mode: 0o644,
|
||||||
|
flag: "a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// create ".ssh" directory
|
||||||
|
const home = getHomeDirectory();
|
||||||
|
const dirName = path.resolve(home, ".ssh");
|
||||||
|
fs.mkdirSync(dirName, {
|
||||||
|
recursive: true,
|
||||||
|
mode: 0o700,
|
||||||
|
});
|
||||||
|
|
||||||
|
// create files
|
||||||
|
for(const file of files)
|
||||||
|
{
|
||||||
|
const fileName = path.join(dirName, file.name);
|
||||||
|
fs.writeFileSync(fileName, file.contents, file.options);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`SSH key has been stored to ${dirName} successfully.`);
|
||||||
|
}
|
||||||
|
catch(err)
|
||||||
|
{
|
||||||
|
core.setFailed(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get home directory
|
||||||
|
* @returns home directory
|
||||||
|
*/
|
||||||
|
function getHomeDirectory(): string
|
||||||
|
{
|
||||||
|
const homeEnv = getHomeEnv();
|
||||||
|
const home = process.env[homeEnv];
|
||||||
|
if(home === undefined)
|
||||||
|
{
|
||||||
|
throw Error(`${homeEnv} is not defined`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return home;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get HOME environment name
|
||||||
|
* @returns HOME environment name
|
||||||
|
*/
|
||||||
|
function getHomeEnv(): string
|
||||||
|
{
|
||||||
|
if(process.platform === "win32")
|
||||||
|
{
|
||||||
|
// Windows
|
||||||
|
return "USERPROFILE";
|
||||||
|
}
|
||||||
|
|
||||||
|
// macOS / Linux
|
||||||
|
return "HOME";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* prepend LF to value if not empty
|
||||||
|
* @param value the value to prepend LF
|
||||||
|
* @returns prepended value
|
||||||
|
*/
|
||||||
|
function prependLf(value: string): string
|
||||||
|
{
|
||||||
|
if(value.length === 0)
|
||||||
|
{
|
||||||
|
// do nothing if empty
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return `\n${value}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
31
ssh-key-action.code-workspace
Normal file
31
ssh-key-action.code-workspace
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"eslint.enable": true,
|
||||||
|
"json.format.enable": true,
|
||||||
|
"typescript.format.enable": true,
|
||||||
|
"typescript.format.insertSpaceAfterCommaDelimiter": true,
|
||||||
|
"typescript.format.insertSpaceAfterConstructor": false,
|
||||||
|
"typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
|
||||||
|
"typescript.format.insertSpaceAfterKeywordsInControlFlowStatements": false,
|
||||||
|
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false,
|
||||||
|
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": false,
|
||||||
|
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false,
|
||||||
|
"typescript.format.insertSpaceAfterSemicolonInForStatements": true,
|
||||||
|
"typescript.format.insertSpaceBeforeAndAfterBinaryOperators": true,
|
||||||
|
"typescript.format.insertSpaceBeforeFunctionParenthesis": false,
|
||||||
|
"typescript.format.placeOpenBraceOnNewLineForFunctions": true,
|
||||||
|
"typescript.format.placeOpenBraceOnNewLineForControlBlocks": true,
|
||||||
|
"typescript.validate.enable": true
|
||||||
|
},
|
||||||
|
"extensions": {
|
||||||
|
"recommendations": [
|
||||||
|
"EditorConfig.EditorConfig",
|
||||||
|
"eg2.vscode-npm-script"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
29
tsconfig.json
Normal file
29
tsconfig.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es6",
|
||||||
|
"module": "commonjs",
|
||||||
|
"lib": [
|
||||||
|
"es6"
|
||||||
|
],
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "./lib",
|
||||||
|
"rootDir": "./src",
|
||||||
|
|
||||||
|
"strict": true,
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"strictFunctionTypes": true,
|
||||||
|
"strictBindCallApply": true,
|
||||||
|
"strictPropertyInitialization": true,
|
||||||
|
"noImplicitThis": true,
|
||||||
|
"alwaysStrict": true,
|
||||||
|
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
|
||||||
|
"esModuleInterop": true
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules", "**/*.test.ts"]
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue