Skip to main content

GitHub Actions Importer를 사용하여 Azure DevOps에서 마이그레이션하기

GitHub Actions Importer을(를) 사용해 GitHub Actions(으)로의 Azure DevOps 파이프라인 마이그레이션을 자동화하는 방법을 알아봅니다.

법적 고지

GitHub Actions Importer를 사용하여 Azure DevOps에서 마이그레이션하기 정보

아래 지침은 GitHub Actions Importer을(를) 사용하여 Azure DevOps 파이프라인을 GitHub Actions(으)로 마이그레이션하도록 환경을 구성하는 방법을 안내합니다.

필수 조건

  • GitHub Actions 워크플로로 변환할 프로젝트 및 파이프라인을 보유한 Azure DevOps 계정 또는 조직.

  • 계정 또는 조직의 Azure DevOps personal access token을(를) 만들 수 있는 액세스 권한.

  • Linux 기반 컨테이너를 실행하고 필요한 도구를 설치할 수 있는 환경입니다.

    참고: GitHub Actions Importer 컨테이너 및 CLI는 CI 플랫폼과 동일한 서버에 설치할 필요가 없습니다.

제한 사항

GitHub Actions Importer을(를) 사용하여 Azure DevOps에서 GitHub Actions(으)로 마이그레이션하는 경우 몇 가지 제한 사항이 있습니다.

  • GitHub Actions Importer에는 Azure DevOps Services 또는 Azure DevOps Server 2019에서 사용할 수 있는 Azure DevOps API 버전 5.0이 필요합니다. 이전 버전의 Azure DevOps Server는 호환되지 않습니다.
  • 소스 코드 검사와 같이 Azure DevOps 파이프라인에 암시적으로 추가되는 작업은 GitHub Actions Importer 감사에 GUID 이름으로 추가될 수 있습니다. GUID에 사용하기 좋은 작업 이름을 찾으려면 이 URL(https://dev.azure.com/:organization/_apis/distributedtask/tasks/:guid)을 사용할 수 있습니다.

수동 작업

특정 Azure DevOps 구문은 Azure DevOps에서 GitHub Actions 구성으로 수동 마이그레이션해야 합니다. 여기에는 다음이 포함됩니다.

  • 조직, 리포지토리 및 환경 비밀
  • OIDC 연결, GitHub Apps, personal access tokens 등의 서비스 연결
  • 알 수 없는 작업
  • 자체 호스팅 에이전트
  • 환경
  • 배포 전 승인

수동 마이그레이션에 대한 자세한 내용은 "Azure Pipelines에서 GitHub Actions로 마이그레이션"을 참조하세요.

지원되지 않는 작업

GitHub Actions Importer은(는) 다음 작업 마이그레이션을 지원하지 않습니다.

  • 배포 전 게이트
  • 배포 후 게이트
  • 배포 후 승인
  • 일부 리소스 트리거

GitHub Actions Importer CLI 확장 프로그램 설치하기

  1. GitHub Actions Importer CLI 확장을 설치합니다.

    Bash
    gh extension install github/gh-actions-importer
    
  2. 다음 확장이 설치되어 있는지 확인:

    $ gh actions-importer -h
    Options:
      -?, -h, --help  Show help and usage information
    
    Commands:
      update     Update to the latest version of GitHub Actions Importer.
      version    Display the version of GitHub Actions Importer.
      configure  Start an interactive prompt to configure credentials used to authenticate with your CI server(s).
      audit      Plan your CI/CD migration by analyzing your current CI/CD footprint.
      forecast   Forecast GitHub Actions usage from historical pipeline utilization.
      dry-run    Convert a pipeline to a GitHub Actions workflow and output its yaml file.
      migrate    Convert a pipeline to a GitHub Actions workflow and open a pull request with the changes.
    

자격 증명 구성하기

configure CLI 명령은 Azure DevOps 및 GitHub(으)로 작업할 때 GitHub Actions Importer에 필요한 자격 증명 및 옵션을 설정하는 데 사용됩니다.

  1. GitHub personal access token (classic)을(를) 만듭니다. 자세한 내용은 "개인용 액세스 토큰 관리"을(를) 참조하세요.

    이 토큰에는 workflow 범위가 있어야 합니다.

    토큰을 만든 후 복사하고 나중에 사용할 수 있도록 안전한 위치에 저장합니다.

  2. Azure DevOps personal access token을(를) 생성합니다. 자세한 내용은 Azure DevOps 설명서의 personal access tokens 사용하기를 참조하세요. 토큰에는 다음 범위가 있어야 합니다.

    • 에이전트 풀: Read
    • 빌드: Read
    • 코드: Read
    • 릴리스: Read
    • 서비스 연결: Read
    • 작업 그룹: Read
    • 변수 그룹: Read

    토큰을 만든 후 복사하고 나중에 사용할 수 있도록 안전한 위치에 저장합니다.

  3. 터미널에서 GitHub Actions Importer configure CLI 명령을 실행합니다.

    gh actions-importer configure
    

    configure 명령을 실행하면 다음 정보를 입력하라는 메시지가 표시됩니다:

    • "어떤 CI 공급자를 구성하고 있나요?"에 대해 화살표 키를 사용하여 Azure DevOps을(를) 선택하고Space을 눌러 선택한 다음Enter를 누릅니다.
    • "Personal access token for GitHub"에 앞서 만든 personal access token (classic)의 값을 입력하고 EnterEnter다.
    • "GitHub 인스턴스의 기본 URL"의 경우 Enter를 눌러 기본값(https://github.com)을 수락합니다.
    • "Azure DevOps용 Personal access token"의 경우, 이전에 만든 Azure DevOps personal access token의 값을 입력하고 Enter 키를 누릅니다.
    • "Azure DevOps 인스턴스의 기본 URL"의 경우, Enter 키를 눌러 기본값(https://dev.azure.com)을 적용합니다.
    • "Azure DevOps 조직 이름"의 경우, Azure DevOps 조직의 이름을 입력하고 Enter 키를 누릅니다.
    • "Azure DevOps 프로젝트 이름"의 경우, Azure DevOps 프로젝트의 이름을 입력하고 Enter 키를 누릅니다.

    configure 명령의 예가 아래에 나와 있습니다:

    $ gh actions-importer configure
    ✔ Which CI providers are you configuring?: Azure DevOps
    Enter the following values (leave empty to omit):
    ✔ Personal access token for GitHub: ***************
    ✔ Base url of the GitHub instance: https://github.com
    ✔ Personal access token for Azure DevOps: ***************
    ✔ Base url of the Azure DevOps instance: https://dev.azure.com
    ✔ Azure DevOps organization name: :organization
    ✔ Azure DevOps project name: :project
    Environment variables successfully updated.
    
  4. 터미널에서 GitHub Actions Importer update CLI 명령을 실행하여 GitHub Packages Container registry에 연결하고, 컨테이너 이미지가 최신 버전으로 업데이트되었는지 확인합니다.

    gh actions-importer update
    

    명령의 출력은 아래와 비슷해야 합니다:

    Updating ghcr.io/actions-importer/cli:latest...
    ghcr.io/actions-importer/cli:latest up-to-date
    

Azure DevOps 감사 수행

audit 명령으로 Azure DevOps 조직의 모든 프로젝트를 개략적으로 볼 수 있습니다.

audit 명령은 다음 단계를 수행합니다:

  1. Azure DevOps 조직에 정의된 모든 프로젝트를 가져옵니다.
  2. 각 파이프라인을 해당하는 GitHub Actions 워크플로로 변환합니다.
  3. GitHub Actions Importer을(를) 사용하여 마이그레이션의 완전하고 복잡한 작업이 가능한 방법을 요약하는 보고서를 생성합니다.

감사 명령 실행

Azure DevOps 조직 감사를 수행하려면 터미널에서 다음 명령을 실행합니다.

gh actions-importer audit azure-devops --output-dir tmp/audit

감사 결과 검사하기

지정된 출력 디렉터리의 파일에는 감사의 결과가 포함됩니다. 감사 결과에 대한 요약은 audit_summary.md 파일을 참조하세요.

감사 요약에는 다음의 섹션이 있습니다.

Pipelines

"파이프라인" 섹션에는 GitHub Actions Importer이(가) 수행한 변환률에 대한 개략적인 통계가 포함되어 있습니다.

아래에 "파이프라인" 섹션에 나타날 수 있는 몇 가지 주요 용어가 나와 있습니다.

  • 성공한 파이프라인에는 파이프라인 구문의 100%가 있고 개별 항목은 해당 GitHub Actions(으)로 자동으로 변환됩니다.
  • 부분적으로 성공한 파이프라인에는 모든 파이프라인 구문이 변환되지만 해당 GitHub Actions으로 자동으로 변환되지 않은 일부 개별 항목이 있습니다.
  • 지원 되지 않는 파이프라인은 GitHub Actions Importer에서 지원되지 않는 정의 형식입니다.
  • 실패한 파이프라인을 변환할 때는 심각한 오류가 발생했다는 의미입니다. 이 현상은 다음의 3가지 이유로 발생할 수 있습니다.
    • 파이프라인이 잘못 구성되었으며 Bamboo에서 유효하지 않습니다.
    • GitHub Actions Importer을(를) 변환할 때 내부 오류가 발생했습니다.
    • 파이프라인에 액세스할 수 없게 되는 실패한 네트워크 응답이 있으며, 이는 종종 잘못된 자격 증명 때문입니다.

빌드 단계

"빌드 단계" 섹션에는 모든 파이프라인에서 사용되는 개별 빌드 단계 및 GitHub Actions Importer에서 자동으로 변환된 개수에 대한 개요가 포함되어 있습니다.

아래 "파이프라인" 섹션에 나타날 수 있는 몇 가지 주요 용어가 나와 있습니다.

  • 알려진 빌드 단계는 해당 동작으로 자동으로 변환된 단계입니다.
  • 알려진 빌드 단계는 해당 동작으로 자동으로 변환되지 않은 단계입니다.
  • 지원되지 않는 빌드 단계는 다음과 같은 단계입니다.
    • GitHub Actions에서 기본적으로 지원되지 않습니다.
    • GitHub Actions과(와) 호환되지 않는 방식으로 구성됩니다.
  • 작업은 변환된 워크플로에서 사용된 작업의 목록입니다. 이 작업은 다음과 같은 경우에 중요할 수 있습니다.
    • GitHub Enterprise Server을(를) 사용하는 경우 인스턴스와 동기화할 작업 목록을 수집합니다.
    • 사용되는 작업의 조직 수준 허용 목록을 정의합니다. 이 작업 목록은 보안 또는 규정 준수 팀에서 검토해야 할 수도 있는 포괄적인 작업 목록입니다.

수동 작업

"수동 작업" 섹션에는 GitHub Actions Importer이(가) 자동으로 완료할 수 없으며 수동으로 완료해야 하는 작업에 대한 개요가 포함되어 있습니다.

아래 "파이프라인" 섹션에 나타날 수 있는 몇 가지 주요 용어가 나와 있습니다.

  • 비밀은 변환된 파이프라인에서 사용되는 리포지토리 또는 조직 수준의 비밀입니다. 이러한 파이프라인이 제대로 작동하려면 GitHub Actions에서 이러한 비밀을 수동으로 만들어야 합니다. 자세한 내용은 "GitHub Actions에서 비밀 사용"을(를) 참조하세요.
  • 자체 호스팅 실행기는 GitHub호스티드 러너가 아닌 변환된 파이프라인에서 참조되는 실행기의 레이블을 나타냅니다. 이러한 파이프라인을 제대로 작동시키려면 이러한 실행기를 수동으로 정의해야 합니다.

Files

감사 보고서의 마지막 섹션에는 감사 중 디스크에 기록된 모든 파일의 매니페스트를 제공합니다.

각 파이프라인 파일에는 다음을 포함하며, 감사에 포함된 다양한 파일이 있습니다.

  • GitHub에 정의된 원래 파이프라인입니다.
  • 파이프라인을 변환하기 위해 사용되는 모든 네트워크 응답입니다.
  • 변환된 워크플로 파일입니다.
  • 실패한 파이프라인 변환 문제를 해결하기 위해 사용할 수 있는 스택 추적입니다.

또한 workflow_usage.csv 파일에는 성공적으로 변환된 각 파이프라인에서 사용되는 모든 작업, 비밀 및 실행기의 쉼표로 구분된 목록이 포함됩니다. 이는 작업, 비밀 또는 실행기를 사용하는 워크플로를 결정하는 데 유용할 수 있으며, 보안 검토를 수행하는 데 유용할 수 있습니다.

잠재적인 GitHub Actions 사용량 예측

forecast 명령으로 Azure DevOps에서 완료된 파이프라인 실행의 메트릭을 계산하여 잠재적인 GitHub Actions 사용량을 예측할 수 있습니다.

예측 명령 실행하기

잠재적인 GitHub Actions 사용량을 예측하려면 터미널에서 다음 명령을 실행합니다. 기본적으로 GitHub Actions Importer은(는) 예측 보고서에 이전 7일을 포함합니다.

gh actions-importer forecast azure-devops --output-dir tmp/forecast_reports

예측 보고서 검사하기

지정된 출력 디렉터리의 forecast_report.md 파일에 예측 결과가 포함되어 있습니다.

다음은 예상 보고서에 표시될 수 있는 몇 가지 주요 용어입니다:

  • 작업 수는 완료된 작업의 총 개수입니다.

  • 파이프라인 수는 사용된 고유 파이프라인의 수입니다.

  • 실행 시간: 은 러너가 작업에 소비한 시간을 나타냅니다. 이 메트릭을 사용하여 GitHub호스티드 실행기의 비용을 계획하는 데 도움이 될 수 있습니다.

    이 메트릭은 GitHub Actions에 지출해야 하는 금액과 상관 관계가 있습니다. 해당 금액은 작업 시간(분) 동안 사용되는 하드웨어에 따라 달라집니다. GitHub Actions 가격 계산기를 사용하여 비용을 추정할 수 있습니다.

  • 큐 시간: 메트릭은 작업이 실행할 수 있는 러너를 기다리는 데 소요되는 시간을 나타냅니다.

  • 동시 작업 메트릭은 특정 시간에 실행 중인 작업의 양을 설명합니다. 이 메트릭은 구성해야 하는 러너 수를 정의하는 데 사용할 수 있습니다.

또한 이러한 메트릭은 Azure DevOps의 각 실행기 큐에 따라 정의됩니다. 이 기능은 호스트형 또는 자체 호스팅형 런너 또는 고사양 또는 저사양 컴퓨터가 혼합되어 있는 경우 특히 유용하므로 다양한 유형의 런너에 특정한 메트릭을 확인할 수 있습니다.

시험 실행 마이그레이션 수행

dry-run 명령을 사용하여 Azure DevOps 파이프라인을 해당 GitHub Actions 워크플로로 변환할 수 있습니다. 드라이런은 지정된 디렉터리에 출력 파일을 만들지만 파이프라인 마이그레이션을 위한 풀 리퀘스트를 열지 않습니다.

GitHub Actions Importer이(가) 알 수 없는 빌드 단계 또는 부분적으로 성공한 파이프라인과 같이 자동으로 변환할 수 없는 항목이 있는 경우 변환 프로세스를 추가로 사용자 지정하는 사용자 지정 변환기를 만들 수 있습니다. 자세한 내용은 "사용자 지정 변환기를 사용하여 GitHub Actions 가져오기 확장"을(를) 참조하세요.

빌드 파이프라인에 대한 드라이 런 명령 실행하기

Azure DevOps 빌드 파이프라인을 GitHub Actions(으)로 마이그레이션하는 드라이 런을 수행하려면 터미널에서 다음 명령을 실행하여 pipeline_id을(를) 변환하려는 파이프라인의 ID로 바꿉니다.

gh actions-importer dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run

지정된 출력 디렉터리에서 드라이런 로그 및 변환된 워크플로 파일을 볼 수 있습니다.

릴리스 파이프라인에 대한 드라이 런 명령 실행하기

Azure DevOps 릴리스 파이프라인을 GitHub Actions(으)로 마이그레이션하는 드라이 런을 수행하려면 터미널에서 다음 명령을 실행하여 pipeline_id을(를) 변환하려는 파이프라인의 ID로 바꿉니다.

gh actions-importer dry-run azure-devops release --pipeline-id :pipeline_id --output-dir tmp/dry-run

지정된 출력 디렉터리에서 드라이런 로그 및 변환된 워크플로 파일을 볼 수 있습니다.

생산 마이그레이션 수행

migrate 명령으로 Azure DevOps 파이프라인을 변환하고 해당하는 GitHub Actions 워크플로를 사용하여 끌어오기 요청을 열 수 있습니다.

빌드 파이프라인에 대한 마이그레이션 명령 실행하기

Azure DevOps 빌드 파이프라인을 GitHub Actions(으)로 마이그레이션하려면 터미널에서 다음 명령을 실행하여 target-url 값을 GitHub Enterprise Cloud 리포지토리의 URL로 바꾸고, pipeline_id을(를) 변환하는 파이프라인의 ID로 바꿉니다.

gh actions-importer migrate azure-devops pipeline --pipeline-id :pipeline_id --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate

명령의 출력에는 변환된 워크플로를 리포지토리에 추가하는 풀 리퀘스트의 URL이 포함됩니다. 성공적인 출력의 예는 다음과 유사합니다:

$ gh actions-importer migrate azure-devops pipeline --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate --azure-devops-project my-azure-devops-project
[2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log'
[2022-08-20 22:08:20] Pull request: 'https://github.com/octo-org/octo-repo/pull/1'

릴리스 파이프라인에 대한 마이그레이션 명령 실행하기

Azure DevOps 릴리스 파이프라인을 GitHub Actions(으)로 마이그레이션하려면 터미널에서 다음 명령을 실행하여 target-url 값을 GitHub Enterprise Cloud 리포지토리의 URL로 바꾸고, pipeline_id을(를) 변환하는 파이프라인의 ID로 바꿉니다.

gh actions-importer migrate azure-devops release --pipeline-id :pipeline_id --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate

명령의 출력에는 변환된 워크플로를 리포지토리에 추가하는 풀 리퀘스트의 URL이 포함됩니다. 성공적인 출력의 예는 다음과 유사합니다:

$ gh actions-importer migrate azure-devops release --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate --azure-devops-project my-azure-devops-project
[2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log'
[2022-08-20 22:08:20] Pull request: 'https://github.com/octo-org/octo-repo/pull/1'

끌어오기 요청 검사하기

migrate 명령의 성공적인 실행의 출력에는 변환된 워크플로를 리포지토리에 추가하는 새 끌어오기 요청에 대한 링크가 포함되어 있습니다.

끌어오기 요청의 몇 가지 중요 요소는 다음과 같습니다.

  • 끌어오기 요청 설명에서 수동으로 완료해야 하는 단계를 나열하는 섹션은 파이프라인을 GitHub Actions로 마이그레이션을 완료할 수 있습니다. 예를 들어, 이 섹션에서는 워크플로에 사용되는 비밀을 만들도록 지시할 수 있습니다.
  • 변환된 워크플로 파일입니다. 끌어오기 요청에서 변경된 파일 탭을 선택하여 GitHub Enterprise Cloud 리포지토리에 추가될 워크플로 파일을 봅니다.

끌어오기 요청 검사를 마치면 병합하여 워크플로를 GitHub Enterprise Cloud 리포지토리에 추가할 수 있습니다.

참조

이 섹션에는 GitHub Actions Importer을(를) 사용하여 Azure DevOps에서 마이그레이션할 때의 환경 변수, 선택형 인수, 지원되는 구문에 대한 참조 정보가 포함되어 있습니다.

구성 환경 변수

GitHub Actions Importer은(는) 인증 구성에 환경 변수를 사용합니다. 이러한 변수는 configure 명령을 사용하여 구성 프로세스를 따르면 설정됩니다. 자세한 정보는 "자격 증명 구성" 섹션을 참조하세요.

GitHub Actions Importer은(는) 다음 환경 변수를 사용하여 Azure DevOps 인스턴스에 연결합니다.

  • GITHUB_ACCESS_TOKEN: 변환된 워크플로(workflow 범위 필요)를 사용하여 끌어오기 요청을 만드는 데 사용되는 personal access token (classic)입니다.
  • GITHUB_INSTANCE_URL: 대상 GitHub 인스턴스의 URL입니다(예: https://github.com).
  • AZURE_DEVOPS_ACCESS_TOKEN: Azure DevOps 인스턴스를 인증하는 데 사용되는 personal access token입니다. 이 토큰에는 다음 범위가 필요합니다.
    • 빌드: Read
    • 에이전트 풀: Read
    • 코드: Read
    • 릴리스: Read
    • 서비스 연결: Read
    • 작업 그룹: Read
    • 변수 그룹: Read
  • AZURE_DEVOPS_PROJECT: 파이프라인을 마이그레이션할 때 사용할 프로젝트 이름 또는 GUID입니다. 모든 프로젝트에 대해 감사를 수행하려는 경우 이는 선택 사항입니다.
  • AZURE_DEVOPS_ORGANIZATION: Azure DevOps 인스턴스스의 조직 이름입니다.
  • AZURE_DEVOPS_INSTANCE_URL: Azure DevOps 인스턴스의 URL(예: https://dev.azure.com)입니다.

이러한 환경 변수는 .env.local 파일에 지정할 수 있으며, 이 파일은 실행 시 GitHub Actions Importer에 의해 로드됩니다.

선택형 인수

GitHub Actions Importer 하위 명령과 함께 사용하여 마이그레이션을 사용자 지정할 수 있는 선택적 인수가 있습니다.

--source-file-path

--source-file-path 인수를 forecast, dry-run 또는 migrate 하위 명령과 함께 사용할 수 있습니다.

기본적으로 GitHub Actions Importer은(는) 소스 제어에서 파이프라인 콘텐츠를 가져옵니다. --source-file-path 인수는 GitHub Actions Importer에 지정된 소스 파일 경로를 대신 사용하도록 지시합니다.

예시:

gh actions-importer dry-run azure-devops pipeline --output-dir ./output/ --source-file-path ./path/to/azure_devops/pipeline.yml

--config-file-path

--config-file-path 인수를 audit, dry-runmigrate 하위 명령과 함께 사용할 수 있습니다.

기본적으로 GitHub Actions Importer은(는) 소스 제어에서 파이프라인 콘텐츠를 가져옵니다. --config-file-path 인수는 GitHub Actions Importer에 지정된 소스 파일을 대신 사용하도록 지시합니다.

--config-file-path 인수를 사용하여 변환되고 재사용 가능한 워크플로 또는 복합 작업을 마이그레이션할 리포지토리를 지정할 수도 있습니다.

감사 예

이 예시에서 GitHub Actions Importer은(는) 지정된 YAML 구성 파일을 소스 파일로 사용하여 감사를 수행합니다.

gh actions-importer audit azure-devops pipeline --output-dir ./output/ --config-file-path ./path/to/azure_devops/config.yml

구성 파일을 사용하여 Azure DevOps 인스턴스를 감사하려면 구성 파일이 다음과 같은 형식이어야 하며, 각 repository_slug 값은 고유해야 합니다.

source_files:
  - repository_slug: azdo-project/1
    path: file.yml
  - repository_slug: azdo-project/2
    paths: path.yml

Azure DevOps 조직 이름, 프로젝트 이름 및 파이프라인 ID를 결합하여 파이프라인에 대해 repository_slug을(를) 생성할 수 있습니다. 예들 들어 my-organization-name/my-project-name/42입니다.

드라이 실행 예

이 예제에서 GitHub Actions Importer는 지정된 YAML 구성 파일을 소스 파일로 사용하여 드라이런을 수행합니다.

파이프라인은 구성 파일의 repository_slug을(를) --azure-devops-organization--azure-devops-project 옵션 값과 일치시켜 선택합니다. 그런 다음 path은 지정된 소스 파일을 가져오는 데 사용됩니다.

gh actions-importer dry-run azure-devops pipeline --output-dir ./output/ --config-file-path ./path/to/azure_devops/config.yml
변환되고 재사용 가능한 워크플로 및 복합 작업의 리포지토리 지정

GitHub Actions Importer은(는) --config-file-path 인수에 제공된 YAML 파일을 사용하여 변환되고 재사용 가능한 워크플로와 복합 작업이 마이그레이션되는 리포지토리를 결정합니다.

시작하려면 --config-file-path 인수 없이 감사를 실행해야 합니다.

gh actions-importer audit azure-devops --output-dir ./output/

이 명령의 출력에는 GitHub Actions Importer에 의해 변환된 모든 재사용 가능한 워크플로 및 복합 작업의 목록을 포함한 config.yml(이)라는 이름의 파일이 포함됩니다. 예를 들어 config.yml 파일에는 다음과 같은 내용이 있을 수 있습니다.

reusable_workflows:
  - name: my-reusable-workflow.yml
    target_url: https://github.com/octo-org/octo-repo
    ref: main

composite_actions:
  - name: my-composite-action.yml
    target_url: https://github.com/octo-org/octo-repo
    ref: main

이 파일을 사용하여 재사용 가능한 워크플로 또는 복합 작업을 추가할 리포지토리 및 참조를 지정할 수 있습니다. 그런 다음 --config-file-path 인수를 사용하여 config.yml 파일을 GitHub Actions Importer에 제공할 수 있습니다. 예를 들어 migrate 명령을 실행할 때 이 파일을 사용하여 구성 파일에 정의된 각 고유 리포지토리에 대한 끌어오기 요청을 열 수 있습니다.

gh actions-importer migrate azure-devops pipeline  --config-file-path config.yml --target-url https://github.com/my-org/my-repo

Azure DevOps 파이프라인에 지원되는 구문

다음 표에는 GitHub Actions Importer가 현재 변환할 수 있는 속성 유형이 나와 있습니다.

Azure PipelinesGitHub Actions상태
condition
  • jobs.<job_id>.if
  • jobs.<job_id>.steps[*].if
지원 여부
container
  • jobs.<job_id>.container
  • jobs.<job_id>.name
지원 여부
continuousIntegration
  • on.<push>.<branches>
  • on.<push>.<tags>
  • on.<push>.paths
지원 여부
작업(job)
  • jobs.<job_id>
지원 여부
pullRequest
  • on.<pull_request>.<branches>
  • on.<pull_request>.paths
지원 여부
stage(단계)
  • jobs
지원 여부
steps
  • jobs.<job_id>.steps
지원 여부
전략
  • jobs.<job_id>.strategy.fail-fast
  • jobs.<job_id>.strategy.max-parallel
  • jobs.<job_id>.strategy.matrix
지원 여부
timeoutInMinutes
  • jobs.<job_id>.timeout-minutes
지원 여부
variables
  • env
  • jobs.<job_id>.env
  • jobs.<job_id>.steps.env
지원 여부
수동 배포
  • jobs.<job_id>.environment
부분적으로 지원됨
  • runners
  • self hosted runners
부분적으로 지원됨
services
  • jobs.<job_id>.services
부분적으로 지원됨
전략
  • jobs.<job_id>.strategy
부분적으로 지원됨
트리거
  • on
부분적으로 지원됨
pullRequest
  • on.<pull_request>.<tags>
지원되지 않음
스케줄
  • on.schedule
  • on.workflow_run
지원되지 않음
트리거
  • on.<event_name>.types
지원되지 않음

지원되는 Azure DevOps 작업에 대한 자세한 내용은 github/gh-actions-importer 리포지토리를 참조하세요.

환경 변수 매핑

GitHub Actions Importer은(는) 아래 표의 매핑을 사용하여 기본 Azure DevOps 환경 변수를 GitHub Actions 내의 가장 가까운 값으로 변환합니다.

Azure PipelinesGitHub Actions
$(Agent.BuildDirectory)${{ runner.workspace }}
$(Agent.HomeDirectory)${{ env.HOME }}
$(Agent.JobName)${{ github.job }}
$(Agent.OS)${{ runner.os }}
$(Agent.ReleaseDirectory)${{ github.workspace}}
$(Agent.RootDirectory)${{ github.workspace }}
$(Agent.ToolsDirectory)${{ runner.tool_cache }}
$(Agent.WorkFolder)${{ github.workspace }}
$(Build.ArtifactStagingDirectory)${{ runner.temp }}
$(Build.BinariesDirectory)${{ github.workspace }}
$(Build.BuildId)${{ github.run_id }}
$(Build.BuildNumber)${{ github.run_number }}
$(Build.DefinitionId)${{ github.workflow }}
$(Build.DefinitionName)${{ github.workflow }}
$(Build.PullRequest.TargetBranch)${{ github.base_ref }}
$(Build.PullRequest.TargetBranch.Name)${{ github.base_ref }}
$(Build.QueuedBy)${{ github.actor }}
$(Build.Reason)${{ github.event_name }}
$(Build.Repository.LocalPath)${{ github.workspace }}
$(Build.Repository.Name)${{ github.repository }}
$(Build.Repository.Provider)GitHub
$(Build.Repository.Uri)${{ github.server.url }}/${{ github.repository }}
$(Build.RequestedFor)${{ github.actor }}
$(Build.SourceBranch)${{ github.ref }}
$(Build.SourceBranchName)${{ github.ref }}
$(Build.SourceVersion)${{ github.sha }}
$(Build.SourcesDirectory)${{ github.workspace }}
$(Build.StagingDirectory)${{ runner.temp }}
$(Pipeline.Workspace)${{ runner.workspace }}
$(Release.DefinitionEnvironmentId)${{ github.job }}
$(Release.DefinitionId)${{ github.workflow }}
$(Release.DefinitionName)${{ github.workflow }}
$(Release.Deployment.RequestedFor)${{ github.actor }}
$(Release.DeploymentID)${{ github.run_id }}
$(Release.EnvironmentId)${{ github.job }}
$(Release.EnvironmentName)${{ github.job }}
$(Release.Reason)${{ github.event_name }}
$(Release.RequestedFor)${{ github.actor }}
$(System.ArtifactsDirectory)${{ github.workspace }}
$(System.DefaultWorkingDirectory)${{ github.workspace }}
$(System.HostType)build
$(System.JobId)${{ github.job }}
$(System.JobName)${{ github.job }}
$(System.PullRequest.PullRequestId)${{ github.event.number }}
$(System.PullRequest.PullRequestNumber)${{ github.event.number }}
$(System.PullRequest.SourceBranch)${{ github.ref }}
$(System.PullRequest.SourceRepositoryUri)${{ github.server.url }}/${{ github.repository }}
$(System.PullRequest.TargetBranch)${{ github.event.base.ref }}
$(System.PullRequest.TargetBranchName)${{ github.event.base.ref }}
$(System.StageAttempt)${{ github.run_number }}
$(System.TeamFoundationCollectionUri)${{ github.server.url }}/${{ github.repository }}
$(System.WorkFolder)${{ github.workspace }}

템플릿

GitHub Actions Importer을(를) 사용하여 Azure DevOps 템플릿을 변환할 수 있습니다.

제한 사항

GitHub Actions Importer은(는) 몇 가지 제한 하에 Azure DevOps 템플릿을 변환할 수 있습니다.

  • stagesdeployments에서 사용되는 Azure DevOps 템플릿과 jobs 키는 GitHub Actions에서 재사용 가능한 워크플로로 변환됩니다. 자세한 내용은 "워크플로 다시 사용"을(를) 참조하세요.
  • steps 키에서 사용되는 Azure DevOps 템플릿은 복합 작업으로 변환됩니다. 자세한 내용은 "복합 작업 만들기"을(를) 참조하세요.
  • 현재 다른 작업 템플릿을 참조하는 작업 템플릿이 있는 경우, GitHub Actions Importer은(는) 템플릿을 재사용 가능한 워크플로로 변환합니다. 재사용 가능한 워크플로는 다른 재사용 가능한 워크플로를 참조할 수 없으므로, 이 구문은 GitHub Actions에서 유효하지 않습니다. 중첩된 재사용 가능한 워크플로는 수동으로 수정해야 합니다.
  • 템플릿이 외부 Azure DevOps 조직 또는 GitHub 리포지토리를 참조하는 경우, 이 템플릿에 액세스하기 위한 자격 증명을 제공하는 --credentials-file 옵션을 사용해야 합니다. 자세한 내용은 "추가 인수 및 설정"을(를) 참조하세요.
  • 다음 주의 사항과 함께 each 식을 사용하여 YAML을 동적으로 생성할 수 있습니다.
    • 중첩된 each 블록은 지원되지 않기 때문에 상위 each 블록도 지원되지 않습니다.
    • each 및 포함된 if 조건은 GitHub Actions이(가) 이 삽입 스타일을 지원하지 않으므로 변환 시 평가됩니다.
    • elseif 블록은 지원되지 않습니다. 이 기능이 필요한 경우 수동으로 수정해야 합니다.
    • 중첩된 if 블록은 지원되지만 if 조건 하에서 중첩된 if/elseif/else 블록은 지원되지 않습니다.
    • 미리 정의된 Azure DevOps 변수를 사용하는 if 블록은 지원되지 않습니다.

지원되는 템플릿

GitHub Actions Importer은(는) 아래 표에 기재된 템플릿을 지원합니다.

Azure PipelinesGitHub Actions상태
템플릿에서 확장하기Reusable workflow지원 여부
작업 템플릿Reusable workflow지원 여부
스테이지 템플릿Reusable workflow지원 여부
단계 템플릿Composite action지원 여부
클래식 편집기 내 작업 그룹상황에 따라 다름지원 여부
다른 Azure DevOps 조직, 프로젝트 또는 리포지토리의 템플릿상황에 따라 다름지원 여부
GitHub 리포지토리의 템플릿상황에 따라 다름지원 여부
변수 템플릿env지원 여부
조건부 삽입작업/단계의 if 조건부분적으로 지원됨
반복적 삽입해당 없음부분적으로 지원됨
매개 변수가 있는 템플릿상황에 따라 다름부분적으로 지원됨

템플릿 파일 경로 이름

GitHub Actions Importer은(는) 파일 이름에 변수, 매개 변수 및 반복 식이 있는 상대 또는 동적 파일 경로가 있는 템플릿을 추출할 수 있습니다. 그러나 기본값 집합이 있어야 합니다.

변수 파일 경로 이름 예시
# File: azure-pipelines.yml
variables:
- template: 'templates/vars.yml'

steps:
- template: "./templates/$"
# File: templates/vars.yml
variables:
  one: 'simple_step.yml'
매개 변수 파일 경로 이름 예시
parameters:
- name: template
  type: string
  default: simple_step.yml

steps:
- template: "./templates/${{ parameters.template }}"
반복 파일 경로 이름 예시
parameters:
- name: steps
  type: object
  default:
  - build_step
  - release_step
steps:
- ${{ each step in parameters.steps }}:
    - template: "$-variables.yml"

템플릿 매개 변수

GitHub Actions Importer은(는) 아래 표에 기재된 매개 변수를 지원합니다.

Azure PipelinesGitHub Actions상태
stringinputs.string지원 여부
numberinputs.number지원 여부
부울 값inputs.boolean지원 여부
개체fromJSON 식이 있는 inputs.string부분적으로 지원됨
stepstep부분적으로 지원됨
stepListstep부분적으로 지원됨
작업(job)job부분적으로 지원됨
jobListjob부분적으로 지원됨
확인job부분적으로 지원됨
deploymentListjob부분적으로 지원됨
stage(단계)job부분적으로 지원됨
stageListjob부분적으로 지원됨

참고: 이 매개 변수 유형을 포함하며 step 키에서 사용되는 템플릿은 템플릿 단계의 시작 또는 끝에서 단계를 사용하는 경우에만 복합 작업으로 직렬화됩니다. 이 매개 변수 유형을 포함하며 stage, deployment, job 키에서 사용되는 템플릿은 재사용 가능한 워크플로로 변환되지 않고 독립 실행형 워크플로로 직렬화됩니다.

부분은 MIT 라이선스에 따라 https://github.com/github/gh-actions-importer/에서 조정되었습니다.

MIT License

Copyright (c) 2022 GitHub

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.