{"meta":{"title":"워크플로 및 작업에서 식 평가","intro":"GitHub Actions에서 식에 대한 정보를 찾습니다.","product":"GitHub Actions","breadcrumbs":[{"href":"/ko/enterprise-cloud@latest/actions","title":"GitHub Actions"},{"href":"/ko/enterprise-cloud@latest/actions/reference","title":"참조"},{"href":"/ko/enterprise-cloud@latest/actions/reference/workflows-and-actions","title":"워크플로 및 작업"},{"href":"/ko/enterprise-cloud@latest/actions/reference/workflows-and-actions/expressions","title":"식"}],"documentType":"article"},"body":"# 워크플로 및 작업에서 식 평가\n\nGitHub Actions에서 식에 대한 정보를 찾습니다.\n\n## 리터럴\n\n식의 일부로 `boolean`, `null`, `number` 또는 `string` 데이터 형식을 사용할 수 있습니다.\n\n| 데이터 형식                                                                                                                                                              | 리터럴 값                    |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |\n| `boolean`                                                                                                                                                           |                          |\n| `true` 또는 `false`                                                                                                                                                   |                          |\n| `null`                                                                                                                                                              | `null`                   |\n| `number`                                                                                                                                                            | JSON에서 지원하는 모든 숫자 형식입니다. |\n| `string`                                                                                                                                                            |                          |\n| `${` 및 `}`에 문자열을 묶을 필요가 없습니다. 그러나 문자열을 묶는 경우 문자열 주위에 작은따옴표(`'`)를 사용해야 합니다. 리터럴 작은따옴표를 사용하려면 추가 작은따옴표(`''`)를 사용하여 리터럴 작은따옴표를 이스케이프합니다. 큰따옴표(`\"`)로 래핑하면 오류가 throw됩니다. |                          |\n\n조건부에서 falsy 값(`false`, `0`, `-0`, `\"\"`, `''`, `null`은 `false`로 강제 변환되고 truthy 값(`true` 및 falsy가 아닌 기타 값)은 `true`로 강제 변환됩니다.\n\n### 리터럴 예시\n\n```yaml\nenv:\n  myNull: ${{ null }}\n  myBoolean: ${{ false }}\n  myIntegerNumber: ${{ 711 }}\n  myFloatNumber: ${{ -9.2 }}\n  myHexNumber: ${{ 0xff }}\n  myExponentialNumber: ${{ -2.99e-2 }}\n  myString: Mona the Octocat\n  myStringInBraces: ${{ 'It''s open source!' }}\n```\n\n## 연산자\n\n| 연산자               | 설명        |\n| ----------------- | --------- |\n| `( )`             | 논리적 그룹화   |\n| `[ ]`             | 인덱스       |\n| `.`               | 속성 참조 해제  |\n| `!`               | Not       |\n| `<`               | 보다 작음     |\n| `<=`              | 보다 작거나 같음 |\n| `>`               | 보다 큼      |\n| `>=`              | 보다 크거나 같음 |\n| `==`              | 같음        |\n| `!=`              | 같지 않음     |\n| `&&`              | And       |\n| <code>\\|\\|</code> | 또는        |\n\n> \\[!NOTE]\n>\n> * GitHub는 문자열을 비교할 때 대/소문자를 무시합니다.\n> *\n\n`steps.<step_id>.outputs.<output_name>`은 문자열로 평가됩니다. 특정 구문을 사용하여 GitHub에게 식을 문자열로 처리하는 대신 평가하도록 지시해야 합니다. 자세한 내용은 [문맥 참조](/ko/enterprise-cloud@latest/actions/learn-github-actions/contexts#steps-context)을(를) 참조하세요.\n\n> * 숫자 비교의 경우 `fromJSON()` 함수를 사용하여 문자열을 숫자로 변환할 수 있습니다.\n>   `fromJSON()` 함수에 대한 자세한 내용은 [fromJSON](#fromjson)을 참조하세요.\n\nGitHub는 느슨한 동등 비교를 수행합니다.\n\n* 형식이 일치하지 않으면 GitHub은 형식을 숫자로 강제 변환합니다. GitHub는 이러한 변환을 사용하여 데이터 형식을 숫자로 캐스팅합니다.\n\n  | Type | 결과  |\n  | ---- | --- |\n  | null | `0` |\n  | 부울   |     |\n\n`true`은 `1`를 반환합니다 <br />\n`false`은 `0`를 반환합니다 |\n\\| String  | 모든 유효한 JSON 숫자 형식에서 구문 분석됩니다. 그렇지 않으면 `NaN`입니다. <br /> 참고: 빈 문자열이 `0`을 반환합니다. |\n\\| Array   | `NaN` |\n\\| Object  | `NaN` |\n\n* `NaN`이 관계형 비교(`>`, `<`, `>=`, `<=`)의 피연산자 중 하나인 경우 결과는 항상 `false`입니다. 자세한 내용은 [NaN Mozilla 문서](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN)를 참조하세요.\n* GitHub는 문자열을 비교할 때 대/소문자를 무시합니다.\n* 개체와 배열은 동일한 인스턴스일 때만 동일하게 간주됩니다.\n\n## Functions\n\nGitHub은 식에서 사용할 수 있는 기본 제공 함수 집합을 제공합니다. 일부 함수는 값을 문자열로 캐스팅하여 비교를 수행합니다. GitHub는 이러한 변환을 사용하여 데이터 형식을 문자열로 캐스팅합니다.\n\n| Type                  | 결과                |\n| --------------------- | ----------------- |\n| null                  | `''`              |\n| 부울                    |                   |\n| `'true'` 또는 `'false'` |                   |\n| Number                | 10진수 형식, 큰 숫자의 지수 |\n| Array                 | 배열이 문자열로 변환되지 않음  |\n| Object                | 개체가 문자열로 변환되지 않음  |\n\n### contains\n\n`contains( search, item )`\n\n`true`이 `search`을 포함하는 경우 `item`를 반환합니다.\n`search`가 배열이면 이 함수는 `true`이 배열의 요소인 경우 `item`를 반환합니다.\n`search`이 문자열이면 이 함수는 `true`이 `item`의 하위 문자열인 경우 `search`를 반환합니다. 이 함수는 대/소문자를 구분하지 않습니다. 값을 문자열로 캐스팅합니다.\n\n#### 문자열을 사용하는 예제\n\n`contains('Hello world', 'llo')`는 `true`를 반환합니다.\n\n#### 개체 필터를 사용하는 예제\n\n`contains(github.event.issue.labels.*.name, 'bug')`는 이벤트와 관련된 문제에 \"버그\" 레이블이 있는 경우 `true`를 반환합니다.\n\n자세한 내용은 [개체 필터](#object-filters)를 참조하세요.\n\n#### 문자열 배열과 일치하는 예제\n\n`github.event_name == \"push\" || github.event_name == \"pull_request\"`를 쓰는 대신 `contains()`과 함께 `fromJSON()`를 사용하여 문자열 배열에 `item`이 포함되어 있는지 확인할 수 있습니다.\n\n예를 들어 `contains(fromJSON('[\"push\", \"pull_request\"]'), github.event_name)`은 `true`이 “push” 또는 “pull\\_request”인 경우 `github.event_name`를 반환합니다.\n\n### startsWith\n\n`startsWith( searchString, searchValue )`\n\n`true`이 `searchString`로 시작하면 `searchValue`를 반환합니다. 이 함수는 대/소문자를 구분하지 않습니다. 값을 문자열로 캐스팅합니다.\n\n#### `startsWith`의 예\n\n`startsWith('Hello world', 'He')`는 `true`를 반환합니다.\n\n### endsWith\n\n`endsWith( searchString, searchValue )`\n\n`true`이 `searchString`으로 끝나면 `searchValue`를 반환합니다. 이 함수는 대/소문자를 구분하지 않습니다. 값을 문자열로 캐스팅합니다.\n\n#### `endsWith`의 예\n\n`endsWith('Hello world', 'ld')`는 `true`를 반환합니다.\n\n### format\n\n`format( string, replaceValue0, replaceValue1, ..., replaceValueN)`\n\n`string`의 값을 `replaceValueN` 변수로 바꿉니다.\n`string`의 변수는 `{N}` 구문을 사용하여 지정됩니다. 여기서 `N`은 정수입니다.\n`replaceValue` 및 `string`을 하나 이상 지정해야 합니다. 사용할 수 있는 변수(`replaceValueN`)의 최대값은 없습니다. 이중 중괄호를 사용하여 중괄호를 이스케이프합니다.\n\n#### `format`의 예\n\n```javascript\nformat('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')\n```\n\n‘Hello Mona the Octocat’을 반환합니다.\n\n#### 중괄호 이스케이프 예제\n\n```javascript\nformat('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')\n```\n\n'{Hello Mona the Octocat!}'을 반환합니다.\n\n### join\n\n`join( array, optionalSeparator )`\n\n`array`의 값은 배열 또는 문자열일 수 있습니다. 모든 `array` 값이 문자열에 연결됩니다.\n`optionalSeparator`를 제공하면 연결된 값 사이에 삽입됩니다. 그렇지 않으면 기본 구분 기호인 `,`가 사용됩니다. 값을 문자열로 캐스팅합니다.\n\n#### `join`의 예\n\n`join(github.event.issue.labels.*.name, ', ')`은 ‘버그, 도움 요청’을 반환할 수 있습니다.\n\n### toJSON\n\n`toJSON(value)`\n\n`value`의 자동 서식 지정 JSON 표현을 반환합니다. 이 함수를 사용하여 컨텍스트에 제공된 정보를 디버그할 수 있습니다.\n\n#### `toJSON`의 예\n\n`toJSON(job)`은 `{ \"status\": \"success\" }`를 반환할 수 있습니다.\n\n### fromJSON\n\n`fromJSON(value)`\n\n`value`에 대한 JSON 객체 또는 JSON 데이터 형식을 반환합니다. 이 함수를 사용하여 JSON 개체를 평가 식으로 제공하거나 문자열, 부울, null 값, 배열 및 개체와 같이 JSON 또는 JavaScript로 표시할 수 있는 데이터 형식을 변환할 수 있습니다.\n\n#### JSON 개체를 반환하는 예제\n\n이 워크플로는 한 작업에서 JSON 매트릭스를 설정하고 출력 및 `fromJSON`을 사용하여 다음 작업으로 전달합니다.\n\n```yaml copy\nname: build\non: push\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    outputs:\n      matrix: ${{ steps.set-matrix.outputs.matrix }}\n    steps:\n      - id: set-matrix\n        run: echo \"matrix={\\\"include\\\":[{\\\"project\\\":\\\"foo\\\",\\\"config\\\":\\\"Debug\\\"},{\\\"project\\\":\\\"bar\\\",\\\"config\\\":\\\"Release\\\"}]}\" >> $GITHUB_OUTPUT\n  job2:\n    needs: job1\n    runs-on: ubuntu-latest\n    strategy:\n      matrix: ${{ fromJSON(needs.job1.outputs.matrix) }}\n    steps:\n      - run: echo \"Matrix - Project ${{ matrix.project }}, Config ${{ matrix.config }}\"\n```\n\n#### JSON 데이터 형식을 반환하는 예제\n\n이 워크플로는 `fromJSON`을 사용하여 환경 변수를 문자열에서 부울 또는 정수로 변환합니다.\n\n```yaml copy\nname: print\non: push\nenv:\n  continue: true\n  time: 3\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    steps:\n      - continue-on-error: ${{ fromJSON(env.continue) }}\n        timeout-minutes: ${{ fromJSON(env.time) }}\n        run: echo ...\n```\n\n워크플로는 `fromJSON()` 함수를 사용하여 `continue` 환경 변수를 문자열에서 부울로 변환하여 오류 발생 시 계속할지 여부를 결정할 수 있습니다. 마찬가지로 `time` 환경 변수를 문자열에서 정수로 변환하여 작업에 대한 시간 제한을 분 단위로 설정합니다.\n\n### hashFiles\n\n`hashFiles(path)`\n\n`path` 패턴과 일치하는 파일 세트에 대한 단일 해시를 반환합니다. 쉼표로 구분된 단일 `path` 패턴 또는 여러 `path` 패턴을 제공할 수 있습니다.\n`path`은 `GITHUB_WORKSPACE` 디렉터리에 상대적이며 `GITHUB_WORKSPACE` 내부의 파일만 포함할 수 있습니다. 이 함수는 일치하는 각 파일에 대한 개별 SHA-256 해시를 계산한 다음 해당 해시를 사용하여 파일 집합에 대한 최종 SHA-256 해시를 계산합니다.\n`path` 패턴이 파일과 일치하지 않으면 빈 문자열을 반환합니다. SHA-256에 대한 자세한 내용은 [SHA-2](https://en.wikipedia.org/wiki/SHA-2)를 참조하세요.\n\n패턴 일치 문자를 사용하여 파일 이름을 일치시킬 수 있습니다.\n`hashFiles`의 패턴 일치는 glob 패턴 일치를 따르며 Windows에서는 대/소문자를 구분하지 않습니다. 지원되는 패턴 일치 문자에 대한 자세한 내용은 [](https://www.npmjs.com/package/@actions/glob#patterns) 설명서에서 `@actions/glob` 섹션을 참조하세요.\n\n#### 단일 패턴을 사용하는 예제\n\n리포지토리의 모든 `package-lock.json` 파일과 일치합니다.\n\n`hashFiles('**/package-lock.json')`\n\n루트 수준의 `.js` 디렉터리에 있는 모든 `src` 파일과 일치하지만 `src`의 모든 하위 디렉터리는 무시합니다.\n\n`hashFiles('/src/*.js')`\n\n루트 수준의 `.rb` 디렉터리에 있는 모든 `lib` 파일과 일치하고 `lib`의 모든 하위 디렉터리가 포함됩니다.\n\n`hashFiles('/lib/**/*.rb')`\n\n#### 여러 패턴이 있는 예제\n\n리포지토리에 있는 모든 `package-lock.json` 및 `Gemfile.lock` 파일에 대한 해시를 만듭니다.\n\n`hashFiles('**/package-lock.json', '**/Gemfile.lock')`\n\n`.rb`의 모든 하위 디렉터리를 포함하지만 `lib` 하위 디렉터리의 `lib` 파일은 제외하여 루트 수준의 `.rb` 디렉터리에 있는 모든 `foo` 파일에 대한 해시를 만듭니다.\n\n`hashFiles('/lib/**/*.rb', '!/lib/foo/*.rb')`\n\n### case\n\n`case( pred1, val1, pred2, val2, ..., default )`\n\n순서대로 조건을 평가하고 `true`로 계산되는 첫 번째 조건에 해당하는 값을 반환합니다. 일치하는 조건자가 없으면 마지막 인수를 기본값으로 반환합니다.\n\n#### 단일 조건자를 사용하는 예제\n\n```yaml\nenv:\n  MY_ENV_VAR: ${{ case(github.ref == 'refs/heads/main', 'production', 'development') }}\n```\n\nref가 `MY_ENV_VAR`일 때 `production`을 `refs/heads/main`으로 설정하고, 그렇지 않으면 `development`으로 설정합니다.\n\n#### 여러 조건자가 있는 예제\n\n```yaml\nenv:\n  MY_ENV_VAR: |-\n    ${{ case(\n      github.ref == 'refs/heads/main', 'production',\n      github.ref == 'refs/heads/staging', 'staging',\n      startsWith(github.ref, 'refs/heads/feature/'), 'development',\n      'unknown'\n    ) }}\n```\n\n브랜치에 따라 `MY_ENV_VAR`를 설정합니다: `production`의 경우 `main`, `staging`의 경우 `staging`, `development`로 시작하는 분기의 경우 `feature/`, 또는 다른 모든 분기의 경우 `unknown`합니다.\n\n## 상태 검사 함수\n\n다음 상태 검사 함수를 `if` 조건의 식으로 사용할 수 있습니다. 이러한 함수 중 하나를 포함하지 않는 한 `success()` 기본 상태 검사가 적용됩니다.\n`if` 조건부에 대한 자세한 내용은 [GitHub Actions에 대한 워크플로 구문](/ko/enterprise-cloud@latest/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idif) 및 [메타데이터 구문 참조](/ko/enterprise-cloud@latest/actions/creating-actions/metadata-syntax-for-github-actions#runsstepsif) 내용을 참조하세요.\n\n`if` 조건문 외부에서 `job.status`를 사용하여 작업 상태에 액세스할 수 있습니다. 자세한 내용은 [문맥 참조](/ko/enterprise-cloud@latest/actions/reference/contexts-reference#job-context)을(를) 참조하세요.\n\n### 성공\n\n이전 단계가 모두 성공한 경우 `true`를 반환합니다.\n\n#### `success`의 예\n\n```yaml\nsteps:\n  ...\n  - name: The job has succeeded\n    if: ${{ success() }}\n```\n\n### 항상\n\n취소된 경우에도 단계가 항상 실행되고 `true`가 반환되도록 합니다.\n`always` 식은 작업이 취소된 경우에도 실행할 것으로 예상되는 단계 수준 또는 작업에서 가장 잘 사용됩니다. 예를 들어 작업이 취소된 경우에도 로그를 보내는 데 `always`를 사용할 수 있습니다.\n\n> \\[!WARNING]\n> 중요한 오류가 발생할 수 있는 작업(예: 원본 가져오기)에는 `always`를 사용하지 않아야 합니다. 그렇지 않으면 시간 초과될 때까지 워크플로가 중단될 수 있습니다. 성공 또는 실패에 관계없이 작업 또는 단계를 실행하려면 권장되는 대안을 사용합니다. `if: ${{ !cancelled() }}`\n\n#### `always`의 예\n\n```yaml\nif: ${{ always() }}\n```\n\n### 취소됨\n\n워크플로가 취소된 경우 `true`를 반환합니다.\n\n#### `cancelled`의 예\n\n```yaml\nif: ${{ cancelled() }}\n```\n\n### 실패\n\n작업의 이전 단계가 실패하면 `true`를 반환합니다. 종속 작업 체인이 있는 경우 상위 작업이 실패하면 `failure()`가 `true`를 반환합니다.\n\n#### `failure`의 예\n\n```yaml\nsteps:\n  ...\n  - name: The job has failed\n    if: ${{ failure() }}\n```\n\n#### 조건이 있는 오류\n\n실패 후 실행할 단계에 대한 추가 조건을 포함할 수 있지만 상태 확인 기능이 포함되지 않은 `failure()` 조건에 자동으로 적용되는 `success()`의 기본 상태 확인을 재정의하려면 `if`를 계속 포함해야 합니다.\n\n##### 조건이 있는 `failure`의 예\n\n```yaml\nsteps:\n  ...\n  - name: Failing step\n    id: demo\n    run: exit 1\n  - name: The demo step has failed\n    if: ${{ failure() && steps.demo.conclusion == 'failure' }}\n```\n\n## 개체 필터\n\n`*` 구문을 사용하여 필터를 적용하고 컬렉션에서 일치하는 항목을 선택할 수 있습니다.\n\n예를 들어 `fruits`라는 개체의 배열을 고려합니다.\n\n```json\n[\n  { \"name\": \"apple\", \"quantity\": 1 },\n  { \"name\": \"orange\", \"quantity\": 2 },\n  { \"name\": \"pear\", \"quantity\": 1 }\n]\n```\n\n`fruits.*.name` 필터는 `[ \"apple\", \"orange\", \"pear\" ]` 배열을 반환합니다.\n\n개체의 `*` 구문을 사용할 수도 있습니다. 예를 들어 `vegetables`라는 개체가 있다고 가정합니다.\n\n```json\n\n{\n  \"scallions\":\n  {\n    \"colors\": [\"green\", \"white\", \"red\"],\n    \"ediblePortions\": [\"roots\", \"stalks\"],\n  },\n  \"beets\":\n  {\n    \"colors\": [\"purple\", \"red\", \"gold\", \"white\", \"pink\"],\n    \"ediblePortions\": [\"roots\", \"stems\", \"leaves\"],\n  },\n  \"artichokes\":\n  {\n    \"colors\": [\"green\", \"purple\", \"red\", \"black\"],\n    \"ediblePortions\": [\"hearts\", \"stems\", \"leaves\"],\n  },\n}\n```\n\n`vegetables.*.ediblePortions` 필터는 다음으로 계산할 수 있습니다.\n\n```json\n\n[\n  [\"roots\", \"stalks\"],\n  [\"hearts\", \"stems\", \"leaves\"],\n  [\"roots\", \"stems\", \"leaves\"],\n]\n```\n\n개체는 순서를 유지하지 않으므로 출력 순서를 보장할 수 없습니다."}